python 立体匹配算法_OpenCV3.4两种立体匹配算法效果对比

以OpenCV自带的Aloe图像对为例:

 

  

1.BM算法(Block Matching)

参数设置如下:

int numberOfDisparities = ((imgSize.width / 8) + 15) & -16;

cv::Ptr<:stereobm> bm = cv::StereoBM::create(16, 9);

cv::Rect roi1, roi2;

bm->setROI1(roi1);

bm->setROI2(roi2);

bm->setPreFilterCap(31);

bm->setBlockSize(9);

bm->setMinDisparity(0);

bm->setNumDisparities(numberOfDisparities);

bm->setTextureThreshold(10);

bm->setUniquenessRatio(15);

bm->setSpeckleWindowSize(100);

bm->setSpeckleRange(32);

bm->setDisp12MaxDiff(1);

bm->compute(imgL, imgR, disp);

效果如下:

BM算法得到的视差图(左),空洞填充后得到的视差图(右)

2.SGBM(Semi-Global Block matching)算法:

参数设置如下:

enum { STEREO_BM = 0, STEREO_SGBM = 1, STEREO_HH = 2, STEREO_VAR = 3, STEREO_3WAY = 4};int numberOfDisparities = ((imgSize.width / 8) + 15) & -16;

cv::Ptr<:stereosgbm> sgbm = cv::StereoSGBM::create(0, 16, 3);

sgbm->setPreFilterCap(63);int SADWindowSize = 9;int sgbmWinSize = SADWindowSize > 0 ? SADWindowSize : 3;

sgbm->setBlockSize(sgbmWinSize);int cn =imgL.channels();

sgbm->setP1(8 * cn*sgbmWinSize*sgbmWinSize);

sgbm->setP2(32 * cn*sgbmWinSize*sgbmWinSize);

sgbm->setMinDisparity(0);

sgbm->setNumDisparities(numberOfDisparities);

sgbm->setUniquenessRatio(10);

sgbm->setSpeckleWindowSize(100);

sgbm->setSpeckleRange(32);

sgbm->setDisp12MaxDiff(1);int alg =STEREO_SGBM;if (alg ==STEREO_HH)

sgbm->setMode(cv::StereoSGBM::MODE_HH);else if (alg ==STEREO_SGBM)

sgbm->setMode(cv::StereoSGBM::MODE_SGBM);else if (alg ==STEREO_3WAY)

sgbm->setMode(cv::StereoSGBM::MODE_SGBM_3WAY);

sgbm->compute(imgL, imgR, disp);

效果如图:

SGBM算法得到的视差图(左),空洞填充后得到的视差图(右)

可见SGBM算法得到的视差图相比于BM算法来说,减少了很多不准确的匹配点,尤其是在深度不连续区域,速度上SGBM要慢于BM算法。OpenCV3.0以后没有实现GC算法,可能是出于速度考虑,以后找时间补上对比图,以及各个算法的详细原理分析。

后面我填充空洞的效果不是很好,如果有更好的方法,望不吝赐教。

preFilterCap()匹配图像预处理

两种立体匹配算法都要先对输入图像做预处理,OpenCV源码中中调用函数 static void prefilterXSobel(const cv::Mat& src, cv::Mat& dst, int preFilterCap),参数设置中preFilterCap在此函数中用到。函数步骤如下,作用主要有两点:对于无纹理区域ÿ

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
立体匹配算法中的SGBM是指Stereo Processing by Semiglobal Matching and Mutual Information,它是一种全局匹配算法。相比于局部匹配算法,SGBM在匹配效果上表现更好,但同时也具有更高的复杂度。SGBM的原理主要参考了Stereo Processing by Semiglobal Matching and Mutual Information算法。在实际应用中,立体匹配算法应该在极线/立体校正后应用,以获得最佳效果。 在Python中,可以使用OpenCV库来实现SGBM算法立体匹配OpenCV提供了相关的接口和函数用于处理立体匹配。可以通过调用cv2.StereoSGBM_create()函数来创建一个SGBM对象,并使用该对象的compute()函数来计算立体匹配的结果。在计算之前,需要预先对图像进行极线/立体校正以及其他必要的预处理操作。 以下是一个使用PythonOpenCV实现SGBM算法的简单示例代码: ```python import cv2 # 读取左右两张图像 left_image = cv2.imread('left_image.png', 0) right_image = cv2.imread('right_image.png', 0) # 创建SGBM对象 sgbm = cv2.StereoSGBM_create() # 设置SGBM参数 sgbm.setMinDisparity(0) sgbm.setNumDisparities(16) sgbm.setBlockSize(5) sgbm.setDisp12MaxDiff(1) sgbm.setUniquenessRatio(10) sgbm.setSpeckleWindowSize(100) sgbm.setSpeckleRange(32) # 计算立体匹配 disparity_map = sgbm.compute(left_image, right_image) # 显示立体匹配结果 cv2.imshow('Disparity Map', disparity_map) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例中,我们首先读取了左右两张图像,并创建了一个SGBM对象。然后,通过设置SGBM对象的参数,如最小视差、视差范围、块大小等,来对算法进行配置。接下来,我们使用compute()函数来计算立体匹配的结果。最后,我们将计算得到的视差图像显示出来。 请注意,这只是一个简单的示例代码,实际使用中可能需要根据具体情况进行参数调整和其他额外的处理步骤。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [立体匹配成像算法BM,SGBM,GC,SAD一览](https://blog.csdn.net/Yong_Qi2015/article/details/120520626)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [三维重建(10)之立体匹配算法详解:BM、SGBM](https://blog.csdn.net/yohnyang/article/details/127706084)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值