0%

SLAM-光流法

使用光流法来求解位姿

光流法

在使用特征点法来进行位姿估计的时候,只使用特征点来进行匹配,需要计算这些特征点的特征描述子,这样的话,计算量会比较大,同时也没有利用到非特征点的像素的信息。

光流法是一种直接法,它不需要计算特征点的特征描述子,而是直接使用像素点的信息来进行匹配。使用全部像素点进行计算为稠密光流,使用部分像素点进行计算为稀疏光流

LK光流

LK光流是一种稠密光流,它基于灰度不变假设,也就是在同一个空间点的像素灰度值,在各个图像中是不变的。如果我们把图像看成是一个随时间变化的离散二维函数,那么上述假设有如下等式成立

对上式右侧进行泰勒一阶展开,得到

而由于灰度不变假设,所以有

也就是

因为目标是求解,而是图像的空间梯度,所以我们可以得到

此处不涉及相机模型,故只求解出即可,而不需要求解出深度信息。

但是显然这是一个2元一次方程组,仅仅使用一个像素无法求解,所以需要使用很多像素(比如使用一个窗口内的像素)来构造出多个方程,从而完成求解。

此外,也可以只计算出特征点,去使用这些特征点以及邻域内像素完成光流的求解。(此时只需要知道特征点即可,不需要计算出特征描述子,相当于只使用邻域灰度作为描述子,但是不涉及到一对一的匹配,仅仅只求解整体的运动),比如使用fast角点,快速计算出角点的像素,然后执行光流匹配,就可以快速求解出像素位置变化。

多层光流

当相机移动太快的时候,两张图之间的光流在计算时很容易陷入到一个局部极小值里,但是如果构建出图像金字塔,就能把图像中的位移缩小,从而避免陷入局部极小值。

光流法求解位姿

光流法只需要指定关键像素,然后就可以完成特征点的匹配关系,但是要求两帧之间的差距不至于过大,尽可能满足图像的连续性。

但是上述求解的匹配关系仅仅是两个像素坐标系的匹配,没有涉及到位姿的计算,下面将结合相机模型来求解位姿。

直接法

假设相机从位置1运动到位置2,记位置1的像素为,位置2的像素为,那么有下式成立,其中分别为的深度值


上式其实就是相机模型,接下来,我们需要对位姿进行求解,但是由于没有特征描述子,我们匹配出到底哪一个是匹配的,而利用光流法的假设,相机运动前后的同一空间点对应的像素灰度不变,我们可以使用优化去最小化光度误差

那么可以转化成如下的优化问题

此时优化的变量是,所以我们需要求解一下损失函数关于两者的导数信息。

,两者分别为空间点在第二个相机坐标系的坐标和对应的像素坐标,那么对于每一项误差,有

因为左侧是对求导,而右侧转化成了对扰动求导,所以最后还会多出一项扰动

其中的微小变化,而的导数,也就是使用李代数的扰动模型,这个导数也就是扰动模型对应的导数;

的导数,也就是相机模型中由相机坐标系向像素坐标系变化的导数,这个导数可以直接使用求导的定义获得;如下

的导数,也就是第二帧中的像素点处的梯度,可以用sobel算子进行计算。

这样,我们就能计算出每一个像素点的光度误差对于位姿的导数,然后就可以使用高斯牛顿法进行优化了。

总结

我们可以使用很少一些点用于计算,比如只取特征点,这样速度非常快,但是只能进行稀疏的构建;如果取一部分像素来进行构建,不过存在一些像素的梯度是0,也就是无法求导,此时可以进行半稠密构建;如果取全部像素来进行构建,那么就是稠密构建,但同样存在部分梯度为0的像素无法进行构建的问题。

光流法可以看成使用灰度作为描述子的特征点法,只使用灰度,那么就意味着速度很快,但同样也意味着误差很大,误差可以使用很多像素参与计算来进行弥补,但是当位移变化很大时,很容易陷入到局部极小值里,此时可以使用多层光流来进行优化。