47#include "../include/Parameters.h"
48#include "../include/PoseTraces.h"
49#include "../include/helpersSynthesis.h"
66 parameters.setProjectionFrom(root);
67 parameters.setPositionFrom(root);
68 parameters.setRotationFrom(root);
69 parameters.setDepthRangeFrom(root);
70 parameters.setHasInvalidDepth(root);
71 parameters.setResolutionFrom(root);
72 parameters.setBitDepthColorFrom(root);
73 parameters.setBitDepthDepthFrom(root);
74 parameters.setColorFormatFrom(root);
75 parameters.setDepthColorFormatFrom(root);
76 parameters.setHorRangeFrom(root);
77 parameters.setVerRangeFrom(root);
78 parameters.setCropRegionFrom(root);
79 parameters.setFocalFrom(root);
80 parameters.setPrinciplePointFrom(root);
81 Parameters::validateUnused(root);
91 std::string
const& Parameters::getProjectionType()
const
93 return m_projectionType;
96 cv::Vec3f Parameters::getRotation()
const
101 void Parameters::setRotation(cv::Vec3f rotation)
103 m_rotation = rotation;
106 cv::Matx33f Parameters::getRotationMatrix()
const
108 auto const radperdeg = 0.01745329252f;
109 return EulerAnglesToRotationMatrix(radperdeg * m_rotation);
113 cv::Vec3f Parameters::getPosition()
const
118 void Parameters::setPosition(cv::Vec3f position)
120 m_position = position;
123 cv::Vec2f Parameters::getDepthRange()
const
128 bool Parameters::hasInvalidDepth()
const
130 return m_hasInvalidDepth;
133 cv::Size Parameters::getPaddedSize()
const
138 cv::Size Parameters::getSize()
const
140 return m_cropRegion.size();
143 cv::Rect Parameters::getCropRegion()
const
148 int Parameters::getColorBitDepth()
const
150 return m_bitDepthColor;
153 int Parameters::getDepthBitDepth()
const
155 return m_bitDepthDepth;
158 ColorFormat Parameters::getColorFormat()
const
160 return m_colorFormat;
163 ColorFormat Parameters::getDepthColorFormat()
const
165 return m_depthColorFormat;
168 cv::Vec2f Parameters::getHorRange()
const
170 assert(m_projectionType == ProjectionType::equirectangular);
174 cv::Vec2f Parameters::getVerRange()
const
176 assert(m_projectionType == ProjectionType::equirectangular);
180 bool Parameters::isFullHorRange()
const
182 return m_isFullHorRange;
185 cv::Vec2f Parameters::getFocal()
const
187 assert(m_projectionType == ProjectionType::perspective);
191 cv::Vec2f Parameters::getPrinciplePoint()
const
193 assert(m_projectionType == ProjectionType::perspective);
194 return m_principlePoint - cv::Vec2f(cv::Point2f(m_cropRegion.tl()));
197 void Parameters::printTo(std::ostream& stream)
const
199 stream << m_resolution <<
' ' << m_bitDepthColor <<
"b " << m_bitDepthDepth <<
"b " << m_depthRange;
200 if (m_cropRegion != cv::Rect(cv::Point(), m_resolution)) {
201 stream << m_cropRegion;
203 stream <<
' ' << m_projectionType <<
' ';
204 if (m_projectionType == ProjectionType::equirectangular) {
205 stream << m_horRange <<
' ' << m_verRange;
207 if (m_projectionType == ProjectionType::perspective) {
208 stream << m_focal <<
' ' << m_principlePoint;
210 stream <<
' ' << m_position <<
' ' << m_rotation;
213 void Parameters::setProjectionFrom(
json::Node root)
218 void Parameters::validateUnused(
json::Node root)
221 throw std::runtime_error(
"This version of RVS only supports Depthmap 1");
231 template<
int N> cv::Vec<float, N> asFloatVec(
json::Node node)
233 if (node.
size() != N) {
234 throw std::runtime_error(
"JSON parser: Expected a vector of floats");
237 for (
int i = 0; i != N; ++i) {
243 template<
int N> cv::Vec<int, N> asIntVec(
json::Node node)
245 if (node.
size() != N) {
246 throw std::runtime_error(
"JSON parser: Expected a vector of floats");
249 for (
int i = 0; i != N; ++i) {
256 void Parameters::setPositionFrom(
json::Node root)
258 m_position = asFloatVec<3>(root.
require(
"Position"));
261 void Parameters::setRotationFrom(
json::Node root)
263 m_rotation = asFloatVec<3>(root.
require(
"Rotation"));
266 void Parameters::setDepthRangeFrom(
json::Node root)
268 m_depthRange = asFloatVec<2>(root.
require(
"Depth_range"));
269 if (!(m_depthRange[0] < m_depthRange[1])) {
270 throw std::runtime_error(
"Inverted depth range: [near, far] with near > far is not allowed");
272 if (m_depthRange[1] > 1000.f) {
273 throw std::runtime_error(
"Invalid depth range: [near, far] with far > 1000 is not allowed because 1000 stands for infinity. Please restrict depth range or change world units.");
277 void Parameters::setHasInvalidDepth(
json::Node root)
280 m_hasInvalidDepth =
true;
282 auto node = root.
optional(
"HasInvalidDepth");
284 m_hasInvalidDepth = node.
asBool();
288 void Parameters::setResolutionFrom(
json::Node root)
290 m_resolution = cv::Size(asIntVec<2>(root.
require(
"Resolution")));
293 void Parameters::setBitDepthColorFrom(
json::Node root)
295 m_bitDepthColor = root.
require(
"BitDepthColor").
asInt();
298 void Parameters::setBitDepthDepthFrom(
json::Node root)
300 m_bitDepthDepth = root.
require(
"BitDepthDepth").
asInt();
303 void Parameters::setColorFormatFrom(
json::Node root)
307 if (colorFormat ==
"YUV420") {
308 m_colorFormat = ColorFormat::YUV420;
311 throw std::runtime_error(
"This version of RVS only supports YUV420 color space for texture");
314 void Parameters::setDepthColorFormatFrom(
json::Node root)
318 if (depthColorFormat ==
"YUV420") {
319 m_depthColorFormat = ColorFormat::YUV420;
321 else if (depthColorFormat ==
"YUV400") {
322 m_depthColorFormat = ColorFormat::YUV400;
325 throw std::runtime_error(
"This version of RVS only supports YUV420 and YUV400 color space for depth");
328 void Parameters::setHorRangeFrom(
json::Node root)
330 if (m_projectionType == ProjectionType::equirectangular) {
331 m_horRange = asFloatVec<2>(root.
require(
"Hor_range"));
333 m_isFullHorRange =
false;
335 m_isFullHorRange = asIntVec<2>(root.
require(
"Hor_range")) == cv::Vec2i(-180, 180);
337 catch (std::runtime_error&) {}
341 void Parameters::setVerRangeFrom(
json::Node root)
343 if (m_projectionType == ProjectionType::equirectangular) {
344 m_verRange = asFloatVec<2>(root.
require(
"Ver_range"));
348 void Parameters::setCropRegionFrom(
json::Node root)
350 auto node = root.
optional(
"Crop_region");
352 auto values = asIntVec<4>(node);
353 m_cropRegion = cv::Rect(values[0], values[1], values[2], values[3]);
356 m_cropRegion = cv::Rect(cv::Point(), m_resolution);
360 void Parameters::setFocalFrom(
json::Node root)
362 if (m_projectionType == ProjectionType::perspective) {
363 m_focal = asFloatVec<2>(root.
require(
"Focal"));
367 void Parameters::setPrinciplePointFrom(
json::Node root)
369 if (m_projectionType == ProjectionType::perspective) {
370 m_principlePoint = asFloatVec<2>(root.
require(
"Principle_point"));
374 void Parameters::setNewResolution(
int w,
int h){
375 auto oldRes = cv::Size(m_resolution);
376 m_resolution = cv::Size(w,h);
377 m_cropRegion = cv::Rect(cv::Point(), m_resolution);
378 float factorW = float(w)/float(oldRes.width);
379 float factorH = float(h)/float(oldRes.height);
380 m_principlePoint[0] *= factorW;
381 m_principlePoint[1] *= factorH;
382 auto factor = std::min(factorW,factorH);
383 m_focal[0] *= factor;
384 m_focal[1] *= factor;
388 void Parameters::setFov(cv::Vec4f & fov) {
390 auto range = m_depthRange[0] * m_depthRange[1];
391 auto rangeOffset = m_depthRange[0] - m_depthRange[1];
393 auto tl = std::tan(fov[0]);
394 auto tr = std::tan(fov[1]);
395 auto tt = std::tan(fov[2]);
396 auto tb = std::tan(fov[3]);
401 auto x0 = (-tl) / tw;
402 auto y0 = (-tb) / th;
404 m_focal[0] = m_resolution.width / tw;
405 m_focal[1] = m_resolution.height / th;
408 m_principlePoint[0] = x0 * m_resolution.width;
409 m_principlePoint[1] = (1-y0) * m_resolution.height;
Node optional(std::string const &key) const
std::string const & asString() const
Node require(std::string const &key) const
Node at(std::size_t index) const