1 #include "../lib/args.h" 2 #include "../lib/opencv.h" 3 #include "../lib/viewer.h" 4 #include "../lib/intrinsics.h" 20 int main(
int argc,
const char* argv[]) {
24 int width = intr.
width;
33 viewer view(
"Distortion / Undistortion", 2*width +
border, 2*height + 20 + 20 +
border);
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);
48 int cell_width = cell_width_slider.value();
49 int reversed_opacity = reversed_opacity_slider.value();
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);
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);
61 std::vector<vec2> regular_grid;
62 for(
const vec2& pt : small_regular_grid) regular_grid.push_back(scale * pt);
66 std::vector<vec2> distorted_grid =
distort_points(intr, regular_grid);
67 std::vector<vec2> undistorted_distorted_grid =
undistort_points(intr, distorted_grid);
71 std::vector<vec2> distorted_undistorted_grid =
distort_points(intr, undistorted_grid);
74 auto drawn_grid = [&](
const std::vector<vec2>& grid,
const cv::Vec3b& col) {
75 cv::Mat_<cv::Vec3b> img(height, width);
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);
84 cv::Mat_<cv::Vec3b> reversed(height, width);
85 real reversed_alpha = reversed_opacity / 100.0;
91 view.
draw(cv::Point(0, 20), drawn_grid(undistorted_distorted_grid,
marker_color1), reversed_alpha);
101 std::string space =
" ";
105 view.
draw_text(cv::Rect(0, 0, width, 20),
"no distortion");
real_slider & add_real_slider(const std::string &caption, real default_val, real min_val, real max_val, int steps=100)
std::vector< vec2 > distort_points(const intrinsics &intr, const std::vector< vec2 > &undistorted)
const cv::Vec3b marker_color1(255, 200, 200)
void draw(const cv::Mat_< cv::Vec3b > &, real blend=1.0)
cv::Vec3b background_color
const cv::Vec3b marker_color2(200, 200, 255)
intrinsics intrinsics_arg()
int main(int argc, const char *argv[])
distortion_parameters distortion
std::string to_string(const T &)
std::vector< vec2 > undistort_points(const intrinsics &intr, const std::vector< vec2 > &distorted)
void draw_text(cv::Rect rect, const std::string &text, text_alignment=left)
int_slider & add_int_slider(const std::string &caption, int default_val, int min_val, int max_val, int step=1)
void clear(int width, int height)
std::function< void()> update_callback
void get_args(int argc, const char *argv[], const std::string &usage)