licornea_tools
view_distortion.cc
Go to the documentation of this file.
1 #include "../lib/args.h"
2 #include "../lib/opencv.h"
3 #include "../lib/viewer.h"
4 #include "../lib/intrinsics.h"
5 #include <cstdlib>
6 #include <iostream>
7 #include <string>
8 
9 using namespace tlz;
10 
11 const cv::Vec3b marker_color1(255, 200, 200);
12 const cv::Vec3b marker_color2(200, 200, 255);
13 
14 const int max_height = 300;
15 const int slider_steps = 1000;
16 const real coeff_abs_max = 0.4;
17 const int border = 20;
18 
19 
20 int main(int argc, const char* argv[]) {
21  get_args(argc, argv, "intr.json");
22  intrinsics intr = intrinsics_arg();
23 
24  int width = intr.width;
25  int height = intr.height;
26  real scale = 1.0;
27  if(height > max_height) {
28  scale = real(height) / max_height;
29  width = max_height * width / height;
30  height = max_height;
31  }
32 
33  viewer view("Distortion / Undistortion", 2*width + border, 2*height + 20 + 20 + border);
34  auto& k1_slider = view.add_real_slider("k1", intr.distortion.k1, -coeff_abs_max, +coeff_abs_max, slider_steps);
35  auto& k2_slider = view.add_real_slider("k2", intr.distortion.k2, -coeff_abs_max, +coeff_abs_max, slider_steps);
36  auto& k3_slider = view.add_real_slider("k3", intr.distortion.k3, -coeff_abs_max, +coeff_abs_max, slider_steps);
37  auto& p1_slider = view.add_real_slider("p1", intr.distortion.p1, -coeff_abs_max, +coeff_abs_max, slider_steps);
38  auto& p2_slider = view.add_real_slider("p2", intr.distortion.p2, -coeff_abs_max, +coeff_abs_max, slider_steps);
39  auto& cell_width_slider = view.add_int_slider("cell width", 20, 3, 100);
40  auto& reversed_opacity_slider = view.add_int_slider("reversed op", 0, 0, 100);
41 
42  view.update_callback = [&]() {
43  intr.distortion.k1 = k1_slider.value();
44  intr.distortion.k2 = k2_slider.value();
45  intr.distortion.k3 = k3_slider.value();
46  intr.distortion.p1 = p1_slider.value();
47  intr.distortion.p2 = p2_slider.value();
48  int cell_width = cell_width_slider.value();
49  int reversed_opacity = reversed_opacity_slider.value();
50 
51  // make regular grid
52  std::vector<vec2> small_regular_grid;
53  for(int x = width/2; x >= 0; x -= cell_width) {
54  for(int y = height/2; y >= 0; y -= cell_width) small_regular_grid.emplace_back(x, y);
55  for(int y = height/2 + cell_width; y < height; y += cell_width) small_regular_grid.emplace_back(x, y);
56  }
57  for(int x = width/2 + cell_width; x < width; x += cell_width) {
58  for(int y = height/2; y >= 0; y -= cell_width) small_regular_grid.emplace_back(x, y);
59  for(int y = height/2 + cell_width; y < height; y += cell_width) small_regular_grid.emplace_back(x, y);
60  }
61  std::vector<vec2> regular_grid;
62  for(const vec2& pt : small_regular_grid) regular_grid.push_back(scale * pt);
63 
64 
65  // distort + back
66  std::vector<vec2> distorted_grid = distort_points(intr, regular_grid);
67  std::vector<vec2> undistorted_distorted_grid = undistort_points(intr, distorted_grid);
68 
69  // undistort + back
70  std::vector<vec2> undistorted_grid = undistort_points(intr, regular_grid);
71  std::vector<vec2> distorted_undistorted_grid = distort_points(intr, undistorted_grid);
72 
73  // draw grids
74  auto drawn_grid = [&](const std::vector<vec2>& grid, const cv::Vec3b& col) {
75  cv::Mat_<cv::Vec3b> img(height, width);
76  img.setTo(view.background_color);
77  for(const vec2& pt : grid) {
78  int pt_x = pt[0] / scale, pt_y = pt[1] / scale;
79  if(pt_x < 0 || pt_x >= width || pt_y < 0 || pt_y >= height) continue;
80  cv::circle(img, cv::Point(pt_x, pt_y), 3, cv::Scalar(col), 1);
81  }
82  return img;
83  };
84  cv::Mat_<cv::Vec3b> reversed(height, width);
85  real reversed_alpha = reversed_opacity / 100.0;
86 
87  view.clear();
88 
89  // ..upper row (regular & undistorted_distorted | distorted)
90  view.draw(cv::Point(0, 20), drawn_grid(regular_grid, marker_color1));
91  view.draw(cv::Point(0, 20), drawn_grid(undistorted_distorted_grid, marker_color1), reversed_alpha);
92  view.draw(cv::Point(width+border, 20), drawn_grid(distorted_grid, marker_color2));
93 
94  // ..lower row (undistorted | regular & distorted_undistorted)
95  view.draw(cv::Point(0, height+border+20), drawn_grid(undistorted_grid, marker_color2));
96  view.draw(cv::Point(width+border, height+border+20), drawn_grid(regular_grid, marker_color1));
97  view.draw(cv::Point(width+border, height+border+20), drawn_grid(distorted_undistorted_grid, marker_color1), reversed_alpha);
98 
99 
100  // draw label
101  std::string space = " ";
102  const auto& d = intr.distortion;
103  std::string label = "k1=" + std::to_string(d.k1) + space + "k2=" + std::to_string(d.k2) + space + "k3=" + std::to_string(d.k3) + space + "p1=" + std::to_string(d.p1) + space + "p2=" + std::to_string(d.p2);
104  view.draw_text(cv::Rect(10, 2*height+20+border, 2*width+border-20, 20), label, viewer::center);
105  view.draw_text(cv::Rect(0, 0, width, 20), "no distortion");
106  view.draw_text(cv::Rect(width+border, 0, width, 20), "distorted");
107  };
108 
109  view.show_modal();
110 }
real_slider & add_real_slider(const std::string &caption, real default_val, real min_val, real max_val, int steps=100)
Definition: viewer.cc:273
std::vector< vec2 > distort_points(const intrinsics &intr, const std::vector< vec2 > &undistorted)
Definition: intrinsics.cc:106
const cv::Vec3b marker_color1(255, 200, 200)
void draw(const cv::Mat_< cv::Vec3b > &, real blend=1.0)
Definition: viewer.cc:119
void show_modal()
Definition: viewer.cc:230
cv::Vec3b background_color
Definition: viewer.h:37
cv::Vec< real, 2 > vec2
Definition: common.h:22
const int max_height
const cv::Vec3b marker_color2(200, 200, 255)
intrinsics intrinsics_arg()
Definition: intrinsics.cc:119
int main(int argc, const char *argv[])
distortion_parameters distortion
Definition: intrinsics.h:30
double real
Definition: common.h:16
std::string to_string(const T &)
std::vector< vec2 > undistort_points(const intrinsics &intr, const std::vector< vec2 > &distorted)
Definition: intrinsics.cc:45
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
const real coeff_abs_max
void clear(int width, int height)
Definition: viewer.cc:76
const int slider_steps
std::function< void()> update_callback
Definition: viewer.h:40
void get_args(int argc, const char *argv[], const std::string &usage)
Definition: args.cc:49