双目立体匹配_SGM算法

视觉感知使人类能非接触地感知三维空间,通过大脑处理快速推断出周围环境的空间特性,从而执行一些生存所需的关键任务,如在环境中移动、识别和抓取物体等等。由于图像是三维世界的二维投影,因此图像采集过程会丢失深度这一重要的场景线索,使机器无法实现对真实场景的充分理解。与二维图像相比,三维信息能够更真实地反映客观物体,提供更丰富的信息。随着视觉系统研究的深入和计算机硬件的快速发展,人们希望机器不仅只是检测并识别目标,还应该具有三维空间感知与认知能力,能够在真实三维世界中进行自主移动与智能交互,计算机视觉技术逐渐进入三维感知阶段。

三维视觉是一个计算机视觉、计算机图形学、摄影测量以及机器人等领域交叉融合的研究方向,旨在帮助计算机更全面地理解三维空间场景。得益于三维传感技术、卷积神经网络以及计算机图形学等学科的飞速发展,三维视觉技术的理论研究及实际应用都得到了迅猛发展,已经成为人工智能领域的研究热点。三维视觉的主要研究内容可分为四个方面:三维感知、位姿感知、三维建模和三维理解,而无论是基本的三维物体识别还是高精度的三维建模都必须先获得真实世界的三维信息。

立体视觉是被动式三维视觉方法中一种重要的深度感知技术,其目的是从不同视点获取的两幅或多幅图像中恢复出场景的三维结构。双目立体视觉使用两个同型号摄像机同步拍摄得到同一场景的两视角图像,利用左右图像间的视差可以直接恢复深度。由于双目立体视觉成本低廉、结构简单、实用性好等特点,被广泛应用于工业测量、智能机器人、无人驾驶系统、医学诊断、数字城市建模、体感娱乐等,在学术界和工业界都极具研究意义。


文章目录

  • 双目立体匹配_SGM算法
  • 一、研究问题
  • 二、KITTI数据集简介
  • 三、SGM算法步骤
    • 第1步:设置超参数algorithm、cost、disparity、radius。
    • 第2步:计算视差匹配代价体。
    • 第3步:基于四方向正则化约束进行代价聚合
  • 四、实验结果
  • 五、源代码

一、研究问题

双目立体匹配是计算机视觉的经典问题,主要任务是寻找双目图像对中同名点的对应关系,并利用三角测量原理恢复图像深度信息。


双目立体视觉是对人类视觉系统的模拟。由于人的双目之间存在水平间距,当物体在视网膜上成像时,同一物体在左右眼的物象存在轻微差异,通过大脑高级中枢的处理使人能感知空间场景的深度。将从有一定距离的两个点上观察同一个目标所产生的方向差异称为视差,现实中的双目系统经过校准后将只存在水平视差。一个完整的双目立体视觉系统通常由相机标定、立体校正、立体匹配、三维重建这四个部分组成,而稠密准确的视差估计,是立体视觉系统实现三维重建的重要前提。

二、KITTI数据集简介

KITTI Stereo数据集是使用经过校准的双目相机与车载激光雷达在真实室外场景中采集的一个小型数据集,可以测试算法针对室外真实场景的匹配精度与实时性,广泛应用于视差估计、目标检测、语义分割等领域。由于室外场景中包含大量车辆、行人、路标以及周围的房屋和树木等,极具挑战性和多样性。


KITTI Stereo数据集中包含KITTI 2012和KITTI2015两个子数据集。KITTI2012数据集中包含194对具有稀疏真实视差图的立体图像作为训练集,195对没有真实视差图的立体图像作为测试集,图片大小为(1240, 375),且同时给出了灰度和彩色图像。KITTI2015数据集扩充了车辆玻璃高光反射时的判断以及车辆在运动时拍摄的情况,训练集和测试集都包含200对立体图像,图片大小均为(1242, 375)。其中训练集的真实视差图中只提供了不到50%的稀疏真实视差,测试集没有提供真实视差图。

true_disp = Image.open(args.gt)
true_disp = np.array(true_disp)
# print(true_disp.shape):(375, 1242)
# 一直有个难以理解的地方,KITTI_stereo数据集中视差图存储的数值到底是何含义,为什么通用处理代码都需要除以256
# print(np.min(true_disp), np.max(true_disp), np.mean(true_disp))
# 0 16406 1659.2997724100912
# 在除以256后,true_disp最大视差值在64附近
true_disp = true_disp / 256


值得注意的是,在用Image库读取disp_occ_0文件夹视差图时,要对视差矩阵数值除以256,才能转化为真实的视差值。

三、SGM算法步骤

第1步:设置超参数algorithm、cost、disparity、radius。

其中algorithm可选择的值有"WTA"、“SGM”,代表是否添加四方向正则化约束。cost可选择的值有“SSD”、“SAD”、“NCC”,代表匹配代价的三种计算方式。disparity代表最大视差尺度,构建得到的视差匹配代价体维度为(H, W, D)。radius代表滑动窗口半径。

第2步:计算视差匹配代价体。

将左右目图像转化成灰度图形式,选择尺寸为radius的窗口进行滑动匹配,依次计算两两窗口之间的匹配代价,匹配代价的计算可使用SSD、SAD、NCC公式。最大视差尺度选择为disparity。

在每个视差尺度上都计算得到一个代价图,最终拼接得到一个尺寸为(H, W, D)的视差代价体。

第3步:基于四方向正则化约束进行代价聚合

传统立体匹配算法将其转化寻找最小化能量函数的图D问题,D可为深度图或视差图,因此立体匹配又被成为视差估计、深度估计。


其中,x和y是图像像素,x=(i, j)是像素x的图像坐标,dx是x处的视差候选值,该式第一项为立体匹配的数据项C,一般通过匹配代价计算和匹配代价聚合构造3D匹配代价量(Cost Volume),C(x, dx)表示x像素的视差等于dx时的代价,Nx是x附近的像素集合。

根据计算结果可以找到一个粗糙的视差图,但结果中会存在大量误匹配,因此立体匹配算法中常定义一个正则项Es用于施加各种约束并寻找最小化式的最优视差图。通过借助各种先验的几何约束条件构建合理的正则项,可以有效降低匹配难度和误匹配率,提高匹配精度和效率。正则项的构造可采用如下方式,Nx取为像素x的四邻域位置:

此时能量函数最小化是一个二维最优问题,可通过搜索进行处理。为了更高效的解决这个二维最优化问题,SGM算法利用基于类似扫描线或者叫单方向动态规划的方法,使用一维路径聚合的方式来近似二维最优。

四、实验结果

由于SGM是无监督算法,且KITTI2015数据集中只有训练文件夹包含真实视差图,测试文件夹不包含真实视差图,所以我们先从KITTI2015训练文件夹中选择一对双目图像进行算法测评。


根据实验组的计算结果,我们将SGM算法超参数设定为SGM、NCC、disparity=64、radius=6,计算得到代价计算后的视差图(algorithm=“WTA”)、代价聚合后的视差图(algorithm=“SGM”),效果如下:




其中第一幅图为只使用视差代价计算得到的结果,第二幅图为使用视差代价计算+视差代价聚合得到的结果,第三幅图为真实稀疏视差图。

在开发环境python=3.6、opencv-python=4.5.5.64、Ubuntu20.04LTS、Intel® Core™ i7-9700 CPU@3.00GHz条件下,SGM算法耗时35.7543秒,原始图像尺寸(375, 1242),将视差精度表示为视差偏差在3像素以内(包括3像素)的像素占所有有效像素(含视差真值)的比例,计算得到SGM算法视差精度为87.68%。

最后对KITTI2015数据集训练文件夹的200对双目图像都进行预测,测试SGM算法平均性能,计算视差偏差3像素以内(包括3像素)的像素占所有有效像素的比例,得到平均双目匹配精度为86.454%。

五、源代码

如果需要源代码,或者想直接使用数据集,可以去我的主页寻找项目链接,以上代码和实验结果都由本人亲自实验得到:
https://blog.csdn.net/Twilight737

双目立体匹配_SGM算法相关推荐

  1. 双目立体匹配 等 算法 论文 综述 全局局部算法 CSCA NLCA SegmentTree树 DoubleBP Belief-Propagation AD-Census SGM

    双目立体匹配 等 算法 论文 综述 本文GITHUB 博文末尾支持二维码赞赏哦 _ 双目立体视觉技术实质就是模拟人的双眼视觉处理系统来处理通过摄像机采集所 获取的图像,它利用两台或多台摄像机在一定约束 ...

  2. 双目立体匹配经典算法之Semi-Global Matching(SGM)概述:匹配代价计算之互信息(Mutual Information,MI)...

      半全局立体匹配算法Semi-Global Matching,SGM由学者Hirschmüller在2005年所提出1,提出的背景是一方面高效率的局部算法由于所基于的局部窗口视差相同的假设在很多情况 ...

  3. python 立体匹配_手写双目立体匹配 SGM 算法(下)

    上节的内容主要对 SGM 算法的匹配代价体 (Cost Volume) 进行了详细介绍,发现如果只寻找逐个像素匹配代价的最优解会使得视差图对噪声特别敏感.因此在能量方程中考虑使用该点像素的邻域视差数据 ...

  4. 双目立体匹配 Census

    上一篇介绍了双目立体匹配SAD算法,这一篇介绍Census算法. Census原理: 在视图中选取任一点,以该点为中心划出一个例如3 × 3 的矩形,矩形中除中心点之外的每一点都与中心点进行比较,灰度 ...

  5. 示例程序:关于双目视觉,标定,立体匹配(视差算法),点云,双目三维重建的原理以及代码

    Evision双目视觉 关于双目视觉的一些总结 说明 前言 相机模型 标定 视差算法:立体匹配 测量,三维重建 示例程序 参考文献 关于双目视觉的一些总结 说明 如果读者对于本文或者Evision程序 ...

  6. 立体匹配成像算法BM,SGBM,GC,SAD一览

    本文转自|新机器视觉 在深度相机的主流技术方案Structure Light,ToF,Stereo Dual)中,主动双目成像方案可以基于低成本的硬件,获得高分辨率.高精度的深度图像,但是立体匹配算法 ...

  7. 真实场景的双目立体匹配(Stereo Matching)获取深度图详解

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左.右 ...

  8. 双目立体匹配流程详解

    原文链接 https://www.cnblogs.com/riddick/p/8486223.html 真实场景的双目立体匹配(Stereo Matching)获取深度图详解 双目立体匹配一直是双目视 ...

  9. 双目立体匹配_DispNet网络

    双目立体匹配_DispNet网络 19世纪,物理学家Wheaston偶然发现,如果两眼同时看到两块金属板上反射的稍有不同的蜡烛火焰图像,融合后就会产生实体感,他将这一深度感知现象称为"立体视 ...

最新文章

  1. Hibernate5-双向关联-多对多(n:n)
  2. Windows保护模式学习笔记(十三)—— PWTPCD
  3. java日历记事本ppt_JAVA做的日历记事本
  4. 社区生鲜领军者钱大妈携手神策数据,加速线上线下精准导流促增长
  5. jzoj6297-世界第一的猛汉王【切比雪夫距离,扫描线】
  6. Spring MVC Boot Cloud 技术教程汇总
  7. java中public private_java中public、private、protected区别
  8. 深入理解 Objective-C:方法缓存
  9. 字母绝对值python怎么表示_【怎样求用字母表示的数的绝对值?】作业帮
  10. libjpeg-turbo在Windows VS2010下的编译
  11. 阿里将开源进行到底!
  12. 记一次艰辛的vsftpd搭建,排错过程
  13. ASP.NET MVC:WebViewPage.cs
  14. Spring 事务的那些坑,都在这里了!
  15. Python实现WGS 84坐标与web墨卡托投影坐标的转换
  16. 【路径规划】基于matlab GUI人工势场算法机器人避障路径规划(手动设障)【含Matlab源码 617期】
  17. mov转换成mp4,详细步骤
  18. 计算机英语口语900句,日常英语口语900句
  19. 立创EDA导出Altium Designer的pcb文件没有没有显示飞线
  20. css 手风琴_如何创建基于CSS的内容手风琴

热门文章

  1. Docker(五)创建本地镜像
  2. Excel多条件筛选、公式填充
  3. mysql删除匿名,初始化MySQL用户(删除匿名用户)
  4. python创建匿名函数_Python练习实例48 | 使用lambda来创建匿名函数。
  5. API数据传输,flask发送接收两种方式/cryptography is required for sha256_password or caching_sha2_password
  6. [转载]史上最暗无天日的“儿皇帝”时代
  7. 玩转实名认证 让您的信息更安全
  8. 学习笔记:Python 面试100讲(基于Python3.x)05-python综合题
  9. chrome 41版后在win7下收藏栏、标签栏、右键菜单等地方字体发虚:解决方法
  10. 使用路由器给实验室搭建FTP服务器的经历