diff --git a/modules/stereo/samples/sample.cpp b/modules/stereo/samples/sample.cpp index 5f8400d43..0431751bd 100644 --- a/modules/stereo/samples/sample.cpp +++ b/modules/stereo/samples/sample.cpp @@ -11,7 +11,7 @@ using namespace cv::stereo; enum { STEREO_BINARY_BM, STEREO_BINARY_SGM }; static cv::CommandLineParser parse_argument_values(int argc, char **argv, string &left, string &right, int &kernel_size, int &number_of_disparities, - int &aggregation_window, int &P1, int &P2, float &scale, int &algo, int &binary_descriptor_type); + int &aggregation_window, int &P1, int &P2, float &scale, int &algo, int &binary_descriptor_type, int &success); int main(int argc, char** argv) { string left, right; @@ -19,6 +19,7 @@ int main(int argc, char** argv) float scale = 4; int algo = STEREO_BINARY_BM; int binary_descriptor_type = 0; + int success; // here we extract the values that were added as arguments // we also test to see if they are provided correcly cv::CommandLineParser parser = @@ -28,50 +29,12 @@ int main(int argc, char** argv) aggregation_window, P1, P2, scale, - algo, binary_descriptor_type); - - if (!parser.check()) + algo, binary_descriptor_type,success); + if (!parser.check() || !success) { parser.printMessage(); return 1; } - int fail = 0; - //TEST if the provided parameters are correct - if(binary_descriptor_type == CV_DENSE_CENSUS && kernel_size > 5) - { - cout << "For the dense census transform the maximum kernel size should be 5\n"; - fail = 1; - } - if((binary_descriptor_type == CV_MEAN_VARIATION || binary_descriptor_type == CV_MODIFIED_CENSUS_TRANSFORM || binary_descriptor_type == CV_STAR_KERNEL) && kernel_size != 9) - { - cout <<" For Mean variation and the modified census transform the kernel size should be equal to 9\n"; - fail = 1; - } - if((binary_descriptor_type == CV_CS_CENSUS || binary_descriptor_type == CV_MODIFIED_CS_CENSUS) && kernel_size > 7) - { - cout << " The kernel size should be smaller or equal to 7 for the CS census and modified center symetric census\n"; - fail = 1; - } - if(binary_descriptor_type == CV_SPARSE_CENSUS && kernel_size > 11) - { - cout << "The kernel size for the sparse census must be smaller or equal to 11\n"; - fail = 1; - } - - if(number_of_disparities < 10) - { - cout << "Number of disparities should be greater than 10\n"; - fail = 1; - } - if(P2 / P1 < 2) - { - cout << "You should probabilly choose a greater P2 penalty\n"; - fail = 1; - } - if(fail == 1) - { - return 1; - } // verify if the user inputs the correct number of parameters Mat image1, image2; // we read a pair of images from the disk @@ -85,7 +48,6 @@ int main(int argc, char** argv) parser.printMessage(); return 1; } - // we display the parsed parameters const char *b[7] = { "CV_DENSE_CENSUS", "CV_SPARSE_CENSUS", "CV_CS_CENSUS", "CV_MODIFIED_CS_CENSUS", "CV_MODIFIED_CENSUS_TRANSFORM", "CV_MEAN_VARIATION", "CV_STAR_KERNEL" }; @@ -151,21 +113,20 @@ int main(int argc, char** argv) return 0; } static cv::CommandLineParser parse_argument_values(int argc, char **argv, string &left, string &right, int &kernel_size, int &number_of_disparities, - int &aggregation_window, int &P1, int &P2, float &scale, int &algo, int &binary_descriptor_type) + int &aggregation_window, int &P1, int &P2, float &scale, int &algo, int &binary_descriptor_type, int &success) { static const char* keys = "{ @left | | }" "{ @right | | }" - "{ k kernel_size | 9 | }" - "{ d disparity | 128 | }" - "{ w aggregation_window | 9 | }" - "{ P1 | 100 | }" - "{ P2 | 1000 | }" - "{ b binary_descriptor | 4 | Index of the descriptor type:\n 0 - CV_DENSE_CENSUS,\n 1 - CV_SPARSE_CENSUS,\n 2 - CV_CS_CENSUS,\n 3 - CV_MODIFIED_CS_CENSUS,\n 4 - CV_MODIFIED_CENSUS_TRANSFORM,\n 5 - CV_MEAN_VARIATION,\n 6 - CV_STAR_KERNEL}" - "{ s scale | 1.01593 | }" + "{ k kernel_size | 9 | }" + "{ d disparity | 128 | }" + "{ w aggregation_window | 9 | }" + "{ P1 | 100 | }" + "{ P2 | 1000 | }" + "{ b binary_descriptor | 4 | Index of the descriptor type:\n 0 - CV_DENSE_CENSUS,\n 1 - CV_SPARSE_CENSUS,\n 2 - CV_CS_CENSUS,\n 3 - CV_MODIFIED_CS_CENSUS,\n 4 - CV_MODIFIED_CENSUS_TRANSFORM,\n 5 - CV_MEAN_VARIATION,\n 6 - CV_STAR_KERNEL}" + "{ s scale | 1.01593 | }" "{ a algorithm | sgm | }" ; - cv::CommandLineParser parser( argc, argv, keys ); left = parser.get(0); @@ -181,5 +142,55 @@ static cv::CommandLineParser parse_argument_values(int argc, char **argv, string parser.about("\nDemo stereo matching converting L and R images into disparity images using BM and SGBM\n"); + success = 1; + //TEST if the provided parameters are correct + if(binary_descriptor_type == CV_DENSE_CENSUS && kernel_size > 5) + { + cout << "For the dense census transform the maximum kernel size should be 5\n"; + success = 0; + } + if((binary_descriptor_type == CV_MEAN_VARIATION || binary_descriptor_type == CV_MODIFIED_CENSUS_TRANSFORM || binary_descriptor_type == CV_STAR_KERNEL) && kernel_size != 9) + { + cout <<" For Mean variation and the modified census transform the kernel size should be equal to 9\n"; + success = 0; + } + if((binary_descriptor_type == CV_CS_CENSUS || binary_descriptor_type == CV_MODIFIED_CS_CENSUS) && kernel_size > 7) + { + cout << " The kernel size should be smaller or equal to 7 for the CS census and modified center symetric census\n"; + success = 0; + } + if(binary_descriptor_type == CV_SPARSE_CENSUS && kernel_size > 11) + { + cout << "The kernel size for the sparse census must be smaller or equal to 11\n"; + success = 0; + } + if(number_of_disparities < 10) + { + cout << "Number of disparities should be greater than 10\n"; + success = 0; + } + if(aggregation_window < 3) + { + cout << "Aggregation window should be > 3"; + success = 0; + } + if(scale < 1) + { + cout << "The scale should be a positive number \n"; + success = 0; + } + if(P1 != 0) + { + if(P2 / P1 < 2) + { + cout << "You should probably choose a greater P2 penalty\n"; + success = 0; + } + } + else + { + cout << " Penalties should be greater than 0\n"; + success = 0; + } return parser; } diff --git a/modules/stereo/src/matching.hpp b/modules/stereo/src/matching.hpp index 1841d8b8c..8eb33dc04 100644 --- a/modules/stereo/src/matching.hpp +++ b/modules/stereo/src/matching.hpp @@ -95,8 +95,11 @@ namespace cv mini3 = c[(iw + i * search_region) * widthDisp2 + i]; } } - if (mini3 / mini <= confidence) - return index; + if(mini != 0) + { + if (mini3 / mini <= confidence) + return index; + } return -1; } //!Interpolate in order to obtain better results @@ -171,7 +174,7 @@ namespace cv #if CV_SSE4_1 c[(iwj)* (v + 1) + d] = (short)_mm_popcnt_u32(xorul); #else - c[(iwj)* (v + 1) + d] = (short)(hammLut[xorul & MASK] + hammLut[xorul >> 16]); + c[(iwj)* (v + 1) + d] = (short)(hammLut[xorul & MASK] + hammLut[(xorul >> 16) & MASK]); #endif } }