这篇博客是在学习高翔《视觉SLAM十四讲》过程中对计算机视觉的多视图几何相关知识点做的总结,个人觉得这部分内容比较难,有理解不对的地方请指正!

〇、ORB特征点

  对于特征点法的SLAM来说,ORB(Oriented FAST and Rotated BRIEF)特征应该是目前最合适的特征点了。ORB与SIFT、SURF之间的性能对比如下:

  • 计算速度:ORB >> SURF >> SIFT(各差一个量级)
  • 旋转鲁棒性:SURF > ORB ~ SIFT
  • 模糊鲁棒性:SURF > ORB ~ SIFT
  • 尺度变换鲁棒性:SURF > SIFT > ORB(ORB算法在尺度方面效果较差)

  特征点由关键点和描述子两部分组成,对于ORB特征点来说,它使用的是FAST关键点+BRIEF描述子。

  FAST是一种角点,主要检测局部像素灰度变化明显的地方,以速度快著称。但FAST角点本身并不具有尺度和方向信息,针对这一问题,ORB算法通过构建图像金字塔,并在金字塔的每一层上检测角点来实现FAST的尺度不变性;用灰度质心法来实现FAST的旋转不变性。在ORB中,将这种可以描述角点尺度与旋转特性的FAST称为Oriented FAST。

  BRIEF是一种二进制描述子,为关键点添加描述子的作用是为了实现图像之间的特征匹配。BRIEF使用了随机选点的比较,速度非常快,而且由于使用了二进制表达,存储起来也十分方便。但原始的BRIEF描述子不具有旋转不变性,图像发生旋转时容易丢失,针对这一问题,ORB算法利用在FAST角点提取阶段计算出的关键点方向信息,使BRIEF具有了较好的旋转不变性。

  有了ORB特征点,我们需要用它来做图像间的特征匹配。所谓特征匹配,就是比较特征点的相似度,这个相似度通过它们的描述子来计算。对于BRIEF这种二进制的描述子,通常使用汉明距离(Hamming distance)来度量两个特征点之间的相似程度。汉明距离是指两个长度相等的字符串之间不同数据位的个数,例如:两个8位的二进制串00110100与10110100,它们之间只有第一个数据位不同,所以它们的汉明距离为1。在ORB的特征匹配中,汉明距离越小,特征点的相似度越高,在某种程度上,我们可以认为两个特征点在两帧图像中为同一个点,即完成了特征匹配。

  特征匹配在视觉SLAM中真的是至关重要的一步,设想一下,假如每一帧图像都能实现100%的正确匹配,那我们就不再需要各种令人头疼的滤波、优化、回环检测等等,这将是一个多么美好的画面啊啊啊。。。但,现实告诉你,绝大部分的图像之间是不可能做到100%正确匹配的,所以说,SLAM的主要工作在后端,就是如何利用不准确的数据估计得到准确的结果。

  当然,下面总结的在视觉SLAM中经常用到的,非常重要的,Multiple View Geometry in Computer Vision中的,比较难以理解又容易混淆的几个算法,都是在理想的特征匹配结果之上推导出来的。

一、对极几何

  对极几何(Epipolar geometry)又叫对极约束,是根据图像二维平面信息来估计单目相机帧间运动或双目相机相对位姿关系的一种算法。直观来讲,当相机在两个不同视角对同一物体进行拍摄时,物体在两幅图像中的成像肯定会有不同,那么,根据这两幅不同的图像,我们如何判断出相机的位姿发生了怎样的变化,这正是对极几何要解决的问题。

  需要明确的是,在对极几何中,我们的已知条件仅仅是每幅图像中特征点的像素坐标,当然,计算对极约束的前提是我们必须知道两幅图像中特征点之间准确的匹配关系。

图1 对极几何示意图

  

二、三角测量

  三角测量(Triangulation)又叫三角化,是根据前后两帧图像中匹配到的特征点像素坐标以及两帧之间的相机运动 Rt,计算特征点三维空间坐标的一种算法。直观来讲,当有两个相对位置已知的相机同时拍摄到同一物体时,如何根据两幅图像中的信息估计出物体的实际位姿,即通过三角化获得二维图像上对应点的三维结构,这正是三角测量要解决的问题。

图2 三角测量示意图

三、PnP问题

  PnP(Perspective-n-Point)是根据图像中特征点的二维像素坐标及其对应的三维空间坐标,来估计相机在参考坐标系中位姿的一类算法。直观来讲,当相机观察到空间中的某一物体时,我们已经知道了该物体在某一参考坐标系下的位置和姿态,那么如何通过图片中物体的成像判断出相机此时在参考坐标系下的位姿?这正是PnP要解决的问题,即利用已知三维结构与图像的对应关系求解相机与参考坐标系的相对关系(相机的外参)。

  PnP是一类问题,针对不同的情况有不同的解法,常见的算法有:P3P、DLS、EPnP、UPnP等。

图3 PnP示意图

四、ICP问题

  ICP(Iterative Closest Point)是根据前后两帧图像中匹配好的特征点在相机坐标系下的三维坐标,求解相机帧间运动的一种算法。直观来讲,当相机在某处观察某一物体时,我们知道了相机此时与物体之间的相对位姿关系;当相机运动到另一处,我们亦知道此时相机与物体的相对位姿关系,那么,如何通过这两次相机与物体的相对位姿关系来确定相机发生了怎样的运动?这正是ICP要解决的问题。

  在ICP问题中,图像信息仅仅用来做特征点的匹配,而并不参与视图几何的运算。也就是说,ICP问题的求解用不到相机的内参与特征点的像素坐标。

图4 ICP示意图

五、总结

1、对极几何(2D-2D)利用两帧图像中 n n n对特征点的二维像素坐标,估计相机的相对运动 R R R t t t,它一般只在单目SLAM初始化的时候用到。
2、三角测量利用两帧图像中匹配特征点的像素坐标以及两个相机之间的相对位姿,估计特征点的三维空间坐标,这在单目以及双目(多目)的SLAM中都非常重要。
3、PnP(2D-3D)利用图像中 n n n对特征点的二维像素坐标和与之对应的三维空间坐标,估计相机在空间的位置和姿态,是最重要的一种位姿估计方法。
4、ICP(3D-3D)利用 n n n对特征点在不同相机坐标系下的三维坐标,估计相机之间的相对位姿,适用于RGB-D SLAM和激光SLAM(从原理上来说)。
5、以上种种,要想得到正确的结果,前提是准确的特征匹配以及理想的相机内参(包括针孔模型参数和畸变参数)。然而事实上,我们得到的往往是有误差或者有噪声的结果,所以通常称前面的工作为前端,因为后面还有很多事情要做,那就是后端的优化——从混乱中找寻真理。