VSLAM(6):视觉里程计---直接法和光流法

目录

一,光流法

1.1 L-K光流法

1.2 代码实践

二. 直接法

2.1 直接法原理介绍

2.2 直接法的讨论

2.3 代码实践


基于特征点匹配的视觉里程计方法中,把特征点看作是在3D空间中不动的点,根据他在前后相机中的投影位置,最小化投影误差来计算出最优的相机位姿。这种方法需要花费大量的算力在特征点的提取和描述子的计算中;同时指利用了一张图像很少的一部分(特征点部分),丢失了大部分可能有用的图像信息;另外实际情况中,相机有时候会遇到特征点稀少甚至没有的场景,例如一面白墙或则空荡荡的走廊,这时候可能找不到足够的特征点进行匹配。

要解决这些个问题有如下的思路:

  1. 保留特征点,但只计算关键点,不计算描述子。使用光流法来跟踪特征点(Optical Flow)的运动。这样就可避开计算和匹配描述子,但是光流跟踪计算也需要时间;
  2. 只计算关键点,不计算描述子。使用直接法(Direct Method)来跟踪关键点的运动。相比于光流法,直接法计算更加简单;
  3. 既不计算关键点也不计算描述子,根据灰度差异,直接计算相机运动。

第一种方法相当是将光流作为描述子进行匹配运算,估计位姿时还是使用对极几何,PnP或则ICP等算法。而后面两个方法中,会根据图像灰度信息来计算相机运动,他们称为直接法。光流是指像素在图像中的运动,而直接法则是附带一个相机运动模型

一,光流法

1.1 L-K光流法

随着时间的经过,同一个像素会在图像中运动,而追踪它运动过程的方法称为光流法。计算部分像素运动的称为稀疏光流,计算所有像素的称为稠密光流。稀疏光流法有Lucas-Kanade光流法,如下所示:

 当一个相机运动时,图像也会随着改变,因此可以将图像像素值(灰度值)看作是一个关于像素坐标和时间的函数I(x,y,t)。那么对于某个空间点,在t时刻的像素坐标是x,y。由于相机的运动,他的图像坐标在不断变化。如果我们假设这个空间点对应的像素点灰度值在运动过程中是保持灰度不变的,即满足灰度不变假设,那么就有:

 对左边进行一阶泰勒展开,得:

 因为满足灰度不变假设,所以后面的一阶项理论上应该为0,即:

 两边除以dt,将灰度值关于时间的导数移动到等式右边就有:

等式左边,有灰度在x和y方向的梯度,记作I_xI_y,这两个量是可以通过计算前后像素点变化得到的,是已知量。而等式右边则是灰度对时间的变化量,记作I_t,这个值也可以通过计算前后帧的灰度变化量得来。上下的两个未知量就是我们要求的量,分别是像素在x和y方向的运动速度,记作uv。那么就有如下的矩阵方程:

可以看出这是一个两个未知数的一次方程,是无解的。但这只是一个点的等式,可以利用很多个特征点列出相似的等式来求解。在LK光流中,假设某一个w*w的窗口内的像素具有相同的运动,这样就可以列出w^2个等式,

记:

于是可以简化为

这个方程只有两个未知数u和v,但是有w*w个方程,所以是一个超定线性方程。可以利用传统的最小二乘法来求解:

到此就解出了图像之间的相对运动速度。当t取离散的时刻而不是连续的时间时候,可以估计某个像素在若干个图像中出现的位置。由于像素梯度仅在局部有效,所以一次迭代不够好还可以多迭代几次。

1.2 代码实践

二. 直接法

2.1 直接法原理介绍

考虑3D空间中的某个点P,它的世界坐标是[X,Y,Z],它在两个相机上成像,记非齐次像素坐标为p_1,p_2,那么如果假设第一个相机到第二个相机之间的运动为R和t就有:

其中,K是相机内参矩阵,Z_1Z_2分别是两个相机下的深度。不同于特征点匹配法,直接法的误差定义为点P在不同像素坐标系下的广度误差(Photometric Error),也就是两个像素之间的亮度误差,这个假设的前提还是基于灰度不变假设:

那么待优化的目标函数就是误差的二范数,为:

假若我们有N个空间点,那么整个相机位姿优化问题就变成了:

这里的优化变量是相机位姿\xi,为了应用非线性优化方法,我们需要考虑误差e是如何随着相机位姿\xi的变化而变化的,即求解误差e关于相机位姿的雅可比矩阵。使用李代数的左扰动法,就有:

记:

可以发现这里的其实就是P点经左扰动位于第二个相机坐标系下的坐标。而u则是q对应的像素坐标坐标。对式子进行一阶泰勒展开,有:

再除以扰动量后就只剩下一个一阶导数,这个一阶导数由链式法则分成了三项:

 那么误差e关于相机位姿的雅可比矩阵就是:

有了雅可比矩阵,就可以利用非线性优化方法来迭代求解最优值了。 

2.2 直接法的讨论

直接法的前提是空间点的位置是已经知道的,如果是RGB-D相机,对于一张图像的任意一个像素坐标对应的三维空间位置是已知的,然后将这个三维空间点投影到下一张图像中。但是对于单目相机,就需要反推出像素点对应的深度,这个往往会有一定的不确定性。

按照P点的来源,可以对直接法进行分类:

  1. P来源于稀疏关键点,那么就是稀疏直接法。这种方法往往使用成百上千的关键点,并且假定关键点附近的像素灰度值也是不变的,就像L-K光流法;
  2. P来源于部分像素,因为直接法需要点对应的像素坐标是要有灰度梯度的,所以可以舍弃那些像素梯度不明显的点。这个称为半稠密法,可以构建一个半稠密结构;
  3. P来源于所有像素,这么此时就需要计算所有像素,称为稠密直接法,可以构建一个稠密结构,但是需要GPU加速。

 综上,稀疏方法可以快速求解相机位姿,而稠密方法可以建立完整地图,使用哪种方法需要视具体的情况而定。

2.3 代码实践


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部