Home | History | Annotate | Download | only in stereoBM
      1 /**
      2  * @file SBM_Sample
      3  * @brief Get a disparity map of two images
      4  * @author A. Huaman
      5  */
      6 
      7 #include <stdio.h>
      8 #include <iostream>
      9 #include "opencv2/calib3d/calib3d.hpp"
     10 #include "opencv2/core/core.hpp"
     11 #include "opencv2/imgcodecs.hpp"
     12 #include "opencv2/highgui/highgui.hpp"
     13 
     14 using namespace cv;
     15 
     16 const char *windowDisparity = "Disparity";
     17 
     18 void readme();
     19 
     20 /**
     21  * @function main
     22  * @brief Main function
     23  */
     24 int main( int argc, char** argv )
     25 {
     26   if( argc != 3 )
     27   { readme(); return -1; }
     28 
     29   //-- 1. Read the images
     30   Mat imgLeft = imread( argv[1], IMREAD_GRAYSCALE );
     31   Mat imgRight = imread( argv[2], IMREAD_GRAYSCALE );
     32   //-- And create the image in which we will save our disparities
     33   Mat imgDisparity16S = Mat( imgLeft.rows, imgLeft.cols, CV_16S );
     34   Mat imgDisparity8U = Mat( imgLeft.rows, imgLeft.cols, CV_8UC1 );
     35 
     36   if( imgLeft.empty() || imgRight.empty() )
     37   { std::cout<< " --(!) Error reading images " << std::endl; return -1; }
     38 
     39   //-- 2. Call the constructor for StereoBM
     40   int ndisparities = 16*5;   /**< Range of disparity */
     41   int SADWindowSize = 21; /**< Size of the block window. Must be odd */
     42 
     43   Ptr<StereoBM> sbm = StereoBM::create( ndisparities, SADWindowSize );
     44 
     45   //-- 3. Calculate the disparity image
     46   sbm->compute( imgLeft, imgRight, imgDisparity16S );
     47 
     48   //-- Check its extreme values
     49   double minVal; double maxVal;
     50 
     51   minMaxLoc( imgDisparity16S, &minVal, &maxVal );
     52 
     53   printf("Min disp: %f Max value: %f \n", minVal, maxVal);
     54 
     55   //-- 4. Display it as a CV_8UC1 image
     56   imgDisparity16S.convertTo( imgDisparity8U, CV_8UC1, 255/(maxVal - minVal));
     57 
     58   namedWindow( windowDisparity, WINDOW_NORMAL );
     59   imshow( windowDisparity, imgDisparity8U );
     60 
     61   //-- 5. Save the image
     62   imwrite("SBM_sample.png", imgDisparity16S);
     63 
     64   waitKey(0);
     65 
     66   return 0;
     67 }
     68 
     69 /**
     70  * @function readme
     71  */
     72 void readme()
     73 { std::cout << " Usage: ./SBMSample <imgLeft> <imgRight>" << std::endl; }
     74