前面转载过一篇ORB特征的原理解读,我感觉讲的是很详细的,但是特征点在SLAM中的运用,还不是很清楚,我们知道特征点是由关键点和描述子组成的。常见的特征有SIFT特征,SURF特征等。那么为什么ORB-SLAM2选择ORB特征呢?这是因为虽然SIFT考虑了图像变换过程中出现的光照、尺寸、旋转等变化,但需要较大计算量,在没有GPU加速的情况下,很难在SLAM这种系统中进行实时计算,另一方面,SIFT特征和SURF特征是受到专利保护的,需要付费使用。
ORB取名已经反映出其是一个结合了改良后的FAST角点提取和BRIEF描述子的算法,提取ORB特征分为两步:
1、FAST关键点提取:找出图像中的FAST角点,相较于原版的FAST,ORB中计算了特征点的主方向,为后续的BRIEF描述子增加了旋转不变性;
2、BRIEF描述子:对上一步提取出关键点的周围图像区域进行描述。
FAST是一种角点,主要检测局部像素灰度变化明显的地方,以速度快著称。FAST只需要比较像素亮度大小,速度很快,它的检测过程如下:
1、在图像中选取像素pp,假设它的亮度为IpIp;
2、设置一个阈值TT(比如IpIp的20%);
3、以像素p为中心,选取半径为3的圆上的16个像素点;
4、假如选取的圆上有连续的N个点的亮度大于Ip+TIp+T或者小于Ip−TIp−T,那么像素pp可以被认为是特征点(N通常取12,即FAST-12)。
5、循环以上四步,对每一个像素执行相同的操作。
FAST角点检测虽然速度很快,但是它存在一些问题。首先是FAST角点数量很大且不确定,因此ORB对其进行改进。ORB指定最终要提取的角点数量N,对原始FAST角点分别计算Harris响应值,然后选取前N个具有最大值的角点作为最终的角点集合。
其次,FAST不具有尺寸,因此ORB构建图像金字塔,对图像进行不同层次的降采样,获得不同分辨率的图像,并在金字塔的每一层上检测角点,从而获得多尺寸特征。(前面一直搞不清为什么要用金字塔来取特征点)
FAST没有计算旋转,因此ORB通过计算以FAST角点O为中心的图像块的质心C,那么向量OC→OC→的方向就是特征点的方向,具体值通过图像块的矩得到。
通过各种改进,FAST特征具有了尺寸和旋转的描述,在ORB中,把这种改进后的FAST称为oFAST。
BRIEF描述子
BRIEF描述子是一种二进制字符描述子,其描述向量定义如下:
fn(p)=∑1≤i≤n2i−1τ(p;xi,yi)
fn(p)=∑1≤i≤n2i−1τ(p;xi,yi)
其中,
τ(p;x,y)={1,0,p(x)<p(y)p(x)≥p(y)
τ(p;x,y)={1,p(x)<p(y)0,p(x)≥p(y)
p(x)p(x) 是图像块p中点xx的强度。ττ的选择有很多种,常见的选择方式是围绕图像块中心的高斯分布。n选为256的话,fn(p)fn(p)就是256维的向量。BRIEF由于使用了二进制表达,存储起来十分方便,适用于实时的图像匹配。原始的BRIEF描述子不具有旋转不变性,因此在图片发生旋转时,匹配性能会急速下降。ORB根据之前关键点的方向来旋转图像块,得到“steer BRIEF”。
BRIEF具有每个bit的方差很大,均值约为0.5的特性,但是“steer BRIEF”丧失了这种特性,其均值不再集中在0.5左右。可以理解为特定方向的角点关键点使得其产生发散。这样会导致使用“steer BRIEF”进行匹配时的错误率变高,因为“steer BRIEF”的方差发生了亏损,彼此之间区分度降低。同时我们希望每个ττ彼此不相干,这样得到的BRIEF更加有区分度。
为了解决上述问题,BRIEF采用了贪婪搜索,对所有可能的ττ进行搜索,找出既具有高方差,均值约为0.5,同时又不相干的ττ,最终结果称为rBRIEF。
由于考虑了旋转和缩放,使得ORB在平移、旋转和缩放的变换下仍具有良好的表现。同时,FAST和BRIEF的计算非常高效,使得ORB特征在实时SLAM系统中得以应用。