licornea_tools
kinect_remapping.cc
Go to the documentation of this file.
1 #include "kinect_remapping.h"
2 #include "common.h"
3 #include "../../lib/opencv.h"
4 
5 namespace tlz {
6 
7 namespace {
8  const real depth_q = 0.01;
9  const real color_q = 0.002199;
10 }
11 
13  internal_parameters_(internal) { }
14 
15 
17  const auto& ir_par = internal_parameters_.ir;
18  real dx = (undistorted[0] - ir_par.cx) / ir_par.fx;
19  real dy = (undistorted[1] - ir_par.cy) / ir_par.fy;
20  real dx2 = dx * dx;
21  real dy2 = dy * dy;
22  real r2 = dx2 + dy2;
23  real dxdy2 = 2 * dx * dy;
24  real kr = 1 + ((ir_par.k3 * r2 + ir_par.k2) * r2 + ir_par.k1) * r2;
25  real out_x = ir_par.fx * (dx * kr + ir_par.p2 * (r2 + 2 * dx2) + ir_par.p1 * dxdy2) + ir_par.cx;
26  real out_y = ir_par.fy * (dy * kr + ir_par.p1 * (r2 + 2 * dy2) + ir_par.p2 * dxdy2) + ir_par.cy;
27  return vec2(out_x, out_y);
28 }
29 
30 
31 vec2 kinect_remapping::undistort_ir(vec2 distorted_coord) const {
32  const auto& ir_par = internal_parameters_.ir;
33  mat33 camera_mat(
34  ir_par.fx, 0.0, ir_par.cx,
35  0.0, ir_par.fy, ir_par.cy,
36  0.0, 0.0, 1.0
37  );
38  std::vector<real> distortion { ir_par.k1, ir_par.k2, ir_par.p1, ir_par.p2, ir_par.k3 };
39  std::vector<vec2> distorted { distorted_coord };
40  std::vector<vec2> undistorted;
41  cv::undistortPoints(distorted, undistorted, camera_mat, distortion, cv::noArray(), camera_mat);
42  return undistorted.front();
43 }
44 
45 
47  const auto& ir_par = internal_parameters_.ir;
48  const auto& color_par = internal_parameters_.color;
49  real mx = undistorted[0], my = undistorted[1];
50 
51  mx = (mx - ir_par.cx) * depth_q;
52  my = (my - ir_par.cy) * depth_q;
53 
54  real wx =
55  (mx * mx * mx * color_par.mx_x3y0) + (my * my * my * color_par.mx_x0y3) +
56  (mx * mx * my * color_par.mx_x2y1) + (my * my * mx * color_par.mx_x1y2) +
57  (mx * mx * color_par.mx_x2y0) + (my * my * color_par.mx_x0y2) + (mx * my * color_par.mx_x1y1) +
58  (mx * color_par.mx_x1y0) + (my * color_par.mx_x0y1) + (color_par.mx_x0y0);
59 
60  real wy =
61  (mx * mx * mx * color_par.my_x3y0) + (my * my * my * color_par.my_x0y3) +
62  (mx * mx * my * color_par.my_x2y1) + (my * my * mx * color_par.my_x1y2) +
63  (mx * mx * color_par.my_x2y0) + (my * my * color_par.my_x0y2) + (mx * my * color_par.my_x1y1) +
64  (mx * color_par.my_x1y0) + (my * color_par.my_x0y1) + (color_par.my_x0y0);
65 
66  real rx = (wx / (color_par.fx * color_q)) - (color_par.shift_m / color_par.shift_d);
67  real ry = (wy / color_q) + color_par.cy;
68  real cx = (rx + (color_par.shift_m / z)) * color_par.fx + color_par.cx;
69  return vec2(cx, ry);
70 }
71 
72 }
cv::Vec< real, 2 > vec2
Definition: common.h:22
vec2 undistort_ir(vec2 distorted) const
vec2 map_ir_to_color(vec2 undistorted_ir, real ir_z) const
struct tlz::kinect_internal_parameters::@1 ir
cv::Matx< real, 3, 3 > mat33
Definition: common.h:26
double real
Definition: common.h:16
kinect_remapping(const kinect_internal_parameters &)
struct tlz::kinect_internal_parameters::@0 color
vec2 distort_ir(vec2 undistorted) const
kinect_internal_parameters internal_parameters_