文章目录
- 前言
- 一、SGBM和SGM的区别?
- 1.预处理
- 2.代价计算
- 3.动态规划
- 4.后处理
 
- 二、SGBM的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)](https://img-blog.csdnimg.cn/83532d1e584341ecacc4395a305f15cd.png)
    将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 = 32cnsgbm.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








![[附源码]JAVA毕业设计疫情防控期间网上教学管理(系统+LW)](https://img-blog.csdnimg.cn/d22c1363adc941338f59bdf1044b6645.png)







![[附源码]Python计算机毕业设计SSM基于的汉服服装租赁系统(程序+LW)](https://img-blog.csdnimg.cn/65e354d847644376830d378b25aebfe9.png)
![[附源码]Python计算机毕业设计Django大学生志愿者服务管理系统](https://img-blog.csdnimg.cn/1299e3b81b0c4deb881c95eaf162cf88.png)

