前面说过视觉SLAM系统分为前端和后端两个内容,前端也叫做视觉里程计。视觉里程计的主要作用是根据相邻的两张图像的信息粗略的估计出相机运动,给后端一个较好的初始值。视觉里程计的两大算法为:特征点法和直接法。本讲主要是特征点法。
视觉里程计最核心的问题是如何根据图像来估计相机运动。图像在计算机中是以矩阵的形式存储的,直接从矩阵的角度来估计图像是比较复杂的。一个简便的做法是:在图像中选取一些有代表性的点,这些点在相机视角发生少量变化后仍会保持不变,我们需要在各个图像中找到相同的点,在这些点的基础上来讨论相机位姿估计问题。在SLAM模型中,称这些点为路标,在视觉SLAM中,称路标为图像特征。
特征点是图像中一些特别的地方,我们可以将图像中的角点,边缘,区块都当作图像中有代表性的地方。
我们更容易在两幅图像中指出同一个角点,两幅图像中指出同一个边缘则较为困难,因为边缘附近图像的局部是相似的,两幅图像的同一个区块则是最复杂的。
角点最好辨认,所以一种直观的提取特征方式就是在不同的图像间辨认角点,确认他们的对应关系。角点的提取算法有:Harris角点,Fast角点等。
然而在实际应用中,单纯的提取角点不能够解决问题,图像远处看是一个角点,当相机离近后可能就不是角点了。或者当相机旋转运动时,角点的外观也会发生变化,也不容易辨认是同一个角点。在经过人工设计后有著名的SIFT,SURF,ORB等,特征点有以下性质:
1、可重复性:相同的特征可以在不同的图像中找到
2、可区别性:不同的特征有不同的表达
3、高效率:同一图像中,特征点的数量应远小于像素数量(减少计算量)
4、本地性:特征点仅与小片图像区域有关
特征点由关键点和描述子两部分组成。所以当我们说计算ORB的特征点就是计算ORB的关键点和描述子。
关键点是指该特征点在图像里的位置,有些特征点还具有朝向,大小的信息。
描述子通常是一个向量,按照某种人为设计的方式,描述该关键点周围像素的信息。描述子是按照:外观相似的特征应该有相似的描述子这一原则设计的。所以,如果两个特征点的描述子在向量空间中距离相近,就可以认为是同样的特征点。
ORB特征由关键点和描述子两部分组成,提取ORB特征主要分为以下两个步骤:
1、FAST角点提取:找出图像中的角点。ORB相比原版的FAST,ORB中计算了特征点的主方向,为后续的BRIEF描述子增加了旋转不变特性。
2、BRIEF描述子:对前一步提取的特征点的周围图像区域进行描述。ORB在对BRIEF进行了一些改进,主要是指在BRIEF中使用了先前计算的方向信息。
FAST关键点
FAST是一种角点,主要检测局部像素灰度变化明显的地方,速度快。思想为:如果一个像素与领域的像素差别较大(过亮或过暗),那么可能是角点。FAST只需要比较像素亮度的大小即可:
在FAST-12算法中,为了高效,增加了一项预测试操作。对于每个像素,直接检测邻域圆上的1,5,9,13像素,当这四个像素中有三个同时大于亮度±阈值时候,才可能是一个角点,这样大大加快了检测速度。
FAST特征点仅仅是比较像素间亮度的差异,所以速度很快,但是FAST具备尺度问题,由于它只取半径为3的圆,远处看是角点的地方,在近处也许就不是角点。针对这样的问题,ORB增加了尺度和旋转的描述。尺度不变性由构建图像金字塔解决,旋转问题由灰度质心法解决。
金字塔底层是原始图像,每往上一层,就对图像进行一定倍率的缩放,这样就有了不同分辨率的图像。较小的图像看作是远处看过来的场景。我们可以匹配不同层上的图像,从而实现尺度不变性。假如相机在倒退,我们应该在上一层或者下一层找到匹配。
旋转方面,计算特征点附近的图像灰度质心,质心是指以图像块灰度值作为权重的中心,步骤为:
在一个小的图像块B中,定义图像块的矩为:
2、通过矩来寻找图像块的质心:
3、连接图像块的几何中心O和质心C,得到方向向量OC,特征点的方向定义为:
通过图像金字塔和计算图像灰度质心,FAST角点有了尺度和旋转的描述,增强了鲁棒性。
BRIEF描述子
BRIEF是一种二进制描述子,描述向量由许多0,1组成,这里的0,1编码了关键点附近两个随机像素(p和q)的大小关系:如果p大于q,取1,反之取0。取128个这样的p,q,则最后得到128维由0,1组成的向量。由BRIEF是由二进制组成,存储起来也很方便,适用于实时图像匹配。但是BRIEF不具备旋转不变性,使得图像在旋转时容易丢失,但是ORB的FAST特征点在提取的时候解决了旋转问题,所以ORB方法在SLAM中很受欢迎。
特征匹配是视觉SLAM中极为重要的一步,特征匹配确立当前看到的路标与之前看到的路标之间的对应关系。通过对图像与图像或者图像与地图之间的描述子进行准确匹配,可以为后续的优化减轻负担。
考虑两个时刻的图像,在图像中提取到特征点,在图像
中提取到特征点 。如何寻找这两个元素的对应关系?最简单的是暴力匹配。即对每一个特征点与所有的测量描述子的距离。对于BRIEF描述子,往往使用汉明距离作为度量——两个二进制串之间的汉明距离,指的是其不同位数的个数。如果特征点数量很大,暴力匹配的方法的运算量会很大。快速近似最近邻算法更适合与匹配点数量极多的情况,该算法集成于OpenCV,可以直接使用。