Thursday 24 December 2015

一步步学习Visual odometry - 综述

最近做视觉里程计visual odometry各种崩溃,只能使用一步步来的方法来梳理头绪。
Scaramuzza大神有关于VO很好的介绍,这里记录下学习笔记。
VO有几个基本假设。首先光照条件要充足,然后场景大部分要是静止的。图像中需要有足够的特征来提取运动。两帧之间的重叠要足够大。

VO最早用在火星车上面,后来被Nister发扬光大。它解决的问题是,一个相机在场景中运动,并记录下一系列图像,从这些图像中如何恢复出相机运动。把没两帧之间的运动相加,就可以得到一个完整的轨迹。我们也可以在过去的m帧上面运行iterative refinement来优化局部轨迹。

在VO中,运动估计是最重要的部分,它计算了相机从前一帧到当前帧的运动。我们可以用appearance based方法,直接用图像的像素值来匹配两帧图像。我们也可以用特征点来进行匹配。

如果两帧之间的匹配都是2D的点,至少需要5个点来恢复运动,点越多越好。通过这些对应点可以找到本质矩阵E,然后用SVD分解得到R和t。我们通过最小化反投影残差来找到真实的解。但是,我们并不知道在真实世界中相机移动的距离,只知道相机移动了一个单位。

如果我们既知道真实的3D点,又知道图像中对应的2D点,这就是PnP问题,至少需要3个点来解决,也是通过最小化反投影残差。在单目VO中,需要先从两帧之中通过三角定位得到3D点,然后跟第三帧的2D点匹配。

在三角定位中,如果相机移动的距离相比场景的深度很小,那么得到的3D点有很大的不确定性。为了避免这个情况,需要舍弃那些距离很近的帧,而是选取距离远的关键帧。选取的标准是3D点的不确定性很小。这一步是非常重要的,一定要在更新运动之前进行。

最后,在最近的m帧中要做bundle adjustment来优化轨迹。

在图像匹配时,会出现很多和运动不相符的outlier,我们必须把它们去掉。常用的方法是ransac。ransac不会给出确定的答案,所以不同时间的运行可能得到不同结果。当iteration增多时,得到的结果往往更稳定。最高效的方法是1点ransac,找到inlier后可以估算6DOF的运动。如果特征点的匹配有很大噪音,用更多的点的ransac会更准确。

为了优化VO的结果,通常需要上千个特征点,均匀分布在整个图像中。


No comments:

Post a Comment