一个SLAM系统可以分为前端和后端,其中前端称为视觉里程计,其作用是根据相邻图像的信息估计出粗略的相机运动,给后端提供较好的初始值
视觉里程计的算法主要有两大类:特征点法(主流方法)、直接法
1、特征点
视觉里程计的核心问题是根据图像估计相机运动。特征点法是从各个图像中选取相同的有代表性的点(相机视角发生少量变化时,这些点保持不变),在这些点的基础上讨论相机位姿估计问题以及这些点的定位问题。在经典SLAM模型中,这些点是路标;在视觉SLAM中,这些点是图像特征
数字图像在计算机中以灰度值矩阵方式存储。在视觉里程计中,希望特征点在相机运动后保持稳定,而灰度值容易受光照、形变、物体材质等影响,在不同图像之间变化很大,不稳定。因此仅凭灰度值不够,需要对图像提取特征点
特征点是图像里一些特别的地方,一般可以分为角点、边缘、区块。区分同一个角点最简单,区分一个区块最难。在大多数应用中,单纯的角点不能满足需求。例如,从远处看是角点的地方,当相机靠近或者旋转,可能就不显示为角点了。因此,研究者们设计了许多更稳定的局部图像特征,如:SIFT、SURF、ORB,它们比一般的角点有更好的特性:
1、可重复性:相同特征可以在不同图像中找到
2、可区别性:不同特征有不同表达
3、高效率:同一个图像中,特征点数量远小于像素点数量
4、本地性:特征只与一小片图像区域相关
特征点由关键点和描述子组成。关键点是特征点在图像中的位置,有些特征点还具有朝向、大小等信息。描述子描述了这个关键点周边像素的信息。只要两个特征点的描述子在向量空间上距离很近,就认为它们是同一个特征点
SIFT(尺度不变特征变换)是一种很精确的表达,但计算量较大。一般CPU无法实时计算SIFT特征,因此SLAM比较少采用
FAST关键点(不是特征点,没有描述子)适当降低精度和鲁棒性,提升计算速度
ORB(Oriented FAST and Rotated BRIEF)特征是目前比较有代表性的实时图像特征,它改进了FAST不具有方向性的问题,同时采用速度极快的二进制描述子BRIEF(Binary Robust Independent Elementary Feature),加快图像特征提取速度
2、ORB特征
ORB特征的关键点称为Oriented FAST,是改进的FAST角点(计算了特征点的主方向,为BRIEF增加旋转不变形);描述子称为BRIEF(使用先前计算的方向信息)
2.1、FAST关键点
FAST是一种角点,检测局部像素灰度变化明显的地方,速度快。主要思想:如果一个像素与邻域的像素差别较大(过亮或者过暗),它更可能是角点。相比于其他角点检测算法,FAST只需要比较像素亮度,因此速度快
检测过程:
1、在图像中选取像素 ,假设亮度为
2、设置阈值 T (例如 的20%)
3、以像素 为中心,选取半径为3的圆上16个像素点
4、假如选取的圆上有连续的N个点的亮度大于 + T 或者小于 - T ,则像素 被认为是特征点(N一般取12、9、11,称为FAST-12、FAST-9、FAST-11)
5、循环上面四步,对每个像素执行相同操作
在FAST-12算法中,为了高效,添加一项预测试操作,可以快速排出大多数不是角点的像素点。具体操作为:对每个像素点,直接检测邻域圆上的第1,5,9,13个像素亮度,只有当这4个像素中有3个同时大于 + T 或者小于 - T ,像素才可能是一个角点
另外,原始的FAST角点经常出现“扎堆”现象,因此第一遍检测之后,需要用非极大值抑制,在一定区域内仅保留极大值的角点,避免角点集中
针对FAST不具有方向性以及尺度的弱点,ORB添加了尺度和旋转的描述。尺度不变性通过构建图像金字塔,在金字塔每一层检测角点实现。特征的旋转由灰度质心法实现
金字塔是指对图像进行不同层次的降采样,获得不同分辨率的图像。金字塔低层是原始图像,每往上一层,对图像进行一个固定倍率的缩放。较小的图像可以看成是远处看过来的场景。在特征匹配算法中,可以匹配不同层上的图像,从而实现尺度不变性
如果相机在后退,可以从上一个图像金字塔的上层,或者下一个图像金字塔的下层中找到匹配
在旋转方面,需要计算特征点附近的图像灰度质心。质心是指以图像块灰度值作为权重的中心。具体步骤:
1、在一个小的图像块B中,定义图像块的矩
2、通过矩找到图像块的质心:
3、连接图像块的几何中心 O 和质心 C ,得到方向向量 ,特征点的方向可以定义为
2.2、BRIEF描述子
BRIEF是二进制描述子,描述向量由0,1组成,而0,1编码了关键点附近的两个随机像素(p,q)的大小关系:如果p比q大,取1,反之取0。BRIEF使用随机选点的比较,速度快,适用于实时图像匹配。ORB的改进BRIEF可以利用关键点提供的方向信息,计算旋转后的 "Steer BRIEF" 特征,使ORB描述子具有较好的旋转不变性
2.3、特征匹配
特征匹配解决SLAM中数据关联问题:确定当前看到的路标与之前看到的路标之间的对应关系。由于图像特征的局部特性,误匹配情况广泛存在。部分原因是场景中存在大量的重复纹理,使得不同特征点的特征描述非常相似。这时,只利用局部特征解决误匹配很困难
假设图像 提取了特征点 ,图像 提取了特征点
最简单的特征匹配方法是暴力匹配。对每个特征点 和所有的 测量描述子距离,然后排序,取最近的一个作为匹配点。其中描述子的距离表示了两个特征之间的相似程度
实际运用时可以选择不同距离度量范数。对于浮点类型的描述子,使用欧氏距离;对于二进制的描述子,多数使用汉明距离。两个二进制串之间的汉明距离指的是它们不同位数的个数
当特征点数量很大,暴力匹配运算量很大,不满足SLAM的实时性需求,这时可以采用快速近似最近邻(FLANN)算法