slam 14 讲之特征点和特征匹配
前言
视觉SLAM主要分为视觉前端和优化后端。前端也称为视觉里程计(VO)。它根据相邻图像的信息估计出粗略的相机运动,给后端提供较好的初始值。
VO的实现方法分类:
- 特征点法(提取特征),主流,成熟。运行稳定,对光照、动态物体不敏感。
- 直接法(不提特征)
在本讲中,我们将从特征点法入手,学习如何提取、匹配图像特征点,然后估计两帧之间的相机运动和场景结构,从而实现一个基本的两帧间视觉里程计。
特征点
-
VO的主要问题是什么?
如何根据图像来估计相机运动。 -
怎么估计相机运行?
在图像中选取有代表性的一些点,在这些点的基础上,讨论相机位姿估计问题,以及这些点的定位问题。 -
这些点有什么特点?
这些点在相机视角发生少量变化后会保持不变,所以我们会在各个图像中找到相同的点。也就是不同帧可以匹配到相同点。 -
SLAM 中这些点叫什么?
在经典SLAM模型中,它们被称为路标(landmark)。在视觉SLAM中,路标则是指图像特征(Feature)。 -
灰度值也是一种特征,为什么不能直接用?有什么缺点?
在视觉里程计中,我们希望特征点在相机运动之后保持稳定 ,而灰度值受光照、形变、物体材质的影响严重,在不同图像间变化非常大,不够稳定。 -
哪些可以作为图像中有代表的特征点?有什么区别?
角点可以是两条线的交叉处,也可以是位于相邻的两个主要方向不同的事物上的点。特征点是图像里一些特别的地方 。我们可以把图像中的角点、边缘和区块都当成图像中有代表性的地方。不过,我们更容易精确地指出,某两幅图像中出现了同一个角点;同一个边缘则稍微困难一些,因为沿着该边缘前进,图像局部是相似的;同一个区块则是最困难的。我们发现,图像中的角点、边缘相比于像素区块而言更加“特别”,在不同图像之间的辨识度更强。所以,一种直观的提取特征的方式就是在不同图像间辨认角点,确定它们的对应关系。在这种做法中,角点就是所谓的特征。
-
角点可以满足要求吗?有什么缺点?
在大多数应用中,单纯的角点依然不能满足我们的很多需求。例如,从远处看上去是角点的地方,当相机走近之后,可能就不显示为角点了。或者,当旋转相机时,角点的外观会发生变化,我们也就不容易辨认出那是同一个角点。 -
那么有哪些角点的替代方案?设计的这些特征点有什么优点?
计算机视觉领域的研究者们在长年的研究中设计了许多更加稳定的局部图像特征,如著名的SIFT[30] 、SURF[31] 、ORB[32] 等等。
- 1.可重复性(Repeatability):相同的“区域”可以在不同的图像中找到。
- 2.可区别性(Distinctiveness):不同的“区域”有不同的表达。
- 3.高效率(Efficiency):同一图像中,特征点的数量应远小于像素的数量。
- 4.局部性(Locality):特征仅与一小片图像区域相关。
- 特征点是什么?
比如,当谈论SIFT特征时,是指“提取SIFT关键点,并计算SIFT描述子”两件事情。
特征点有两部分组成:
- 关键点 (Key-point):该特征点在图像里的位置,有些特征点还具有朝向、大小等信息。
- 描述子 (Descriptor):通常是一个向量,按照某种人为设计的方式,描述了该关键点周围像素的信息。描述子是按照“外观相似的特征应该有相似的描述子 ”的原则设计的。因此,只要两个特征点的描述子在向量空间上的距离相近,就可以认为它们是同样的特征点。
-
SIFT(尺度不变特征变换,Scale-Invariant Feature Transform) 可以作为 SLAM 系统的特征点吗?可以 GPU 加速计算吗?
SIFT 充分考虑了在图像变换过程中出现的光照、尺度、旋转等变化,但随之而来的是极大的计算量。由于整个SLAM过程中图像特征的提取与匹配仅仅是诸多环节中的一个,到目前(2016年)为止,普通PC的CPU还无法实时地计算SIFT特征,进行定位与建图。所以在SLAM中我们甚少使用这种“奢侈”的图像特征。
可以通过GPU等设备来加速计算。经过GPU加速后的SIFT,就可以满足实时计算要求。但是,引入GPU将带来整个SLAM成本的提升。由此带来的性能提升是否足以抵去付出的计算成本,需要系统的设计人员仔细考量。 -
SLAM 哪些特征点可以选择?
考虑适当降低精度和健壮性,以提升计算的速度。例如,FAST关键点属于计算特别快的一种特征点(注意这里“关键点”的表述,说明它没有描述子)。而ORB(Oriented FAST and Rotated BRIEF)特征则是目前看来非常具有代表性的实时图像特征。它改进了FAST检测子[33] 不具有方向性的问题,并采用速度极快的二进制描述子BRIEF[34] ,使整个图像特征提取的环节大大加速。根据作者在论文中所述测试,在同一幅图像中同时提取约1000个特征点的情况下,ORB约要花费15.3ms,SURF约花费217.3ms,SIFT约花费5228.7ms。由此可以看出,ORB在保持了特征子具有旋转、尺度不变性的同时,速度方面提升明显,对于实时性要求很高的SLAM来说是一个很好的选择。在目前的SLAM方案中,ORB是质量与性能之间较好的折中。 -
FAST关键点是什么?
FAST是一种角点,主要检测局部像素灰度变化明显的地方,以速度快著称。它的思想是:如果一个像素与邻域的像素差别较大(过亮或过暗),那么它更可能是角点。相比于其他角点检测算法,FAST只需比较像素亮度的大小,十分快捷。它的检测过程如下:- 在图像中选取像素p ,假设它的亮度为Ip 。
- 设置一个阈值T (比如,Ip 的20%)。
- 以像素p 为中心,选取半径为3的圆上的16个像素点。
- 假如选取的圆上有连续的N 个点的亮度大于Ip +T 或小于Ip -T ,那么像素p 可以被认为是特征点(N 通常取12,即为FAST-12。其他常用的N 取值为9和11,它们分别被称为FAST-9和FAST-11)。
- 循环以上四步,对每一个像素执行相同的操作。
-
FAST-12算法 怎么提高计算效率?
在FAST-12算法中,为了更高效,可以添加一项预测试操作
,以快速地排除绝大多数不是角点的像素。具体操作为:对于每个像素,直接检测邻域圆上的第1,5,9,13个像素的亮度。只有当这4个像素中有3个同时大于Ip +T 或小于Ip -T 时,当前像素才有可能是一个角点,否则应该直接排除。这样的预测试操作大大加速了角点检测。此外,原始的FAST角点经常出现“扎堆”的现象。所以在第一遍检测之后,还需要用非极大值抑制(Non-maximal suppression),在一定区域内仅保留响应极大值的角点,避免角点集中的问题。 -
FAST特征点的优点和缺点?
优点:
- 计算仅仅是比较像素间亮度的差异,速度非常快
缺点:
- FAST特征点数量很大且不确定,而我们往往希望对图像提取固定数量的特征
- FAST角点不具有方向信息
- 由于它固定取半径为3的圆,存在尺度问题:远处看着像是角点的地方,接近后看可能就不是角点了
- ORB 特征对 FAST 的改进是什么?
- 特征点数量不固定问题:可以指定最终要提取的角点数量N ,对原始FAST角点分别计算Harris响应值,然后选取前N 个具有最大响应值的角点作为最终的角点集合。
- 不具有方向性和尺度问题:ORB添加了尺度和旋转的描述。尺度不变性由构建图像金字塔(金字塔是指对图像进行不同层次的降采样,以获得不同分辨率的图像。),并在金字塔的每一层上检测角点来实现。而特征的旋转是由灰度质心法(Intensity Centroid)实现的。
- 灰度质心法是什么?
所谓质心是指以图像块灰度值作为权重的中心。其具体操作步骤如下[35] :
1.在一个小的图像块B 中,定义图像块的矩为
2.通过矩可以找到图像块的质心:
3.连接图像块的几何中心O 与质心C ,得到一个方向向量 \(\overrightarrow{OC}\),于是特征点的方向可以定义为
通过以上方法,FAST角点便具有了尺度与旋转的描述,从而大大提升了其在不同图像之间表述的健壮性。所以在ORB中,把这种改进后的FAST称为Oriented FAST。
- BRIEF描述子是什么?
在提取Oriented FAST关键点后,我们对每个点计算其描述子。ORB使用改进的BRIEF特征描述。我们先来介绍一下BRIEF是什么。
BRIEF是一种二进制
描述子,其描述向量由许多个0和1组成,这里的0和1编码了关键点附近两个像素(比如p 和q )的大小关系:如果p 比q 大,则取1,反之就取0。如果我们取了128个这样的p,q ,最后就得到128维由0、1组成的向量。那么,p 和q 如何选取呢?在作者原始的论文中给出了若干种挑选方法,大体上都是按照某种概率分布,随机地挑选p 和q 的位置,读者可以阅读BRIEF论文或OpenCV源码以查看其具体实现[34] 。BRIEF使用了随机选点的比较,速度非常快,而且由于使用了二进制表达,存储起来也十分方便,适用于实时的图像匹配。原始的BRIEF描述子不具有旋转不变性,因此在图像发生旋转时容易丢失。而ORB在FAST特征点提取阶段计算了关键点的方向,所以可以利用方向信息,计算了旋转之后的“Steer BRIEF”特征使ORB的描述子具有较好的旋转不变性。
由于考虑到了旋转和缩放,使得ORB在平移、旋转和缩放的变换下仍有良好的表现。同时,FAST和BREIF的组合也非常高效,使得ORB特征在实时SLAM中非常受欢迎。下图展示了一张图像提取ORB之后的结果。
- 特征匹配是干什么呢?
通过对图像与图像或者图像与地图之间的描述子进行准确匹配,我们可以为后续的姿态估计、优化等操作减轻大量负担。通过计算描述子距离知道哪些特征点是匹配的。
描述子距离表示了两个特征之间的相似程度 ,不过在实际运用中还可以取不同的距离度量范数。对于浮点类型的描述子,使用欧氏距离进行度量即可。而对于二进制的描述子(比如BRIEF这样的),我们往往使用汉明距离(Hamming distance)作为度量——两个二进制串之间的汉明距离,指的是其不同位数的个数 。