OpenCV 3.1 StereoBM 獲取正確視差Dispariy


 

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運行的,有機會一定要試試看效果如何~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM