1 #include <string>
2 #include <vector>
3 #include <iostream>
4 #include <sstream>
5
6 #include "vul/vul_file.h"
7 #include "vul/vul_file_iterator.h"
8 #include "vil/vil_convert.h"
9 #include "vil/vil_image_view.h"
10 #include "vil/vil_load.h"
11 #include "vil/vil_save.h"
12
13 #include <bsgm/bsgm_disparity_estimator.h>
14 #include <bsgm/bsgm_error_checking.h>
15 #include <bsgm/bsgm_multiscale_disparity_estimator.h>
16
17
main(int argc,char * argv[])18 int main(int argc,char * argv[])
19 {
20 // Hardcoded params
21 bsgm_disparity_estimator_params params;
22 params.use_16_directions = true;
23 params.use_gradient_weighted_smoothing = true;
24 params.census_weight = 0.3;
25 params.xgrad_weight = 0.7;
26 params.census_rad = 2;
27 params.census_tol = 0;
28 params.print_timing = true;
29 params.shadow_thresh = 0;
30
31 // optional sun direction
32 // params.bias_dir = vgl_vector_2d<float>(-0.0f, -1.0f);//8
33 // params.bias_dir = vgl_vector_2d<float>(-2.0f, -1.0f);//135
34 // params.bias_dir = vgl_vector_2d<float>(-3.0f, -2.0f);//177
35 // params.bias_dir = vgl_vector_2d<float>(-0.2f, -1.0f);//550
36 // params.bias_weight = 1.0f;
37
38 // report parameters
39 std::cout << params << std::endl;
40
41 // Usage information
42 if( argc != 8 && argc != 9 ){
43 std::cout << "Usage : bsgm_app.exe target_img ref_img disp_img "
44 << "min_disparity num_disparities num_active_disparities "
45 << "multi_scale_mode error_check_mode\n";
46 return -1;
47 }
48
49 // Read inputs
50 std::string right_name(argv[1]);
51 std::string left_name(argv[2]);
52 std::string disp_name(argv[3]);
53 int min_disparity = std::stoi(argv[4]);
54 int num_disparities = std::stoi(argv[5]);
55 int num_active_disparities = std::stoi(argv[6]);
56 int multi_scale_mode = std::stoi(argv[7]);
57 params.error_check_mode = (argc==8) ? 1 : std::stoi(argv[8]);
58
59 // Load images
60 vil_image_view<vxl_byte> img_right =
61 vil_convert_to_grey_using_rgb_weighting( vil_load( right_name.c_str() ) );
62 vil_image_view<vxl_byte> img_left =
63 vil_convert_to_grey_using_rgb_weighting( vil_load( left_name.c_str() ) );
64 int img_width = img_right.ni(), img_height = img_right.nj();
65
66 // Check images
67 if( !(img_width > 0 && img_height > 0) ){
68 std::cerr << "Failed to load images\n";
69 return 1;
70 }
71
72 // Compute invalid map
73 vil_image_view<bool> invalid_right, invalid_left;
74 bsgm_compute_invalid_map( img_right, img_left,
75 invalid_right, min_disparity, num_disparities );
76 bsgm_compute_invalid_map(img_left, img_right,
77 invalid_left, -num_disparities-min_disparity+1, num_disparities);
78
79 // Flip the sign of the disparities to match OpenCV implementation. Set the
80 // invalid disparity to one less than the min value, befor and after flip.
81 float invalid_disp = min_disparity - 1.0f;
82 float min_disparity_inv = -( min_disparity + num_disparities - 1 );
83 float invalid_disp_inv = min_disparity_inv - 1.0f;
84
85 vil_image_view<float> disp_right, disp_left;
86
87 // Run single-scale SGM if all disparities are active
88 if( num_active_disparities >= num_disparities ){
89
90 bsgm_disparity_estimator sgm(
91 params, img_width, img_height, num_disparities );
92
93 vil_image_view<int> min_disp_img( img_width, img_height );
94 min_disp_img.fill( min_disparity_inv );
95
96 if( !sgm.compute( img_right, img_left, invalid_right,
97 min_disp_img, invalid_disp_inv, disp_right ) ){
98 std::cerr << "SGM failed\n";
99 return 1;
100 }
101
102 // Debugging
103 //sgm.write_cost_debug_imgs( std::string("C:/data/results"), true );
104
105 // Otherwise run multi-scale to find the valid disparity range
106 } else {
107
108 bsgm_multiscale_disparity_estimator sgm(
109 params, img_width, img_height, num_disparities, num_active_disparities );
110
111 if (!sgm.compute_both(img_right, img_left, invalid_right, invalid_left,
112 min_disparity_inv, invalid_disp_inv, multi_scale_mode,
113 disp_right, disp_left)) {
114 //if( !sgm.compute( img_right, img_left, invalid_right,
115 // min_disparity_inv, invalid_disp_inv, multi_scale_mode, disp_right ) ){
116 std::cerr << "SGM failed\n";
117 return 1;
118 }
119 }
120
121 // Flip the sign of the disparities to match OpenCV implementation.
122 bsgm_invert_disparities( disp_right, invalid_disp_inv, invalid_disp );
123
124 // Convert floating point image to byte for saving
125 vil_image_view<vxl_byte> disp_r_8u;
126 vil_convert_stretch_range_limited( disp_right, disp_r_8u,
127 (float)min_disparity-1, (float)( min_disparity+num_disparities-1 ) );
128 vil_save( disp_r_8u, disp_name.c_str() );
129
130 return 0;
131 };
132