基于python的opencv中SGBM立体匹配算法实现


前言

   SGBM的核心是SGM算法,自OpenCV2.4.6开始就已经被开源,非常的方便,并被广泛使用。


一、SGBM和SGM的区别?

   参考大佬的文章:立体匹配算法推理笔记 - SGBM算法(一)
            【算法】OpenCV-SGBM算法及源码的简明分析
  原始的SGM算法流程如下:
在这里插入图片描述

   SGBM的算法流程如下:
在这里插入图片描述
   对比之后可以发现,SGBM和SGM区别的地方在于匹配代价的计算:SGBM采用的是SAD-BT,而SGM采用的是MI。

1.预处理

   SGBM采用水平Sobel算子进行图像预处理,公式为
Sobel(x,y)=2[P(x+1,y)-P(x-1,y)]+ P(x+1,y-1)-P(x-1,y-1)+ P(x+1,y+1)-P(x-1,y+1)
   将x-sobel算子的结果做一个映射[0,preFilterCap*2],preFilterCap 为一个常数参数。
在这里插入图片描述

2.代价计算

 代价有两部分组成:
1、经过预处理得到的图像的梯度信息
2、经过基于采样的方法得到的梯度代价。
3、原图像经过基于采样的方法得到的SAD代价,因为BT代价是一维匹配,所以通常要结合SAD的思路,采用邻域求和的方法,计算SAD-BT,这样计算出来的代价就是局部块代价,每个像素点的匹配代价会包含周围局部区域的信息。
在这里插入图片描述
在这里插入图片描述

3.动态规划

  动态规划算法本身存在拖尾效应,视差突变处易产生错误的匹配,利用态规划进行一维能量累积累,会将错误的视差信息传播给后面的路径上。半全局算法利用多个方向上的信息,试图消除错误信息的干扰,能明显减弱动态规划算法产生的拖尾效应。
  半全局算法试图通过影像上多个方向上一维路径的约束,来建立一个全局的马尔科夫能量方程,每个像素最终的匹配代价是所有路径信息的叠加,每个像素的视差选择都只是简单通过 WTA(Winner Takes All)决定的。
在这里插入图片描述
其中动态规划很重要两个参数P1,P2是这样设定的:
P1 =8cnsgbm.SADWindowSizesgbm.SADWindowSize;
P2 = 32
cnsgbm.SADWindowSizesgbm.SADWindowSize;
cn是图像的通道数, SADWindowSize是SAD窗口大小,数值为奇数。

4.后处理

opencvSGBM的后处理包含以下几个步骤:
唯一性检测
亚像素插值
左右一致性检测
连通区域的检测

二、SGBM的python-opencv的实现

  使用python-opencv的结果如下,已经写好,大家直接下载就好了。
基于python-opencv实现SGBM

在这里插入图片描述
  此外,还增加了wls滤波,增加图形连接效果。
在这里插入图片描述
  直接修改图片位置即可运行,如下:
在这里插入图片描述
使用wls滤波:设置use_wls = True即可,在这里插入图片描述
为了方便使用,增加了SGBM_slider.py,直接替换图片文件即可,方便大家观察参数效果,直接下载运行即可,运行结果如下:
基于python-opencv实现SGBM,带有滑动窗口
在这里插入图片描述


SGBM 参数选择

在这里插入图片描述

参考文章

参考几位大佬的文章,非常不错!
opencv中的SGBM原理+参数解释
【算法】OpenCV-SGBM算法及源码的简明分析
双目立体匹配算法SGBM
Python SGBM

  • 14
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
立体匹配算法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 ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张Tt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值