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

来源:互联网 发布:域名购买是永久的吗 编辑:程序博客网 时间:2024/06/11 04:29
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);


0 0