licornea_tools
checkerboard_depth_parallel.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 
17 int main(int argc, const char* argv[]) {
18  get_args(argc, argv, "cols rows square_width ir_intr.json");
19  int cols = int_arg();
20  int rows = int_arg();
22  intrinsics ir_intr = intrinsics_arg();
23 
25 
26  viewer view(512+512, 424+70);
27  auto& min_ir = view.add_int_slider("ir min", 0, 0x0000, 0xffff);
28  auto& max_ir = view.add_int_slider("ir max", 0xffff, 0x0000, 0xffff);
29  auto& min_d = view.add_int_slider("depth min ", 0, 0, 20000);
30  auto& max_d = view.add_int_slider("depth max", 6000, 0, 20000);
31  auto& granularity = view.add_int_slider("granularity", 2, 1, 30);
32 
33  std::cout << "running viewer... (esc to end)" << std::endl;
34  bool running = true;
35  while(running) {
36  grab.grab();
37  view.clear();
38 
39  cv::Mat_<float> depth = grab.get_depth_frame(true);
40  cv::Mat_<uchar> ir = grab.get_ir_frame(min_ir.value(), max_ir.value(), true);
41 
42  checkerboard ir_chk = detect_ir_checkerboard(ir, cols, rows, square_width);
43 
44  real avg_measured_depth = NAN, avg_calculated_depth = NAN;
45  real calculated_parallel_depth = NAN, parallel_measure_x = NAN, parallel_measure_y = NAN;
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  int count = pixel_depths.size();
53 
54  avg_measured_depth = 0.0;
55  avg_calculated_depth = 0.0;
56  for(const auto& samp : pixel_depths) {
57  avg_calculated_depth += samp.calculated_depth;
58  avg_measured_depth += samp.measured_depth;
59  }
60  avg_calculated_depth /= count;
61  avg_measured_depth /= count;
62 
63  vec2 parallel_measures = checkerboard_parallel_measures(ir_chk);
64  parallel_measure_x = parallel_measures[0];
65  parallel_measure_y = parallel_measures[1];
66  calculated_parallel_depth = calculate_parallel_checkerboard_depth(ir_chk, ir_intr);
67  }
68 
69  view.draw(cv::Rect(0, 0, 512, 424), visualize_checkerboard(ir, ir_chk));
70  view.draw_2d_arrow_indicator(cv::Rect(0, 0, 512, 424), parallel_measure_x, parallel_measure_y, 0.1);
71  view.draw(cv::Rect(512, 0, 512, 424), visualize_checkerboard_pixel_samples(view.visualize_depth(depth, min_d.value(), max_d.value()), pixel_depths));
72 
73  // std::cout << parallel_measure_x << "\n" << parallel_measure_y << "\n\n\n";
74 
75  view.draw_text(cv::Rect(20, 424, 512+512, 30), "pixel calc: " + std::to_string(avg_calculated_depth) + " mm", viewer::left);
76  view.draw_text(cv::Rect(20+330, 424, 512+512, 30), "parallel calc: " + std::to_string(calculated_parallel_depth) + " mm", viewer::left);
77  view.draw_text(cv::Rect(20+660, 424, 512+512, 30), "avg measured: " + std::to_string(avg_measured_depth) + " mm", viewer::left);
78 
79  view.draw_text(cv::Rect(0, 424+30, 512, 30), std::to_string(calculated_parallel_depth-avg_calculated_depth) + " mm", viewer::center);
80  view.draw_text(cv::Rect(512, 424+30, 512, 30), std::to_string(avg_measured_depth-calculated_parallel_depth) + " mm", viewer::center);
81  view.draw_text(cv::Rect(0, 424+40, 512+512, 30), std::to_string(avg_measured_depth-avg_calculated_depth) + " mm", viewer::center);
82 
83  grab.release();
84 
85  running = view.show();
86  }
87 
88  std::cout << "done" << std::endl;
89 }
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::Vec< real, 2 > vec2
Definition: common.h:22
cv::Mat_< float > get_depth_frame(bool undistorted=false)
bool show(int &keycode)
Definition: viewer.cc:218
vec2 checkerboard_parallel_measures(const checkerboard &chk)
real calculate_parallel_checkerboard_depth(const checkerboard &chk, const intrinsics &intr)
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
void draw_2d_arrow_indicator(cv::Rect rect, real value_x, real value_y, real max_value)
Definition: viewer.cc:206
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)
int main(int argc, const char *argv[])
void get_args(int argc, const char *argv[], const std::string &usage)
Definition: args.cc:49