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