licornea_tools
checkerboard_depth_viewer.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 int main(int argc, const char* argv[]) {
17  get_args(argc, argv, "cols rows square_width ir_intr.json");
18  int cols = int_arg();
19  int rows = int_arg();
21  intrinsics ir_intr = intrinsics_arg();
22 
24 
25  viewer view(512+512, 424+2*30);
26  auto& min_ir = view.add_int_slider("ir min", 0, 0x0000, 0xffff);
27  auto& max_ir = view.add_int_slider("ir max", 0xffff, 0x0000, 0xffff);
28  auto& min_d = view.add_int_slider("depth min ", 0, 0, 20000);
29  auto& max_d = view.add_int_slider("depth max", 6000, 0, 20000);
30  auto& granularity = view.add_int_slider("granularity", 2, 1, 30);
31 
32  std::cout << "running viewer... (esc to end)" << std::endl;
33  bool running = true;
34  while(running) {
35  grab.grab();
36  view.clear();
37 
38  cv::Mat_<float> depth = grab.get_depth_frame();
39  cv::Mat_<uchar> ir = grab.get_ir_frame(min_ir.value(), max_ir.value());
40 
41  checkerboard ir_chk = detect_ir_checkerboard(ir, cols, rows, square_width);
42 
43  real avg_calculated_depth = NAN, avg_measured_depth = NAN;
44  real rms_depth_error = NAN, reprojection_error = NAN;
45  int count = 0;
46 
47  std::vector<checkerboard_pixel_depth_sample> pixel_depths;
48  if(ir_chk && granularity.value() > 0) {
49  pixel_depths = checkerboard_pixel_depth_samples(ir_chk, depth, granularity.value());
51  calculate_checkerboard_pixel_depths(ir_intr, ext, pixel_depths);
52  count = pixel_depths.size();
53 
54  avg_calculated_depth = 0.0, avg_measured_depth = 0.0; rms_depth_error = 0.0;
55  for(const auto& samp : pixel_depths) {
56  real err = samp.calculated_depth - samp.measured_depth;
57  if(std::abs(err) > 80) { count--; continue; }
58  rms_depth_error += sq(err);
59  avg_calculated_depth += samp.calculated_depth;
60  avg_measured_depth += samp.measured_depth;
61  }
62  rms_depth_error /= count;
63  rms_depth_error = std::sqrt(rms_depth_error);
64  avg_calculated_depth /= count;
65  avg_measured_depth /= count;
66  }
67 
68  view.draw(cv::Rect(0, 0, 512, 424), visualize_checkerboard(ir, ir_chk));
69  view.draw(cv::Rect(512, 0, 512, 424), visualize_checkerboard_pixel_samples(view.visualize_depth(depth, min_d.value(), max_d.value()), pixel_depths));
70 
71  view.draw_text(cv::Rect(20, 424, 512+512, 30), "avg calculated: " + std::to_string(avg_calculated_depth) + " mm", viewer::left);
72  view.draw_text(cv::Rect(20+350, 424, 512+512, 30), "avg measured: " + std::to_string(avg_measured_depth) + " mm", viewer::left);
73  //view.draw_text(cv::Rect(20+700, 424, 512+512, 30), "difference: " + std::to_string(avg_measured_depth-avg_calculated_depth) + " mm", viewer::left);
74  view.draw_text(cv::Rect(20+700, 424, 512+512, 30), "ratio: " + std::to_string(avg_measured_depth/avg_calculated_depth), viewer::left);
75 
76  view.draw_text(cv::Rect(20, 424+30, 512+512-10, 30), "rms depth error: " + std::to_string(rms_depth_error) + " mm", viewer::left);
77  view.draw_text(cv::Rect(20+430, 424+30, 512+512-10, 30), "count: " + std::to_string(count), viewer::left);
78  view.draw_text(cv::Rect(20+570, 424+30, 512+512-10, 30), "reprojection err: " + std::to_string(reprojection_error), viewer::left);
79 
80  grab.release();
81 
82  running = view.show();
83  }
84 
85  std::cout << "done" << std::endl;
86 }
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)
void calculate_checkerboard_pixel_depths(const intrinsics &intr, const checkerboard_extrinsics &ext, std::vector< checkerboard_pixel_depth_sample > &inout_samples)
static cv::Mat_< uchar > visualize_depth(const cv::Mat &, float min_d, float max_d)
Definition: viewer.cc:95
int rows
void draw(const cv::Mat_< cv::Vec3b > &, real blend=1.0)
Definition: viewer.cc:119
checkerboard_extrinsics estimate_checkerboard_extrinsics(const checkerboard &chk, const intrinsics &intr)
cv::Mat_< cv::Vec3b > visualize_checkerboard(const cv::Mat_< cv::Vec3b > &img, const checkerboard &chk, const checkerboard_visualization_parameters &param)
cv::Mat_< float > get_depth_frame(bool undistorted=false)
bool show(int &keycode)
Definition: viewer.cc:218
int main(int argc, const char *argv[])
intrinsics intrinsics_arg()
Definition: intrinsics.cc:119
cv::Mat_< cv::Vec3b > visualize_checkerboard_pixel_samples(const cv::Mat_< cv::Vec3b > &img, const std::vector< checkerboard_pixel_depth_sample > &pixels, int rad)
double real
Definition: common.h:16
long int_arg()
Definition: args.cc:138
double real_arg()
Definition: args.cc:146
real square_width
int cols
std::string to_string(const T &)
void release()
void draw_text(cv::Rect rect, const std::string &text, text_alignment=left)
Definition: viewer.cc:182
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
std::vector< checkerboard_pixel_depth_sample > checkerboard_pixel_depth_samples(const checkerboard &chk, const cv::Mat_< float > &depth_image, int granularity)
void get_args(int argc, const char *argv[], const std::string &usage)
Definition: args.cc:49