OpenCV更新到3.0版本后,Stereo模塊變化的挺多的,首先去掉了StereoBMState和StereoSGBMState這兩個專門控制BM和SGBM算法參數的類,而且StereoBM不能直接聲明實例,需要放到智能指針里cv::Ptr<cv::StereoBM>聲明才行,而且不能直接通過訪問state來訪問參數,只能通過setter和getter方法來設置和獲取參數,參考下面這段實例代碼:
cv::Ptr<cv::StereoBM> bm = cv::StereoBM::create(16,9); // setter bm->setPreFilterType(CV_STEREO_BM_NORMALIZED_RESPONSE); bm->setPreFilterSize(9); bm->setPreFilterCap(31); bm->setBlockSize(21); bm->setMinDisparity(-16); bm->setNumDisparities(64); bm->setTextureThreshold(10); bm->setUniquenessRatio(5); bm->setSpeckleWindowSize(100); bm->setSpeckleRange(32); bm->setROI1(roi_left); bm->setROI2(roi_right); // getter int pfs = bm->getPreFilterSize(); int pfc = bm->getPreFilterCap(); int bs = bm->getBlockSize(); int md = bm->getMinDisparity(); int nd = bm->getNumDisparities(); int tt = bm->getTextureThreshold(); int ur = bm->getUniquenessRatio(); int sw = bm->getSpeckleWindowSize(); int sr = bm->getSpeckleRange(); // Compute disparity bm->compute(left, right, disp);
注意新版本下的BM和SGBM方法計算出的視差都是CV_16S格式的,使用32位float格式可以得到真實的視差值,所以我們需要除以16,需要加上下面一行代碼:
// Convert disp.convertTo(disp, CV_32F, 1.0/16);
還有就是我怎么在3.1版本下找不到GC算法了,難道是嫌速度慢刪去了?新加了StereoBeliefPropagation算法,但是需要用Cuda運行的,有機會一定要試試看效果如何~
