第七讲的内容对于像我一样的小白来说多且难,我看了两遍书两遍视频,才明白过来。我准备为了写明白,分开几次写,每次写一个部分。
回顾一下,在第二讲里面有提到整个的视觉SLAM流程图,其中,视觉里程计又称为前端,功能是估算相邻图像之间相机的运动。那么这一讲的主要内容就是如何通过前后两张图片来计算相机的位姿。
从直觉出发,给出图像a和图像b,如果通过让我们肉眼判断拍摄两张图像的过程中相机的运动,我们通常会在图像上找个参照物。比如说图2-8中,我们通过对比左边桌子上的白色物体,可以推测出在拍摄右边图像时,相机先向左边旋转了一定的角度。
类比到计算机上,首先计算机要从图a中找到左边桌子上的白色物体,然后从图b中找到同一个物体,再对不同图像中的同一物体进行比较,根据比较结果计算出相机的位姿。整个过程就是这一讲的内容。大体上分为两步:1)找到不同图像中的同一物体,2)根据物体在两张图像中的位置形态计算相机位姿。
对于计算机来说,它理解不了物体,但是可以计算数字。一张灰度图对于计算机来说就是一个矩阵,所以在计算机中比较的不是物体,而是点,不同图像中具有代表性的点,称为特征点。
特征点需要具备以下性质:
可重复性:相同的“区域”可以在不同的图像中找到
可区别性:不同的“区域”有不同的表达
高效率:同一图像中,特征点的数量应远小于像素的数量
本地行:特征仅与一小片图像区域相关
这些性质可以保证特征点能够在相邻图像中被找到,同时尽量保持稳定不受相机运动的影响。通常特征点由关键点(key-point)和描述子(Descriptor)组成。关键点指的是特征点在图像中的位置,有时还会包含朝向、大小的信息。描述子是人为设定的,对特征点周围像素的计算。在设计描述子时,认为外观相似的特征应该有相似的描述子。
SLAM对于实时性要求很高,同时希望尽量的减少计算,所以通常不会使用计算复杂的特征点,比如SIFT,而是选择ORB特征,减少计算时间。
1. ORB特征点
ORB的关键点是“Oriented FAST”,是改进的FAST角点,描述子是改进的BRIEF。
1.1 Oriented FAST
FAST主要检测的是局部像素灰度变化明显的地方,认为如果一个像素与邻域像素的差别比较大,那么它可能是角点。FAST的主要运算是比较大小,具体流程如下:
- 选取像素p,假设它的亮度是A
- 设置一个阈值T=0.2A或其他
- 以像素p为中心,选取半径r=3的圆上的16个像素点
- 如果选取的16个像素点中,有连续N个点的亮度>A+T或<A-T,那么认为p是特征点
- 对每个像素重复1-4步,找到所有的特征点
对照图7-3,理解上述步骤。当N=12时称为FAST-12,FAST-12中可以通过添加预测试来提高效率。在检测时,优先比较p周围第1,5,9,13号像素的亮度,如果全部满足步骤4的条件,则继续判断,否则排除。通过这样的预测试,大大减少了比较次数,提高效率。
FAST角点还会出现“扎堆”现象,需要使用非极大值抑制,在一定区域内仅保留响应极大值的角点,避免焦点集中的问题。
FAST特征点通常很多且不确定,Oriented FAST角点对原始FAST得到的角点计算Harris响应值,并取前N个作为最终的角点集合。这样一来,每张图像中都只保留N个特征点。
- 旋转不变性
FAST特征点至描述了位置,没有方向信息,Oriented FAST通过灰度质心法添加了一个方向。灰度质心法假设角点的中心与质心存在着一个偏移,从中心指向质心的向量可以用于表示方向,如图-质心所示。
灰度质心法,通过计算特征点的矩来得到这个方向向量。用I(x,y)来表示像素坐标(x,y)处的灰度值,则特征点p邻域的矩定义为公式-矩。
对于图像而言,
把特征点与质心的夹角定义为FAST特征点的方向,有
方向的添加,使得Oriented FAST具有了旋转不变性。
- 尺度不变性
尺度问题是指,在远处看起来点A像是角点,但是走近之后发现点A不是角点;或者说在当前分辨率下,看到点A是角点,当放大分辨率时发现点A不是角点。
Oriented FAST通过构建图像金字塔来实现尺度不变性。
如图-金字塔所示,把原始图像按指定比例缩放,在缩放后的每一层上提取一次FAST角点,由此获得尺度不变的特性。
1.2 改进的BRIEF描述子
BRIEF描述子是由0和1组成的向量,在计算时,取特征点P周围的N对像素点,图-BRIEF中N=4,比较两个像素点之间的大小关系(如图中的黄色像素对,令上方点的灰度值为A,下方点的灰度值为B,如果A>B则记为1,否则记为0)。当N=4时,BRIEF描述子就是一个四维向量。相邻图片采用同样的选点模式,才能保证两张图片的描述子具有可比性。
在取点时,通常以关键点为原点,水平方向为x轴,建立坐标系。如果图片发生了旋转,不改变建系的方式,那么即使采用相同的模式,两张图片所选取的点也不一定相同,得到的描述子就不具有可比性。改进的BRIEF以关键点为原点,关键点和重心的连线方向为x轴建立坐标系,这样可以把旋转考虑进去,保证旋转不变性。
1.3 特征匹配
现在给出相邻的两张图片,我们可以分别计算两张图片的关键点和描述子,然后需要想办法将两张图片中的特征点进行匹配,称为特征匹配。
每个特征点都会有一个用N维二进制向量表达的描述子,可以直接通过描述子进行特征点的匹配。最简单的方法,对于图像1中特征点A的描述子,计算它和图像2中所有的描述子的汉明距离,找到距离最小的那个点B,认为点B就是点A在图像2中对应的点。
在OpenCV中可以使用快速近似最近邻算法进行加速,找到两张图像中所有相对应的点。
参考文献
[1] 《视觉SLAM十四讲从理论到实践》 高翔,张涛
[2] https://blog.csdn.net/vivian187/article/details/51880608
[3] Sift中尺度空间、高斯金字塔、差分金字塔(DOG金字塔)、图像金字塔 - 心灵智者AI - 博客园
[4] ORB特征提取与匹配 - jason来自星星 - 博客园