[双目视差] 立体匹配算法推理 - SGBM算法(一)
文章目录
- 立体匹配算法推理 - SGBM算法(一)
- 一、SGBM与SGM的区别
- 二、代价计算
立体匹配算法推理 - SGBM算法(一)
SGBM立体匹配算法,总体来讲包含以下6个步骤:
Preprocess ( GaussBlur , SobelX, …etc)
预处理Cost Compute ( AD, SAD, SSD, BT, NCC, Census, …etc)
代价计算Cost Aggregation ( Boxfilter, CBCA, WMF, MST, …etc)
代价聚合Cost Optimization ( BP, GC, HBP, CSBP, doubleBP, …)
代价优化Disparity Compute( WTA)
计算视差Postprocess ( MedianFilter, WeightMedianFilter, LR-check, …etc)
后处理
一般情况下,组合12356称为局部立体匹配算法, 12456称为全局立体匹配算法,区别在于是否构建全局能量优化函数。
一、SGBM与SGM的区别
回到今天的主题SGBM(Semi-Global Block Matching)算法,为什么要分析这个算法呢,原因有二:
算法核心为非常经典的SGM(Semi-Global Matching)算法;
SGBM算法自OpenCV2.4.6开始就已经被开源,非常的方便,并被广泛使用。
可能说到这里,大家可能还是不明白SGBM算和SGM算法的区别,那么直接看我自己整理的算法流程图:
看完这幅图以后,是不是对SGBM算法与SGM算法的区别有了清晰的认识呢?没错,SGM算法只是SGBM算法中的一个步骤,而SGBM中的“Block”其实就是将每一个代价(cost)值进行成块计算(领域求和运算)后用于SGM算法进行视差优化,是不是非常的简洁!
二、代价计算
从刚才的流程图中,我们可以看到SGBM算法的代价计算其实包含了如下基本步骤:
输入图像经过SobelX处理后,计算BT代价
输入图像直接计算BT代价值;
将上面两步的代价值进行融合;
对上述步骤得到的代价值进行成块处理。
对于第一种代价计算,SobelX大家很容易理解,就是对原图进行水平方向的梯度滤波,然后再进行BT代价值计算。但是,这里需要注意,这里得到的水平方向梯度并没有直接使用,而是进行了分段处理。BT代价值的计算公式可以参考论文《Depth Discontinuities by Pixel-to-Pixel Stereo》,直接按照论文中2.1.1小节中的计算公式敲代码即可。第二种代价就是直接在原图上进行BT的计算,那么这两种代价值有什么区别呢?,请看下图:
从两幅图可以看出,经过SobelX + BT后的代价保留了较多的边缘和细节信息,而直接从原图进行计算BT得到的代价值保留了更多的原图信息,因此两种代价的融合可以说是不但没有冲突,而且还相辅相成的提高了代价值的准确性,非常的赞。得到了前两步的代价值,便可以进行代价融合和代价成块,这里的代价融合便是将两种代价值进行简单的相加即可。
Tips:如果大家尝试自己编写这部分的代码,可能在结果上会有小小的不一样(如下图,在右上角的小熊旁边有条纹瑕疵现象),这与原图计算BT的方式有关
经过前面的分析和编码,就到了代价计算的最后一步,也是就是成块计算。在SGBM算法中,成块计算就是就是对每个像素的代价值用周围邻域代价值的总和来代替(类似SAD算法),提高匹配的鲁棒性,那么这里同样给出不同成块尺寸的结果图供大家参考:
上面三幅图可以看出,随着成块尺寸的变大,整体效果就越好,但是边缘也就变得越平滑,但仅凭代价计算就可以达到这么好的效果,还是很不错的。那么想要达到更好的效果要怎么办呢,就要回到本文的第一段内容所提到的立体匹配流程了。因为代价计算往往只能提高较好的初始视差图,想要得到更好的视差图还需要后面多个步骤的优化才可以,所以许多的代价聚合算法(CBCA等)或者全局优化算法便闪亮登场。
[双目视差] 立体匹配算法推理 - SGBM算法(一)相关推荐
- 立体视觉--双目相机立体校正(Bouguet算法)
双目相机立体校正(Bouguet算法) 在双目立体视觉的三维重建过程中,需要通过立体匹配算法来进行视差图的计算得到左右两幅图像的视差值,进而来计算深度来恢复场景的三维信息. 计算三维场景中目标点在左右 ...
- 基于基于全局差错能量函数的双目图像立体匹配算法matlab仿真,并提取图像的深度信息
目录 1.算法概述 2.仿真效果预览 3.核心MATLAB代码预览 4.完整MATLAB程序 1.算法概述 全局的能量函数公式如下: E(f)=Edata(f)+Esmooth(f) 其中,Edata ...
- python 立体匹配算法_OpenCV3.4两种立体匹配算法效果对比
以OpenCV自带的Aloe图像对为例: 1.BM算法(Block Matching) 参数设置如下: int numberOfDisparities = ((imgSize.width / 8) + ...
- OpenCv中实现了三种立体匹配算法:
OpenCv中实现了三种立体匹配算法: BM算法 SGBM算法 Stereo Processing by Semiglobal Matching and Mutual Information GC算法 ...
- 双目立体匹配算法SGBM
semi-global matching(SGM)是一种用于计算双目视觉中视差(disparity)的半全局匹配算法,在OpenCV中的实现为semi-global block matching(SG ...
- 基于深度学习算法和传统立体匹配算法的双目立体视觉
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 01 立体视觉是什么? 在开始之前,我相信很多站友都会有这个疑问, ...
- 双目立体视觉匹配算法-----SAD匹配算法、BM算法、SGBM算法、GC算法
一. SAD算法 1.算法原理 SAD(Sum of absolute differences)是一种图像匹配算法.基本思想:差的绝对值之和.此算法常用于图像块匹配,将每个像素对应数值 ...
- 双目立体匹配算法:Patch Match Stereo实用详解教程
来源:CSDN 作者:dulingwen 01 简介 我们知道,现有立体匹配算法一般被分类为局部算法.全局算法和半全局算法,其中局部算法和半全局算法是应用最为广泛的.在局部算法中,一个最简单的做法就是 ...
- sgbm算法_关于双目立体视觉的三大基本算法及发展现状的总结
作者:何文博 来源:公众号 @3D视觉工坊 链接:关于双目立体视觉的三大基本算法及发展现状的总结 双目立体视觉一直是机器视觉研究领域的发展热点和难点,"热"是因为双目立体视觉有着及 ...
最新文章
- python的for语句条件_Python中的条件选择和循环语句
- 转载 oracle12c 切换字符集
- 软件层面可以做到重启本地串口吗_手机关机还是重启好?get这几招,手机更流畅...
- tomcat jdbc SlowQueryReport的实现解读
- 抛弃NVelocity,来玩玩Razor
- linux命令:watch 、lsmod、mdadm 创建软RAID
- python中metaclass的理解
- SpringNote01.基于SpringMVC-Hibernate的Blog系统
- 多类 SVM 的损失函数及其梯度计算
- Understanding, Operating and Monitoring Apache Kafka
- 中常用的数据结构_代码面试需要知道的8种数据结构(附面试题及答案链接)
- 老王python培训视频教程完整版
- 体检套餐管理系统 C#
- 基于模型的约束排序,并探究OTUs对pH的响应特征——单峰or线性?
- on one's own用法
- umass计算机硕士,麻省旗舰马萨诸塞大学阿默斯特分校 计算机科学强势
- 八年级上学期计算机教学计划,第一学期七八年级信息技术教学计划
- 2022.05.20-电脑切换全屏与非全屏(特别是谷歌浏览器)的时候会发生卡顿黑屏
- 计算机辅助电路小结,电子电路计算机辅助设计实训报告.doc
- 英特尔400系列服务器芯片组,Intel 400晶片组家族、对应Z490主机板型号曝光,搭配10代Comet Lake-S处理器必备 – 穷极领域...