對OpenCV中涉及的三種立體匹配演算法進行代碼及各自優缺點總結:
首先我們看一下BM演算法:
該演算法代碼:
CvStereoBMState *BMState = cvCreateStereoBMState();<br />int SADWindowSize=15;<br /> BMState->SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 9;<br /> BMState->minDisparity = 0;<br /> BMState->numberOfDisparities = 32;<br /> BMState->textureThreshold = 10;<br /> BMState->uniquenessRatio = 15;<br /> BMState->speckleWindowSize = 100;<br /> BMState->speckleRange = 32;<br /> BMState->disp12MaxDiff = 1;<br /> cvFindStereoCorrespondenceBM( left, right, left_disp_,BMState);<br /> cvNormalize( left_disp_, left_vdisp, 0, 256, CV_MINMAX );<br />
其中minDisparity是控制匹配搜尋的第一個參數,代表了匹配搜蘇從哪裡開始,numberOfDisparities表示最大搜尋視差數uniquenessRatio表示匹配功能函數,這三個參數比較重要,可以根據實驗給予參數值。
該方法速度最快,一副320*240的灰階圖匹配時間為31ms,視差圖如下。
第二種方法是SGBM方法這是OpenCV的一種新演算法:
cv::StereoSGBM sgbm;<br /> sgbm.preFilterCap = 63;<br />int SADWindowSize=11;<br />int cn = 1;<br />sgbm.SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 3;<br />sgbm.P1 = 4*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;<br />sgbm.P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;<br />sgbm.minDisparity = 0;<br />sgbm.numberOfDisparities = 32;<br />sgbm.uniquenessRatio = 10;<br />sgbm.speckleWindowSize = 100;<br />sgbm.speckleRange = 32;<br />sgbm.disp12MaxDiff = 1;</p><p>sgbm(left , right , left_disp_);<br />sgbm(right, left , right_disp_);
各參數設定如BM方法,速度比較快,320*240的灰階圖匹配時間為78ms,視差效果如。
第三種為GC方法:
CvStereoGCState* state = cvCreateStereoGCState( 16, 2 );<br /> left_disp_ =cvCreateMat( left->height,left->width, CV_32F );<br /> right_disp_ =cvCreateMat( right->height,right->width,CV_32F );<br /> cvFindStereoCorrespondenceGC( left, right, left_disp_, right_disp_, state, 0 );<br /> cvReleaseStereoGCState( &state );
該方法速度超慢,但效果超好。
各方法理論可以參考文獻。
出處:http://blog.csdn.net/mailang2008/archive/2010/09/09/5873883.aspx