licornea_tools
ir_intrinsic_reprojection.cc
Go to the documentation of this file.
1 #include "../lib/common.h"
2 #include "../lib/args.h"
3 #include "../lib/opencv.h"
4 #include "../lib/intrinsics.h"
5 #include "../lib/misc.h"
6 #include "../lib/obj_img_correspondence.h"
7 #include "../lib/viewer.h"
8 #include "lib/live/grabber.h"
10 #include <string>
11 #include <cassert>
12 #include <fstream>
13 
14 using namespace tlz;
15 
16 const cv::Vec3b orig_color(0, 0, 255);
17 const cv::Vec3b reproj_color(0, 0, 255);
18 
19 
20 int main(int argc, const char* argv[]) {
21  get_args(argc, argv, "cols rows square_width ir_intr.json");
22  int cols = int_arg();
23  int rows = int_arg();
25  intrinsics ir_intr = intrinsics_arg();
26 
27  grabber grab(grabber::ir);
28 
29  viewer view(2*512, 2*424+30, true);
30  auto& min_ir = view.add_int_slider("ir min", 0, 0x0000, 0xffff);
31  auto& max_ir = view.add_int_slider("ir max", 0xffff, 0x0000, 0xffff);
32  auto& exaggeration = view.add_int_slider("exaggeration (%)", 100, 100, 1000);
33 
34  do {
35  grab.grab();
36  view.clear();
37 
38  cv::Mat_<uchar> ir = grab.get_ir_frame(min_ir.value(), max_ir.value());
39 
40  cv::Mat_<cv::Vec3b> large_ir;
41  {
42  cv::Mat_<uchar> large_ir_;
43  cv::resize(ir, large_ir_, cv::Size(2*512, 2*424), cv::INTER_NEAREST);
44  cv::cvtColor(large_ir_, large_ir, CV_GRAY2BGR);
45  }
46 
47  checkerboard ir_chk = detect_ir_checkerboard(ir, cols, rows, square_width);
48 
49  std::vector<vec2> image_points = checkerboard_image_corners(ir_chk);
50  std::vector<vec3> object_points = checkerboard_world_corners(cols, rows, square_width);
51 
52  real reprojection_error = NAN;
53 
54  if(ir_chk) {
55  // calculate extrinsic, and reproject
56  vec3 rotation_vec, translation;
57  mat33 rotation;
58  cv::solvePnP(
59  object_points,
60  image_points,
61  ir_intr.K,
62  ir_intr.distortion.cv_coeffs(),
63  rotation_vec,
64  translation,
65  false
66  );
67 
68  std::vector<vec2> reprojected_image_points;
69  cv::projectPoints(
70  object_points,
71  rotation_vec,
72  translation,
73  ir_intr.K,
74  ir_intr.distortion.cv_coeffs(),
75  reprojected_image_points
76  );
77 
78 
79  // calculate distances between original and reprojected point
80  reprojection_error = 0.0;
81  for(int idx = 0; idx < rows*cols; ++idx) {
82  const vec2& i_orig = image_points[idx];
83  const vec2& i_reproj = reprojected_image_points[idx];
84 
85  vec2 diff = i_reproj - i_orig;
86  reprojection_error += sq(diff[0]) + sq(diff[1]);
87 
88  vec2 viz_diff = (exaggeration.value()/100.0)*diff;
89  vec2 viz_i_reproj = i_orig + viz_diff;
90 
91  cv::circle(large_ir, cv::Point(2*i_orig[0], 2*i_orig[1]), 7, cv::Scalar(orig_color), 1);
92  cv::circle(large_ir, cv::Point(2*viz_i_reproj[0], 2*viz_i_reproj[1]), 3, cv::Scalar(reproj_color), -1);
93  }
94  reprojection_error /= rows*cols;
95  reprojection_error = std::sqrt(reprojection_error);
96  }
97 
98  view.draw(cv::Rect(0, 0, 2*512, 2*424), large_ir);
99  view.draw_text(cv::Rect(0, 2*424, 2*512, 30), "rms reprojection error: " + std::to_string(reprojection_error) + " pixel", viewer::center);
100  grab.release();
101 
102  } while(view.show());
103 }
104 
Numeric sq(Numeric n)
Compute square of a number.
Definition: misc.h:17
cv::Mat_< uchar > get_ir_frame(float min_ir=0, float max_ir=0xffff, bool undistorted=false)
std::vector< vec2 > checkerboard_image_corners(const checkerboard &chk)
int rows
void draw(const cv::Mat_< cv::Vec3b > &, real blend=1.0)
Definition: viewer.cc:119
cv::Vec< real, 2 > vec2
Definition: common.h:22
bool show(int &keycode)
Definition: viewer.cc:218
intrinsics intrinsics_arg()
Definition: intrinsics.cc:119
distortion_parameters distortion
Definition: intrinsics.h:30
cv::Matx< real, 3, 3 > mat33
Definition: common.h:26
double real
Definition: common.h:16
int main(int argc, const char *argv[])
long int_arg()
Definition: args.cc:138
cv::Vec< real, 3 > vec3
Definition: common.h:23
double real_arg()
Definition: args.cc:146
real square_width
std::vector< vec3 > checkerboard_world_corners(int cols, int rows, real square_width)
int cols
std::string to_string(const T &)
void release()
std::vector< real > cv_coeffs() const
Definition: intrinsics.h:17
void draw_text(cv::Rect rect, const std::string &text, text_alignment=left)
Definition: viewer.cc:182
const cv::Vec3b reproj_color(0, 0, 255)
const cv::Vec3b orig_color(0, 0, 255)
int_slider & add_int_slider(const std::string &caption, int default_val, int min_val, int max_val, int step=1)
Definition: viewer.cc:263
checkerboard detect_ir_checkerboard(cv::Mat_< uchar > &img, int cols, int rows, real square_width)
Definition: checkerboard.cc:62
void clear(int width, int height)
Definition: viewer.cc:76
void get_args(int argc, const char *argv[], const std::string &usage)
Definition: args.cc:49