1.ORB特征简介
ORB是Oriented FAST and Rotated BRIEF(oFAST and rBRIEF)的简称,ORB的名字已经说明了其来源,其实ORB特征是采用FAST方法来检测提取特征,但FAST特征本身是不具有方向性的,所以在ORB特征中添加对特征方向的计算;另外,ORB采用BRIEF方法计算特征描述子,BRIEF的优点在于速度,但是缺点也很明显:不具备旋转不变性,对噪声敏感,不具备尺度不变性。orb-slam重点解决的是旋转不变性和噪声问题。接下来,首先针对orb特征进行详细说明,并在下一章节中针对orb-slam(version1)中的orb代码部分进行解析测试。
[以下为个人学习理解,如果错误,欢迎指正]
2.orb特征之oFAST
如何确定特征点?
FAST特征以其计算速度快被广泛使用,ORB特征除了使用FAST方法定位特征点位置之外,还针对特征点的方向进行了补充添加。
FAST特征的基本原理是对于当前像素点,取邻域离散圆周上若干采样像素点(如下图的p点表示当前像素位置,以3个像素点为半径,标号1-16的16个点表示圆周上采样的16个像素点)
我们认为一个像素如果是“角点”(即特征点),那么这16个采样点中至少有N(N可以等于9,12等,对应于FAST-9,FAST-12等)个连续像素点要么大于当前像素点加上一个阈值,要么小于当前像素点减掉一个阈值,我们设这个阈值为t。但实际上,通常在图像中,“角点”的数量要远小于非“角点”的数量,所以可以采用一种更快速的方法来确定当前像素点是否为“角点”(实际上是快速的排除非特征点的像素),方法是,
1)当前像素点p与标号为1,9的像素点进行比较,如果有 Ip−t<Ii<Ip+t,i= 1 or 9 ,则当前像素点肯定不是“角点”,否则的话进行下一步判断;
2)当前像素点p与标号1,5,9,13的像素点进行比较,如果至少有三个像素点满足 Ii<Ip−t or Ii>Ip+t,i= 1 or 5 or 9 or 13,则认为当前像素点可能为“角点”,进行下一步判断;
3)当前像素点p与所有标号的采样像素点进行比较,如果至少有N (N可以等于9,12等,对应于FAST-9,FAST-12等)个连续像素点满足 Ii<Ip−t or Ii>Ip+t,i=1...16 ,则认为当前像素点为“角点”,即FAST特征点,进行下一步非极大值抑制;
4) 非极大值抑制主要是为了避免图像上得到的“角点”过于密集,主要过程是,每个特征点会计算得到相应的响应得分,然后以当前像素点p为中心,取其邻域(如3x3 的邻域),判断当前像素p的响应值是否为该邻域内最大的,如果是,则保留,否则,则抑制。
上面针对如何选择特征点进行了说明,需要补充的是,orb特征中使用不同尺寸图像构成的图像金字塔,并分别在每一金字塔层图像上提取FAST特征,这样每一个被提取的特征具有“尺度”这一属性。
如何确定特征点方向?
现在我们已经知道如何在当前尺度空间中提取FAST特征,而特征点除了坐标/尺度(层)属性之外,还需要确定特征点的方向。接下来,将阐述orb如何为每一个特征点分配方向。
orb特征确定特征点方向的思路很简单,首先根据“矩”概念确定当前特征点邻域块的重心位置 C ,然后根据当前像素点中心 O 和 C 的连线方向确定特征点方向 θ
像素块区域的“矩“定义为,
3.ORB特征之rBRIEF
如何计算特征点描述符?
上面已经介绍了如何提取图像中的FAST特征以及如何计算特征点的方向,接下来将介绍如何计算每一个特征点的描述子。
ORB特征描述子采用BRIEF描述子并进行了改进,BRIEF描述子占用空间小,得益于BRIEF描述子的每一位要么是0要么是1,其基本思想是:在特征点邻域块内,按照一定的规则选择若干对像素点 p,q ,如果有 Ip>Iq ,则当前位的BRIEF描述子的值为1,否则为0。对于比较像素点对的个数,通常可以选择128,256不等。
但实际上,这样会存在一个很严重的问题,就是得到的描述子会对噪声很敏感,如果比较的像素点属于噪声,将对描述子的可靠性造成重要影响。所以,将上述的比较规则进行了调整,
steered BRIEF
BRIEF描述子本身没有解决旋转不变性的问题,所以在orb特征中对这个问题进行了解决,解决思路也很简单,就是在计算特征点描述子的过程中,将其邻域的若干比较对根据特征点的方向进行相应的旋转变换,即,如果 n 个测试对坐标表示为,
rBRIEF
上面阐述中有一个关键问题,那就是应该如何选择比较点对呢?这样考虑,如果比较点对的个数为256,那么最终的BRIEF描述子的位数就是256位,一个好的BRIEF描述子的每一位的变化性(variance)应该是足够大的,或者说每一位的数值分布是比较均匀的,不会过于密集或稀疏;另一个方面,BRIEF描述子的不同位之间应该是不相关的(也就是任意一位的表示应该具有代表性,而不会被其他的若干位线性表示)。
orb特征采用下面这样的算法来选择比较点对的坐标,
首先从数据集中确定300k个关键点。对于31x31的像素块,穷举所有5x5的子窗口像素块,也就是31x31像素块中所有的子窗口可能性有N=(31-5)*(31-5)种.那么从N种子窗口中选择2个子窗口进行比较的可能性就有 C2N ,除去存在重叠的比较子窗口对,最终有M=205590种测试可能(比较子窗口对)。
接下来,
1)对于M种中的每一种测试可能性,在300k个关键点上计算比较结果(每一种可能性对应于BRIEF描述子中的一位);
2)对于每一种测试可能性在关键点上的比较结果,计算300k个数据上的平均值,并按照距离0.5的远近大小由小到大进行排序,构成集合T(距离0.5越近,认为数据分布越平均,可以考虑这样的例子,100个数据中,有50个1,50个0,这样的数据是分布最均匀的,均值为50/100=0.5;而如果100个数据中均为1,则均值为100/100=1,是数据分布最为密集的情况)。这一步是考虑选择尽可能使得每一位BRIEF描述子的数据分布分散的比较对。
3)采用贪心算法
3.1)首先将T中的第一个测试对放入集合R;
3.2)从T中取下一个排序测试对,并与R中的所有测试对计算关联度,如果关联度超过一定的阈值,则放弃当前从T中取到的测试对;反之,则将当前的测试对加入集合R中;
3.3)重复前两步,直至R中有256个测试对。
R中挑选的256个测试对就是满足:
a 每一位描述子的variance尽可能大;
b 不同位描述子之间的关联度尽可能小。
4.总结
总而言之,ORB特征是采用FAST方法定位特征点坐标,采用矩方法计算特征点方向,使用BRIEF计算特征点描述子并根据特征点方向使得描述子具有旋转不变性,另外,通过贪心算法确定测试对。
在下一章节中,将根据orb-slam源代码中关于orb特征部分进行解析。