视觉里程计-直接法
直接法的引入
SLAM主要包含视觉部分和优化部分。视觉部分即为视觉里程计(VO),它是基于相邻图像信息推导出大致的相机运动轨迹,并为后续优化提供良好的初始估计。
VO 的实现方式按是否需要识别图像中的关键点可分为两类:一类是基于关键点检测的方法(即所谓的特征点法前端),另一类是不依赖关键点定位的技术(即所谓的直接法前端)。然而,在视觉里程计领域中这一方法占据主导地位的研究者们对它存在的几个主要缺陷的认识包括以下几点:
- 在提取关键点及计算描述子方面存在显著的时间开销。
- 仅关注特征点所带来的局限性尤为明显。
- 相机偶尔会被部署至仅具有限部特征的空间区域。
- 在图像处理中使用特征点时会遇到一个重要局限:图像中仅有数百个关键点与成千上万像素相比显得数量稀少。
- 当相机持续运行并尝试定位时往往需要在多个帧之间寻找匹配的关键点对以确定其位置与朝向。
- 避免这种情况的办法是引入更具描述性的局部空间不变量如尺度不变的块(SIFT)或快速位移变换(SURF)等算法。
- 这些算法能够有效减少对关键点依赖的同时还能保持较高的定位精度与鲁棒性。
- SIFT算法通过构建多尺度金字塔并结合平移不变特性实现了这一目标。
- 然而这些方法在纯CPU环境下运行速度仍显不足:SIFT在单核处理器上完成一次检测所需时间已超过20毫秒而实时处理难以实现。
- ORB作为一种改进型算法通过结合快速位移变换与最邻近搜索策略将运算速度提升到了每秒数十帧水平但仍无法完全替代SIFT方法
经分析发现,基于特征点的方法在实际应用中仍面临诸多挑战。针对上述缺陷, 已提出多种有效解决方案:
- 仅关注关键点而不处理特征描述符。通过光流法(Optical Flow)追踪特征点的位置变化;这种方法避免了因光流与特征匹配带来的耗时问题;然而由于其内部运算复杂度较高。
- 同样仅关注关键点而不处理特征描述符;采用快速算法来确定下一帧图像中的各关键点位置;这种方案省去了特征匹配阶段的时间开销,并且简化了运算过程。
- 完全摒弃对关键点多处理,在相机姿态估计中基于像素信息进行直接求解。
第一种方法仍然使用特征点,只是把匹配描述子替换成了光流跟踪 ,估计相机运动时仍使用PnP或ICP算法。而在,后两个方法中,我们会根据图像的像素信息 来计算相机运动,它们称为直接法 。
使用特征点法估计相机运动时,我们把特征点看作固定在三维空间的不动点。根据它们在相机中的投影位置,通过最小化重投影误差 (Reprojection error)来优化相机运动。在这个过程中,我们需要精确地知道空间点在两个相机中投影后的像素位置——这也就是我们为何要对特征进行匹配或跟踪的理由。而在直接法中,我们最小化的不再是重投影误差 ,而是测量误差 (Phometric error)。
直接法是本讲介绍的重点。它的存在就是为了克服特征点法的上述缺点(虽然它会引入另一些问题)。直接法直接根据像素亮度信息,估计相机的运动,可以完全不用计算关键点和描述子。于是,直接法既避免了特征的计算时间,也避免了特征缺失的情况。只要场景中存在明暗变化(可以是渐变,不形成局部的图像特征),直接法就能工作。
直接法的分类
根据 P 的来源,我们可以把直接法进行分类:
P 基于稀疏关键点而被定义为一种稀疏直接法。在实际应用中我们一般选取数百至数千个关键点来进行处理,并借鉴L-K光流算法的思想假设每个像素周围的像素值保持不变这一特性。值得注意的是这种基于直接匹配的方法完全避免了对特征描述子的计算仅利用数百至数千个像素进行匹配从而达到了最高的效率然而由于这种方法无法捕捉到连续区域的变化信息因此只能实现对离散区域的重构。
2. P 由部分像素构成。当像素梯度为零时,在计算运动增量方面没有贡献。因此,在实际应用中通常会优先选择具有明显梯度的像素点进行处理,并将这些区域定义为空间中的一个半稠密结构。
这被称为半稠密直接法(Semi-Dense Direct Method),它能够有效地重构出被观察物体的空间结构。
该算法以像素为单位进行处理,并被命名为稠密直接法(P为像素集合)。由于该方法需要对每个像素进行密集重建(通常涉及几十万至几百万个像素),因此在现有的CPU架构下难以实现实时运算,必须依赖于GPU的强大计算能力来进行加速。然而,在之前的讨论中已经指出,在运动估计过程中具有平滑梯度区域的像素对结果贡献较小,在重建过程中同样难以精确估计这些区域的三维位置变化。
可以看出, 包括从稀疏到稠密的重构在许多应用中都可以使用直接法进行计算, 其计算量逐步增加. 稀疏的方法能够高效地求解相机位姿, 而稠密的方法则能够构建出完整的地图信息. 在不同情况下选择合适的方法, 则取决于机器人的应用场景. 尤其是在低端计算平台中采用稀疏直接法能够显著提升效率, 这种情况适用于对实时性要求较高且资源有限的应用场景
历史上,在早期的一些研究者已经开始尝试使用直接法进行计算,但真正使该方法得到广泛应用的关键在于RGB-D相机的出现。随着基于直接法的开源项目(如SVO、LSD-SLAM等)逐步涌现并成熟起来,在单目相机领域也取得了显著的效果。这些项目的出现不仅推动了视觉里程计算技术的发展,在学术界也逐渐成为这一领域的核心方法之一。
直接法的推导

投影方程:

其中 Z₁ 表示点 P 在第一个相机中的深度,在第二个相机坐标系中该深度为 Z₂;根据空间重合关系可知 Z₂ 等于向量 RP 加上平移向量 t 后的第三分量
在直接法框架内,默认情况下认为同一三维空间点从不同视角拍摄时其亮度保持恒定。因此求解优化目标不再是传统的重投影误差(Reprojection Error),而是采用了更为精确地衡量图像观测质量的方法——测量误差(Photometric Error),即两个图像中对应点处像素强度的一致性。

优化该误差的目标函数:

直接法分类
在上述推导过程中提到了一个关键点:P代表的是一个具有固定位置的空间中的某一点。当我们在RGB-D相机系统下工作时,在任何给定时刻都可以将任一像素还原为三维空间中的一个对应点,并将其投射至下一幅图像上。值得注意的是,在单一视差系统(即单眼摄像头)中这一过程得以简化:尽管这些特征属于特征识别范畴,在直接法中并不需要计算描述子即可实现定位和匹配操作。基于来源的不同,则可将这些方法根据其应用场景进行分类:
- 基于稀疏特征点设计的算法被称为稀疏直接算法。
- 其中P由部分像素构成的方法被称作半稠密型直接方法。
- 当P包含所有像素时,则采用的是全像素密集型计算方法。
可以看出,在稀疏至稠密的重构过程中均适用直接法来进行计算。随着运算过程的发展这些方法所涉及的计算量呈递增趋势。其中在相机位姿估计方面表现出色的是稀疏方法;而对于环境细节感知则依赖于稠密方法来实现对完整地图的精确构建。
直接法的优缺点总结
最后,我们总结一下直接法的优缺点。大体来说,它的优点如下:
- 避免涉及复杂的特征提取和描述子计算。
- 仅需基于像素梯度进行运算。
- 能够生成从半到完全稠密的地图覆盖。
另一方面,它的缺点也很明显:
- 非凸性 。直接法完全依靠梯度搜索,降低目标函数来计算相机位姿。其目标函数中需要取像素点的灰度值,而图像是强烈非凸的函数。这使得优化算法容易进入极小,只在运动很小时直接法才能成功。
- 单个像素没有区分度 。找一个和他像的实在太多了!——于是我们要么计算图像块,要么计算复杂的相关性。由于每个像素对改变相机运动的“意见”不一致。只能少数服从多数,以数量代替质量。
- 灰度值不变是很强的假设 。如果相机是自动曝光的,当它调整曝光参数时,会使得图像整体变亮或变暗。光照变化时亦会出现这种情况。特征点法对光照具有一定的容忍性,而直接法由于计算灰度间的差异,整体灰度变化会破坏灰度不变假设,使算法失败。
