欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV三种立体匹配求视差图算法总结

发布时间:2025/7/25 编程问答 36 豆豆
生活随笔 收集整理的这篇文章主要介绍了 OpenCV三种立体匹配求视差图算法总结 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

FROM: http://blog.csdn.net/mailang2008/article/details/5873883


对OpenCV中涉及的三种立体匹配算法进行代码及各自优缺点总结:

首先我们看一下BM算法:

该算法代码:

[cpp]view plaincopy
  • CvStereoBMState *BMState = cvCreateStereoBMState();  
  •   
  • int SADWindowSize=15;   
  •  BMState->SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 9;  
  •  BMState->minDisparity = 0;  
  •  BMState->numberOfDisparities = 32;  
  •  BMState->textureThreshold = 10;  
  •  BMState->uniquenessRatio = 15;  
  •  BMState->speckleWindowSize = 100;  
  •  BMState->speckleRange = 32;  
  •  BMState->disp12MaxDiff = 1;  
  •  cvFindStereoCorrespondenceBM( left, right, left_disp_,BMState);  
  •    cvNormalize( left_disp_, left_vdisp, 0, 256, CV_MINMAX );  
  • 其中minDisparity是控制匹配搜索的第一个参数,代表了匹配搜苏从哪里开始,numberOfDisparities表示最大搜索视差数uniquenessRatio表示匹配功能函数,这三个参数比较重要,可以根据实验给予参数值。

    该方法速度最快,一副320*240的灰度图匹配时间为31ms,视差图如下。

     

    第二种方法是SGBM方法这是OpenCV的一种新算法:

    [cpp]view plaincopy
  • cv::StereoSGBM sgbm;  
  •         sgbm.preFilterCap = 63;  
  •         int SADWindowSize=11;   
  •         int cn = 1;  
  •         sgbm.SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 3;  
  •         sgbm.P1 = 4*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;  
  •         sgbm.P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;  
  •         sgbm.minDisparity = 0;  
  •         sgbm.numberOfDisparities = 32;  
  •         sgbm.uniquenessRatio = 10;  
  •         sgbm.speckleWindowSize = 100;  
  •         sgbm.speckleRange = 32;  
  •         sgbm.disp12MaxDiff = 1;  
  •       
  •         sgbm(left , right , left_disp_);  
  •         sgbm(right, left  , right_disp_);  
  •  

    各参数设置如BM方法,速度比较快,320*240的灰度图匹配时间为78ms,视差效果如下图。

     

     

    第三种为GC方法:

    [cpp]view plaincopy
  • CvStereoGCState* state = cvCreateStereoGCState( 16, 2 );  
  •  left_disp_  =cvCreateMat( left->height,left->width, CV_32F );  
  •  right_disp_ =cvCreateMat( right->height,right->width,CV_32F );  
  •  cvFindStereoCorrespondenceGC( left, right, left_disp_, right_disp_, state, 0 );  
  •  cvReleaseStereoGCState( &state );  
  • 该方法速度超慢,但效果超好。

     

     

    各方法理论可以参考文献。

    总结

    以上是生活随笔为你收集整理的OpenCV三种立体匹配求视差图算法总结的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。