OpenCV3.0立体匹配算法对比研究(SGBM、BM、GC)

转自https://blog.csdn.net/cxgincsu/article/details/74451940

立体匹配算法对比研究

引言:基于OpenCV3.0,对BM、SGBM和GC算法进行了对比测试研究。由于SGBM算法视差效果好速度快的特点,常常被广泛应用和改进,本文针对SGBM算法主要参数设置作了对比测试,以供大家参考。

BM:Block Matching ,采用SAD方法计算匹配代价;

SGBM:  修改自Heiko Hirschmuller的《Stereo Processing by Semi-global Matching and Mutual Information》;

                 与原方法不同点:

  1.  没有实现原文中基于互信息的匹配代价计算,而是采用BT算法("Depth Discontinuities by Pixel-to-Pixel Stereo" by S. Birchfield and C. Tomasi);
  2.  默认运行单通道DP算法,只用了5个方向,而fullDP使能时则使用8个方向(可能需要占用大量内存);
  3.  增加了一些BM算法中的预处理和后处理程序;

GC:OpenCV3.0中没有实现,可以在OpenCV以下版本中找到。该方法效果是最好的,但是速度太慢,不能达到实时的匹配效率;

1、SGBM

主要参数:minDisparity 、numDisparities、blockSize、P1、P2。其他参数设置参照http://blog.csdn.net/zhubaohua_bupt/article/details/51866567

代码:


  
  
  1. #include "stdafx.h"
  2. #include "opencv2/opencv.hpp
  3. using namespace std;
  4. using namespace cv;
  5. int _tmain(int argc, _TCHAR* argv[])
  6. {
  7. Mat left = imread("imgL.jpg ", IMREAD_GRAYSCALE);
  8. Mat right = imread("imgR.jpg ", IMREAD_GRAYSCALE);
  9. Mat disp;
  10. int mindisparity = 0;
  11. int ndisparities = 64;
  12. int SADWindowSize = 11;
  13. //SGBM
  14. cv::Ptr<cv::StereoSGBM> sgbm = cv::StereoSGBM::create(mindisparity, ndisparities, SADWindowSize);
  15. int P1 = 8 * left.channels() * SADWindowSize* SADWindowSize;
  16. int P2 = 32 * left.channels() * SADWindowSize* SADWindowSize;
  17. sgbm->setP1(P1);
  18. sgbm->setP2(P2);
  19. sgbm->setPreFilterCap(15);
  20. sgbm->setUniquenessRatio(10);
  21. sgbm->setSpeckleRange(2);
  22. sgbm->setSpeckleWindowSize(100);
  23. sgbm->setDisp12MaxDiff(1);
  24. //sgbm->setMode(cv::StereoSGBM::MODE_HH);
  25. sgbm->compute(left, right, disp);
  26. disp.convertTo(disp, CV_32F, 1.0 / 16); //除以16得到真实视差值
  27. Mat disp8U = Mat(disp.rows, disp.cols, CV_8UC1); //显示
  28. normalize(disp, disp8U, 0, 255, NORM_MINMAX, CV_8UC1);
  29. imwrite("results/SGBM.jpg ", disp8U);
  30. return 0;
  31. }

minDisparity:最小视差,默认为0。此参数决定左图中的像素点在右图匹配搜索的起点,int 类型;

numDisparities:视差搜索范围长度,其值必须为16的整数倍。最大视差 maxDisparity = minDisparity + numDisparities -1;

blockSize:SAD代价计算窗口大小,默认为5。窗口大小为奇数,一般在3*3 到21*21之间;

P1、P2:能量函数参数,P1是相邻像素点视差增/减 1 时的惩罚系数;P2是相邻像素点视差变化值大于1时的惩罚系数。P2必须大于P1。需要指出,在动态规划时,P1和P2都是常数。

一般建议:P1 = 8*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;P2 = 32*cn*sgbm.SADWindowSize*sgbm.SADWindowSize;



tsukuba_left.jpgtsukuba_right.jpg
SADWindowSize = 5SADWindowSize = 11SADWindowSize = 21

P1 = 8 , P2 = 10P1 = 8 , P2 = 32P1 = 8 , P2 = 64
MODE_SGBM(5方向)MODE_HH(8方向)


总结:

1. blockSize(SADWindowSize) 越小,也就是匹配代价计算的窗口越小,视差图噪声越大;blockSize越大,视差图越平滑;太大的size容易导致过平滑,并且误匹配增多,体现在视差图中空洞增多;
2. 惩罚系数控制视差图的平滑度,P2>P1,P2越大则视差图越平滑;
3. 八方向动态规划较五方向改善效果不明显,主要在图像边缘能够找到正确的匹配;


2、BM

代码:


  
  
  1. #include "stdafx.h"
  2. #include "opencv2/opencv.hpp"
  3. using namespace std;
  4. using namespace cv;
  5. int _tmain( int argc, _TCHAR* argv[])
  6. {
  7. Mat left = imread( "imgL.jpg", IMREAD_GRAYSCALE);
  8. Mat right = imread( "imgR.jpg", IMREAD_GRAYSCALE);
  9. Mat disp;
  10. int mindisparity = 0;
  11. int ndisparities = 64;
  12. int SADWindowSize = 11;
  13. cv::Ptr<cv::StereoBM> bm = cv::StereoBM::create(ndisparities, SADWindowSize);
  14. // setter
  15. bm->setBlockSize(SADWindowSize);
  16. bm->setMinDisparity(mindisparity);
  17. bm->setNumDisparities(ndisparities);
  18. bm->setPreFilterSize( 15);
  19. bm->setPreFilterCap( 31);
  20. bm->setTextureThreshold( 10);
  21. bm->setUniquenessRatio( 10);
  22. bm->setDisp12MaxDiff( 1);
  23. copyMakeBorder(left, left, 0, 0, 80, 0, IPL_BORDER_REPLICATE); //防止黑边
  24. copyMakeBorder(right, right, 0, 0, 80, 0, IPL_BORDER_REPLICATE);
  25. bm->compute(left, right, disp);
  26. disp.convertTo(disp, CV_32F, 1.0 / 16); //除以16得到真实视差值
  27. disp = disp.colRange( 80, disp.cols);
  28. Mat disp8U = Mat(disp.rows, disp.cols, CV_8UC1);
  29. normalize(disp, disp8U, 0, 255, NORM_MINMAX, CV_8UC1);
  30. imwrite( "results/BM.jpg", disp8U);
  31. return 0;
  32. }
SADWindowSize = 5SADWindowSize = 21SADWindowSize = 31SADWindowSize = 41

3、GC

OpenCV3.0暂未实现GC算法,这里直接贴出结果(来自:http://www.cnblogs.com/polly333/p/5130375.html



总结:

SGBMBMGC

视差效果:BM < SGBM < GC;

处理速度:BM > SGBM > GC ;


参考:

http://www.cnblogs.com/polly333/p/5130375.html

http://www.cnblogs.com/polly333/p/5130375.html

http://blog.csdn.net/u014493244


  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值