licornea_tools
ir_distortion_viewer.cc
Go to the documentation of this file.
1 #include "../lib/args.h"
2 #include "../lib/intrinsics.h"
3 #include "../lib/viewer.h"
4 #include "../lib/json.h"
5 #include "lib/live/grabber.h"
7 #include <iostream>
8 #include <cstdlib>
9 
10 using namespace tlz;
11 
12 
13 int main(int argc, const char* argv[]) {
14  get_args(argc, argv, "ir_intrinsics.json/internal ir/depth");
15  std::string ir_intrinsics_filename = string_arg();
16  std::string mode = enum_arg({ "ir", "depth" });
17 
18  bool show_depth = (mode == "depth");
19 
20  grabber grab(show_depth ? grabber::depth : grabber::ir);
21 
22  viewer view(512+512, 20+424);
23  int max_possible_val = (show_depth ? 6000 : 0xffff);
24  int min_possible_val = 0;
25  auto& min_val = view.add_int_slider((show_depth ? "depth min" : "ir min"), 0, min_possible_val, max_possible_val);
26  auto& max_val = view.add_int_slider((show_depth ? "depth max" : "ir max"), max_possible_val, min_possible_val, max_possible_val);
27  auto& offset = view.add_int_slider("cell width", 20, 3, 100);
28 
29  mat33 camera_mat;
30  std::vector<real> distortion_coeffs;
31  if(ir_intrinsics_filename == "internal") {
32  const auto& par = grab.internal_parameters().ir;
33  camera_mat = mat33(
34  par.fx, 0.0, par.cx,
35  0.0, par.fy, par.cy,
36  0.0, 0.0, 1.0
37  );
38  distortion_coeffs = { par.k1, par.k2, par.p1, par.p2, par.k3 };
39  } else {
40  intrinsics ir_intr = decode_intrinsics(import_json_file(ir_intrinsics_filename));
41  camera_mat = ir_intr.K;
42  distortion_coeffs = ir_intr.distortion.cv_coeffs();
43  }
44 
45 
46  do {
47  grab.grab();
48  view.clear();
49 
50  cv::Mat_<cv::Vec3b> raw_img, undistorted_img;
51  if(show_depth) {
52  cv::Mat_<uchar> viz_depth = view.visualize_depth(grab.get_depth_frame(false), min_val.value(), max_val.value());
53  cv::cvtColor(viz_depth, raw_img, CV_GRAY2BGR);
54  } else {
55  cv::cvtColor(grab.get_ir_frame(min_val.value(), max_val.value(), false), raw_img, CV_GRAY2BGR);
56  }
57 
58 
59  grab.release();
60 
61  cv::undistort(raw_img, undistorted_img, camera_mat, distortion_coeffs, camera_mat);
62 
63  if(offset.value() > 3) {
64  int off = offset.value();
65  std::vector<cv::Point2f> raw_pts, undistorted_pts;
66  for(int x = 512/2; x >= 0; x -= off) {
67  for(int y = 424/2; y >= 0; y -= off) raw_pts.emplace_back(x, y);
68  for(int y = 424/2; y < 424; y += off) raw_pts.emplace_back(x, y);
69  }
70  for(int x = 512/2; x < 512; x += off) {
71  for(int y = 424/2; y >= 0; y -= off) raw_pts.emplace_back(x, y);
72  for(int y = 424/2; y < 424; y += off) raw_pts.emplace_back(x, y);
73  }
74 
75  cv::undistortPoints(raw_pts, undistorted_pts, camera_mat, distortion_coeffs, cv::noArray(), camera_mat);
76 
77  cv::Vec3b raw_point_color(255, 200, 200);
78  cv::Vec3b undistorted_point_color(200, 200, 255);
79  for(const cv::Point2f& pt : raw_pts) cv::circle(raw_img, pt, 4, cv::Scalar(raw_point_color), 2);
80  for(const cv::Point2f& pt : undistorted_pts) cv::circle(undistorted_img, pt, 4, cv::Scalar(undistorted_point_color), 2);
81  }
82 
83  view.draw_text(cv::Rect(0, 0, 512, 20), "raw", viewer::center);
84  view.draw(cv::Rect(0, 20, 512, 424), raw_img);
85 
86  view.draw_text(cv::Rect(512, 0, 512, 20), "undistorted", viewer::center);
87  view.draw(cv::Rect(512, 20, 512, 424), undistorted_img);
88  } while(view.show());
89 }
cv::Mat_< uchar > get_ir_frame(float min_ir=0, float max_ir=0xffff, bool undistorted=false)
static cv::Mat_< uchar > visualize_depth(const cv::Mat &, float min_d, float max_d)
Definition: viewer.cc:95
void draw(const cv::Mat_< cv::Vec3b > &, real blend=1.0)
Definition: viewer.cc:119
kinect_internal_parameters internal_parameters()
std::string enum_arg(const std::vector< std::string > &options)
Definition: args.cc:154
int main(int argc, const char *argv[])
cv::Mat_< float > get_depth_frame(bool undistorted=false)
bool show(int &keycode)
Definition: viewer.cc:218
struct tlz::kinect_internal_parameters::@1 ir
distortion_parameters distortion
Definition: intrinsics.h:30
cv::Matx< real, 3, 3 > mat33
Definition: common.h:26
std::string string_arg()
Definition: args.cc:94
feature_points undistort(const feature_points &dist_fpoints, const intrinsics &intr)
void release()
std::vector< real > cv_coeffs() const
Definition: intrinsics.h:17
std::string mode
void draw_text(cv::Rect rect, const std::string &text, text_alignment=left)
Definition: viewer.cc:182
intrinsics decode_intrinsics(const json &j_intr)
Definition: intrinsics.cc:6
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
void clear(int width, int height)
Definition: viewer.cc:76
json import_json_file(const std::string &filename)
Definition: json.cc:24
void get_args(int argc, const char *argv[], const std::string &usage)
Definition: args.cc:49