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);