双目立体匹配_SGM算法

双目立体匹配_SGM算法

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

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

在这里插入图片描述

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


一、研究问题

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

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

二、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 [email protected]条件下,SGM算法耗时35.7543秒,原始图像尺寸(375, 1242),将视差精度表示为视差偏差在3像素以内(包括3像素)的像素占所有有效像素(含视差真值)的比例,计算得到SGM算法视差精度为87.68%。

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

五、源代码

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

猜你喜欢

转载自blog.csdn.net/Twilight737/article/details/127249296
今日推荐