【图像处理】基于opencv3.0使用StereoBM计算视差

OpenCV在版本3.0之后发生了较大变化,比如sift特征以及立体匹配等等,基于OpenCV2.3.1版本使用StereoBM计算视差(戳这里)在3.0版本中StereoBM的变化:,
(1)StereoBM定义为了纯虚类,不能直接实例化了,只能使用智能指针的形式实例化
(2)视差值的类型为CV_16S,所以最终要得到真实的视差值还需要转到 CV_32F;
(3)StereoBM的参数需要使用setter和getter方法来设置、获取。

1.环境

opencv库:3.0.0
系统:win10 64位

2.StereoBM的使用

void calDisparity(const IplImage * left, const IplImage * right, Mat & disparity)
{
    Mat _left = cvarrToMat(left); //IplImage *转Mat
    Mat _right = cvarrToMat(right);
    Rect leftROI, rightROI;
    cv::Ptr<cv::StereoBM> bm = cv::StereoBM::create(16, 9);
    bm->setPreFilterType(CV_STEREO_BM_XSOBEL);  //CV_STEREO_BM_NORMALIZED_RESPONSE或者CV_STEREO_BM_XSOBEL
    bm->setPreFilterSize(9);
    bm->setPreFilterCap(31);
    bm->setBlockSize(15);
    bm->setMinDisparity(0);
    bm->setNumDisparities(64);
    bm->setTextureThreshold(10);
    bm->setUniquenessRatio(5);
    bm->setSpeckleWindowSize(100);
    bm->setSpeckleRange(32);
    bm->setROI1(leftROI);
    bm->setROI2(rightROI);
    copyMakeBorder(_left, _left, 0, 0, 80, 0, IPL_BORDER_REPLICATE);  //防止黑边
    copyMakeBorder(_right, _right, 0, 0, 80, 0, IPL_BORDER_REPLICATE);
    bm->compute(_left, _right, disparity);
    disparity = disparity.colRange(80, _left.cols);
    disparity.convertTo(disparity, CV_32F, 1.0 / 16);
}

【图像处理】基于opencv3.0使用StereoBM计算视差_第1张图片

你可能感兴趣的:(【图像处理】,图像处理)