licornea_tools
kinect_reprojection.cc
Go to the documentation of this file.
1 #include "kinect_reprojection.h"
2 #include "common.h"
3 
4 
5 namespace tlz {
6 
8  reprojection_parameters_(reproj) { }
9 
10 
12  const std::vector<vec2> distorted_ir_i_xy_points,
13  const std::vector<real>& ir_z_points,
14  std::vector<real>& out_color_z_points,
15  bool distort_color
16 ) const {
17  std::size_t n = distorted_ir_i_xy_points.size();
18  assert(ir_z_points.size() == n);
19 
20  assert(out_color_z_point.size() == n);
21  if(n == 0) return {};
22 
23  // undistort XY coordinates of ir points
24  std::vector<vec2> undistorted_ir_i_xy_points(n);
25  cv::undistortPoints(
26  distorted_ir_i_xy_points,
27  undistorted_ir_i_xy_points,
28  reprojection_parameters_.ir_intrinsics.K,
29  reprojection_parameters_.ir_intrinsics.distortion.cv_coeffs(),
30  cv::noArray(),
31  reprojection_parameters_.ir_intrinsics.K
32  );
33 
34  // backproject to ir view space
35  std::vector<vec3> color_v_points(n);
36  #pragma omp parallel for
37  for(int idx = 0; idx < n; ++idx) {
38  const vec2& undistorted_ir_i_xy = undistorted_ir_i_xy_points[idx];
39  const real& ir_z = ir_z_points[idx];
40  real& color_z = out_color_z_points[idx];
41  vec3& color_v = color_v_points[idx];
42 
43  if(ir_z == 0.0) {
44  color_z = 0.0;
45  color_v = vec3(0.0, 0.0, 0.0);
46  continue;
47  }
48 
49  // apply depth offset of IR depths
50  real ir_z_offset = reprojection_parameters_.ir_depth_offset(undistorted_ir_i_xy);
51  real corrected_ir_z = ir_z - ir_z_offset;
52 
53  vec3 undistorted_ir_i_h(undistorted_ir_i_xy[0], undistorted_ir_i_xy[1], 1.0);
54  undistorted_ir_i_h *= corrected_ir_z;
55 
56  vec3 ir_v = reprojection_parameters_.ir_intrinsics.K_inv * undistorted_ir_i_h;
57  color_v = reprojection_parameters_.rotation.t() * (ir_v - reprojection_parameters_.translation);
58  color_z = color_v[2];
59  }
60 
61  std::vector<vec2> out_color_i_xy_points(n);
62 
63  if(reprojection_parameters_.color_depth_offset) {
64 
65  // project points, without distortion
66  cv::projectPoints(
67  color_v_points,
68  vec3::zeros(),
69  vec3::zeros(),
70  reprojection_parameters_.color_intrinsics.K,
71  cv::noArray(),
72  out_color_i_xy_points
73  );
74 
75  // apply depth offset to output color depths
76  #pragma omp parallel for
77  for(int idx = 0; idx < n; ++idx) {
78  real& color_z = out_color_z_points[idx];
79  const vec2& color_xy = out_color_i_xy_points[idx];
80  real color_z_offset = reprojection_parameters_.color_depth_offset(color_xy);
81  color_z -= color_z_offset;
82  }
83 
84  // now apply distortion (if any)
85  if(distort_color && !reprojection_parameters_.color_intrinsics.distortion.is_none())
86  out_color_i_xy_points = distort_points(reprojection_parameters_.color_intrinsics, out_color_i_xy_points);
87 
88  } else {
89 
90  // project and distort XY coordinates of color points
91  cv::projectPoints(
92  color_v_points,
93  vec3::zeros(),
94  vec3::zeros(),
95  reprojection_parameters_.color_intrinsics.K,
96  (distort_color ? reprojection_parameters_.color_intrinsics.distortion.cv_coeffs() : cv::noArray()),
97  out_color_i_xy_points
98  );
99 
100  }
101 
102  return out_color_i_xy_points;
103 }
104 
105 
106 /*
107 vec3 kinect_reprojection::backproject_depth(vec2 undistorted, real z) const {
108  const auto& ir_par = intrinsics_.ir;
109  real x = ((undistorted[0] + 0.5f - ir_par.cx) / ir_par.fx) * z;
110  real y = ((undistorted[1] + 0.5f - ir_par.cy) / ir_par.fy) * z;
111  return vec3(x, y, z);
112 }
113 */
114 
115 
116 }
117 
118 
std::vector< vec2 > distort_points(const intrinsics &intr, const std::vector< vec2 > &undistorted)
Definition: intrinsics.cc:106
cv::Vec< real, 2 > vec2
Definition: common.h:22
std::vector< vec2 > reproject_points_ir_to_color(const std::vector< vec2 > distorted_ir_i_xy, const std::vector< real > &ir_z, std::vector< real > &out_color_z, bool distort_color=true) const
kinect_reprojection(const kinect_reprojection_parameters &)
distortion_parameters distortion
Definition: intrinsics.h:30
double real
Definition: common.h:16
cv::Vec< real, 3 > vec3
Definition: common.h:23
std::vector< real > cv_coeffs() const
Definition: intrinsics.h:17