OpenCV3.2计算视差图的流程,没有找到核心算法

  • Post author:
  • Post category:其他



Mat imgLeft = imread(“E:/019_视差论文及程序/333_left.png”, IMREAD_GRAYSCALE);



Mat imgRight = imread(“E:/019_视差论文及程序/333_right.png”, IMREAD_GRAYSCALE);



imshow(“imgLeft”, imgLeft);




imshow(“imgRight”, imgRight);






//– And create the image in which we will save our disparities



Mat imgDisparity16S = Mat(imgLeft.rows, imgLeft.cols, CV_16S);



Mat imgDisparity8U = Mat(imgLeft.rows, imgLeft.cols, CV_8UC1);



//– 2. Call the constructor for StereoBM





int ndisparities = 16 * 5;   /**< Range of disparity */



int SADWindowSize = 7; /**< Size of the block window. Must be odd */



Ptr<StereoBM> sbm = StereoBM::create(ndisparities, SADWindowSize);


Rect roi_left, roi_right;








//– 3. Calculate the disparity image





sbm->setPreFilterCap(CV_STEREO_BM_NORMALIZED_RESPONSE);



sbm->setPreFilterSize(5);



sbm->setPreFilterCap(31);

sbm->setBlockSize(21);



sbm->setMinDisparity(-16);



sbm->setNumDisparities(80);



sbm->setTextureThreshold(10);



sbm->setUniquenessRatio(8);



sbm->setSpeckleWindowSize(10);



sbm->setSpeckleRange(32);



//sbm->setROI1(roi_left);



//sbm->setROI2(roi_right);





sbm->compute(imgLeft, imgRight, imgDisparity16S);



//– Check its extreme values



double minVal; double maxVal;

minMaxLoc(imgDisparity16S, &minVal, &maxVal);



printf(“Min disp: %f Max value: %f \n”, minVal, maxVal);





//– 4. Display it as a CV_8UC1 image





imgDisparity16S.convertTo(imgDisparity8U, CV_8UC1, 255 / (maxVal – minVal));



namedWindow(windowDisparity, WINDOW_NORMAL);



imshow(windowDisparity, imgDisparity8U);





//– 5. Save the image






imwrite(“SBM_sample.png”, imgDisparity16S);