【视觉SLAM十四讲】第8-9讲 视觉里程计2

8.1 直接法的引出

上一讲讲的都属于特征点法,不难发现,关键点法的核心是匹配,用两帧图像中的匹配点,去计算两帧图像之间的变换关系,也就是说需要有匹配的两个点,这个匹配点的计算本身也是需要时间。此外,特征点法只考虑了特征点信息,其它的信息完全没有考虑,相当于丢弃了许多可能有用的信息。而且相机有时候会遇见特征缺失的地方,比如说特征缺失的地方,对这种地方的特征提取会变得很困难。

为了克服这些缺点,可以使用下面的这些思路:
①保留特征点,但是不去计算描述子,只计算关键点
②只计算关键点而不去计算描述子
③不计算关键点也不计算描述子,而是根据像素灰度的差异,直接计算相机运动

这三种思路,第一种对光流法,第二和第三种对应直接法。使用特征点法我们将特征点看做固定在三维空间中的不动点,根据投影位置来优化重投影误差,以此优化相机运动。而在直接法中,我们不知道点与点之间的对应关系,只能通过最小化光度误差来求。

8.2 光流

直接法是从光流法演变过来的,二者很相似,具有相同的假设条件。光流(Optical Flow)是一种描述像素随时间在图像之间运动的方法。随着时间的流逝,同一个像素会在图像中运动,我们希望追踪它的运动过程。下图中红色框中的像素我们认为是一个像素,需要跟踪这一个像素在不同图像中的位置。其中,计算部分像素运动的称为稀疏光流,计算所有像素的称为稠密光流。稀疏光流以Lucas Kanade光流为代表,并可以在SLAM中用于跟踪特征点位置。
【视觉SLAM十四讲】第8-9讲 视觉里程计2_第1张图片
Lucas–Kanade光流算法是一种两帧差分的光流估计算法。在LK光流中,认为来自相机的图像是随时间变化的。图像可以看作时间的函数: I(t),在t时刻,位于(x,y)处的像素的灰度可以写成 I(x,y,t) 。这种方式把图像看成了关于位置与时间的函数,它的值域就是图像中像素的灰度。现在考虑某个固定的空间点,它在t时刻的像索坐标为x,y。由于相机的运动,它的图像坐标将发生变化。我们希望估计这个空间点在其他时刻图像中位置。

LK光流法有三个基本假设:
1、灰度不变:一个像素点随着时间的变化,其像素灰度值是恒定不变的。这是光流法的基本设定。所有光流法都必须满足。灰度不变假设是很强的假设, 实际当中很可能不成立。事实上,由于物体的材质不同,像素会出现高光和阴影部分;有时,相机会自动调整曝光参数,使得图像整体变亮或变暗。这此时候灰度不变假设都是不成立的,因此光流的结果也不一定可靠。
2、小运动: 时间的变化不会引起位置的剧烈变化。这样才能利用相邻帧之间的位置变化引起的灰度值变化,去求取灰度对位置的偏导数。所有光流法必须满足。
3、空间一致:假设某一个窗口内的像素具有相同的运动。这是LK光流法独有的假定。因为为了求取x,y方向的速度,需要建立多个方程联立求解。而空间一致假设就可以利用邻域n个像素点来建立n个方程。

依赖于灰度不变假设,因为灰度不变,我们才能够得到下面这个基本的式子:
在这里插入图片描述
将左侧式子泰勒展开:
在这里插入图片描述
整理可得:
在这里插入图片描述
两侧同时除以dt:
在这里插入图片描述
对于这个式子,一共有相当于五个量,从左到右分别为:图像在该点处x方向的梯度Ix、像素在x轴上的运动速度u、图像在该点处y方向的梯度Iy、像素在y轴上的运动速度v、图像灰度对时间的变化量It,整理成矩阵形式可得:
【视觉SLAM十四讲】第8-9讲 视觉里程计2_第2张图片
也就是说,对于一个点我们可以得到这么一个式子,由于空间一致性,我们认为窗口内的像素具有相同的运动,因此对于一个w×w大小的窗口,可以得到w2个约束,就是w2个方程:
在这里插入图片描述
写成矩阵形式:
【视觉SLAM十四讲】第8-9讲 视觉里程计2_第3张图片
这是一个关于u,v的超定线性方程,可用最小二乘法解得:
在这里插入图片描述
这样就得到了像素在图像间的运动速度u,v。t取离散时刻,可以估计某块像素在若干图像中出现的位置。

当然LK光流法也不是完美的,它也存在不足,而三个不足针对的都是它的三个前提条件。对于亮度恒定不满足的问题,解决方法是梯度恒定。而对于像素偏移过大的问题,解决方法则是采用高斯金字塔方法。
【视觉SLAM十四讲】第8-9讲 视觉里程计2_第4张图片
原始的LK光流假设:灰度不变、小运动、空间一致都是较强的假设,并不容易得到满足。考虑物体的运动速度较大时,算法会出现较大的误差,那么我们希望能减少图像中物体的运动速度。假设当图像为400×400时,物体速度为[16 16],那么图像缩小为200×200时,速度变为[8,8]。缩小为100*100时,速度减少到[4,4]。在源图像缩放后,原算法又变得适用了。所以光流可以通过生成原图像的金字塔图像,逐层求解,不断精确来求得。简单来说上层金字塔(低分辨率)中的一个像素可以代表下层的两个。每一层的求解结果乘以2后加到下一层。主要的步骤有三步:建立金字塔,基于金字塔跟踪,迭代过程。

8.4 直接法

直接法的推导很像前面提到过的BA优化。考虑某个空间点P和两个时刻的相机,P的世界坐标为[X,Y,Z],成像的非齐次像素坐标为p1p2,我们的目标是求两帧之间的变换关系。
【视觉SLAM十四讲】第8-9讲 视觉里程计2_第5张图片
根据小孔成像模型,可以写出下面的两个式子:
【视觉SLAM十四讲】第8-9讲 视觉里程计2_第6张图片
这种写法在前面对极几何那里出现过,这里就不再多说了。在特征点法中,我们通过匹配描述子,确定了p1p2的像素位置,所以可以计算重投影的位置,但是在直接法中,没有特征匹配,也就不是到哪一个p2对应p1,所以直接法采取根据估计值寻找的方法,即用当前相机的位姿的估计值,去寻找一个p2的位置,如果估计值不够好,p2和p1的外观会有明显的差别,为了减小差别,就需要调整位姿来不断缩小这个差别,而这里的差别就不是重投影误差了,而是光度误差,也就是两个位置的亮度误差。
在这里插入图片描述
可以看出来,这里其实还是利用了灰度不变假设,只不过比较的两个对象发生了改变,特征点法比较重投影误差,是比较p1投影到第二帧上后和p2的距离,而直接法因为不知道p2的位置,所以根据估计的变换矩阵值,去找了一个假设的p2,用p2和原来的p1去比较,灰度差异小说明还比较准确,灰度差异太多就说明变换矩阵偏差离谱了。
现在我们可以得到一个点的优化的式子:
在这里插入图片描述
这是对于一个点的目标,而对于许多个空间点来说,就会产生下面的式子:
在这里插入图片描述
得到了这个式子,后面就需要对式子进行优化,从而得到最优的相机位姿。求解这个优化问题,我们关心的是误差e是如何跟着相机位姿变换的,因此需要分析他们的导数关系,这里就用上了前面李代数的扰动模型:
【视觉SLAM十四讲】第8-9讲 视觉里程计2_第7张图片
做以下的简写:
在这里插入图片描述
这里的q为P扰动之后,位于第二个相机坐标系下的坐标,而u为它的像素坐标。利用一阶泰勒展开,可以得到:
【视觉SLAM十四讲】第8-9讲 视觉里程计2_第8张图片
一阶导数根据链式求导法则被拆成了三项,而三项都很好计算:
【视觉SLAM十四讲】第8-9讲 视觉里程计2_第9张图片
直接法根据P的来源可以分为三类:
【视觉SLAM十四讲】第8-9讲 视觉里程计2_第10张图片

最后,直接法可以省去计算特征点描述子的时间,只要求有像素梯度即可而不需要特征点,可以构建特征点法无法做到的半稠密甚至稠密的地图。与此同时,直接法完全依赖梯度搜索,这使得优化算法容易陷入局部极小值,而且使用单个像素,没有区分度,灰度不变假设有点太强烈,很容易不满足。

9.0 设计前端

你可能感兴趣的:(视觉SLAM十四讲,计算机视觉,opencv,图像处理)