目录
8.0 本章主要目标
8.1 直接法的引出
8.2 2D光流
8.3 实践:LK光流
8.3.1 使用LK光流
8.3.3 光流实践小结
8.4 直接法
8.4.1 直接法的推导
8.4.2 直接法的讨论
8.5 实践:直接法
8.5.1 单层直接法
8.5.2 多层直接法
8.5.3 结果讨论
8.5.4 直接法优缺点总结
8.0 本章主要目标
1.理解光流法跟踪特征点的原理
2.理解直接法是如何估计相机位姿的
3.实现多层直接法的计算
直接法是视觉里程计的另一个主要分支,它与特征点法有很大不同。虽然它还没有成为现在视觉里程计中的主流,但经过近几年的发展,直接法在一定程度上已经能和特征点法平分秋色。本讲,我们将介绍直接法的原理,并实现直接法中的核心部分。
8.1 直接法的引出
1.特征点法估计相机运动的缺点
Ⅰ.关键点的提取与描述子的计算非常耗时。
实践中,SIFT目前在CPU上是无法实时计算的,而ORB也需要近20毫秒的计算时长。如果整个SLAM以30毫秒/帧的速度运行,那么一大半时间都将花在计算特征点上。
Ⅱ.使用特征点时,忽略了除特征点以外的所有信息。一幅图像有几十万个像素,而特征点只有几百个。只使用特征点丢弃了大部分可能有用的图像信息。
Ⅲ.相机有时会运动到特征缺失的地方,这些地方往往没有明显的纹理信息。例如,有时我们会面对一堵白墙,或者一个空荡荡的走廊。这些场景下特征点数量会明显减少,我们可能找不到足够的匹配点来计算相机运动。
2.如何克服这些缺点
Ⅰ.保留特征点,但只计算关键点,不计算描述子。同时,使用光流法(Optical Flow)跟踪特征点的运动。这样可以回避计算和匹配描述子带来的时间,而光流本身的计算时间要小于描述子的计算与匹配。
Ⅱ.只计算关键点,不计算描述子。同时,使用直接法(Direct Method)计算特征点在下一时刻图像中的位置。这同样可以跳过描述子的计算过程,也省去了光流的计算时间。
3.光流法与直接法特点
光流法仍然使用特征点,只是把匹配描述子替换成了光流跟踪,估计相机运动时仍使用对极几何、PnP或ICP算法。这依然会要求提取到的关键点具有可区别性,即我们需要提到角点。
在直接法中,我们会根据图像的像素灰度信息同时估计相机运动和点的投影,不要求提取到的点必须为角点,它们甚至可以是随机的选点。
使用特征点法估计相机运动时,我们把特征点看作固定在三维空间的不动点。根据它们在相机中的投影位置,通过最小化重投影误差(Reprojection error)优化相机运动。在这个过程中,我们需要精确地知道空间点在两个相机中投影后的像素位置——这也就是我们要对特征进行匹配或跟踪的原因。同时,我们也知道,计算、匹配特征需要付出大量的计算量。相对地,在直接法中,我们并不需要知道点与点之间的对应关系,而是通过最小化光度误差(Photometric error)来求得它们。
直接法它是为了克服特征点法的上述缺点而存在的。直接法根据像素的亮度信息估计相机的运动,可以完全不用计算关键点和描述子。既避免了特征的计算时间,也避免了特征缺失的情况。只要场景中存在明暗变化(可以是渐变,不形成局部的图像梯度)直接法就能工作。根据使用像素的数量,直接法分为稀疏、稠密和半稠密三种。与特征点法只能重构稀疏特征点(稀疏地图)相比,直接法还具有恢复稠密或半稠密结构的能力。
8.2 2D光流
1.光流与直接法的关系
直接法是从光流演变而来的。它们非常相似,具有相同的假设条件。光流描述了像素在图像中的运动,而直接法则附带着一个相机运动模型。
2.什么是光流?
光流是一种描述像素随时间在图像之间运动的方法,如图8-1所示。随着时间的流逝,同一个像素会在图像中运动,而我们希望追踪它的运动过程。
其中,计算部分像素运动的称为稀疏光流,计算所有像素的称为稠密光流。
稀疏光流以Lucas-Kanade光流为代表,并可以在SLAM中用于跟踪特征点位置。
稠密光流以Horn-Schunck光流为代表。本节主要介绍Lucas-Kanade光流,也称为LK光流。