不同方法獲得視差圖比較


原帖地址:http://blog.csdn.net/mailang2008/article/details/5873883

對OpenCV中涉及的三種立體匹配算法進行代碼及各自優缺點總結:

首先我們看一下BM算法:

該算法代碼:

[cpp]  view plain copy
  1. CvStereoBMState *BMState = cvCreateStereoBMState();  
  2.   
  3. int SADWindowSize=15;   
  4.  BMState->SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 9;  
  5.  BMState->minDisparity = 0;  
  6.  BMState->numberOfDisparities = 32;  
  7.  BMState->textureThreshold = 10;  
  8.  BMState->uniquenessRatio = 15;  
  9.  BMState->speckleWindowSize = 100;  
  10.  BMState->speckleRange = 32;  
  11.  BMState->disp12MaxDiff = 1;  
  12.  cvFindStereoCorrespondenceBM( left, right, left_disp_,BMState);  
  13.    cvNormalize( left_disp_, left_vdisp, 0, 256, CV_MINMAX );  

其中minDisparity是控制匹配搜索的第一個參數,代表了匹配搜蘇從哪里開始,numberOfDisparities表示最大搜索視差數uniquenessRatio表示匹配功能函數,這三個參數比較重要,可以根據實驗給予參數值。

該方法速度最快,一副320*240的灰度圖匹配時間為31ms,視差圖如下。

 

第二種方法是SGBM方法這是OpenCV的一種新算法:

[cpp]  view plain copy
  1. cv::StereoSGBM sgbm;  
  2.         sgbm.preFilterCap = 63;  
  3.         int SADWindowSize=11;   
  4.         int cn = 1;  
  5.         sgbm.SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 3;  
  6.         sgbm.P1 = 4*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;  
  7.         sgbm.P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;  
  8.         sgbm.minDisparity = 0;  
  9.         sgbm.numberOfDisparities = 32;  
  10.         sgbm.uniquenessRatio = 10;  
  11.         sgbm.speckleWindowSize = 100;  
  12.         sgbm.speckleRange = 32;  
  13.         sgbm.disp12MaxDiff = 1;  
  14.       
  15.         sgbm(left , right , left_disp_);  
  16.         sgbm(right, left  , right_disp_);  

 

各參數設置如BM方法,速度比較快,320*240的灰度圖匹配時間為78ms,視差效果如下圖。

 

 

第三種為GC方法:

[cpp]  view plain copy
  1. CvStereoGCState* state = cvCreateStereoGCState( 16, 2 );  
  2.  left_disp_  =cvCreateMat( left->height,left->width, CV_32F );  
  3.  right_disp_ =cvCreateMat( right->height,right->width,CV_32F );  
  4.  cvFindStereoCorrespondenceGC( left, right, left_disp_, right_disp_, state, 0 );  
  5.  cvReleaseStereoGCState( &state );  

該方法速度超慢,但效果超好。

 

 

各方法理論可以參考文獻。


免責聲明!

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



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