参考:https://blog.csdn.net/qq_20791919/article/details/80176643?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-1&spm=1001.2101.3001.4242
1. ORB算法介绍
ORB(Oriented FAST and Rotated BRIEF)是一种快速特征点提取和描述的算法。
这个算法是由Ethan Rublee, Vincent Rabaud, Kurt Konolige以及Gary R.Bradski在2011年一篇名为“ORB:An Efficient Alternative to SIFTor SURF”的文章中提出。
ORB算法分为两部分,分别是特征点提取和特征点描述。特征提取是由FAST(Features from Accelerated Segment Test)算法发展来的,特征点描述是根据BRIEF(Binary Robust IndependentElementary Features)特征描述算法改进的。
ORB特征是将FAST特征点的检测方法与BRIEF特征描述子结合起来,并在它们原来的基础上做了改进与优化。
据说,ORB算法的速度是sift的100倍,是surf的10倍。
好处:
给FAST检测子方向和快速计算;
高效计算带有方向的BRIEF特征
1.2. Fast特征提取
ORB算法的特征提取是由FAST算法改进的,这里成为oFAST(FASTKeypoint Orientation)。
也就是说,在使用FAST提取出特征点之后,给其定义一个特征点方向,以此来实现特征点的旋转不变形。
FAST算法是公认的最快的特征点提取方法。FAST算法提取的特征点 非常接近角点类型。
oFAST(FASTKeypoint Orientation):
步骤一:粗提取。 该步能够提取大量的特征点,但是有很大一部分的特征点的质量不高。
下面介绍提取方法。从图像中选取一点P,如上图1。我们判断该点是不是特征点的方法是,以P为圆心画一个半径为3pixel的圆。**圆周上如果有连续n个像素点的灰度值比P点的灰度值大或者小,则认为P为特征点。**一般n设置为12。为了加快特征点的提取,快速排出非特征点,首先检测1、9、5、13位置上的灰度值,如果P是特征点,那么这四个位置上有3个或3个以上的的像素值都大于或者小于P点的灰度值。如果不满足,则直接排出此点。
步骤二:机器学习的方法筛选最优特征点。简单来说就是使用ID3算法训练一个决策树,将特征点圆周上的16个像素输入决策树中,以此来筛选出最优的FAST特征点。
步骤三:**非极大值抑制去除局部较密集特征点。**使用非极大值抑制算法去除临近位置多个特征点的问题。**为每一个特征点计算出其响应大小。计算方式是特征点P和其周围16个特征点偏差的绝对值和。**在比较临近的特征点中,保留响应值较大的特征点,删除其余的特征点。
步骤四:**特征点的尺度不变形。**建立金字塔,来实现特征点的多尺度不变性。设置一个比例因子scaleFactor(opencv默认为1.2)和金字塔的层数nlevels(pencv默认为8)。将原图像按比例因子缩小成nlevels幅图像。缩放后的图像为:I’= I/scaleFactork(k=1,2,…, nlevels)。nlevels幅不同比例的图像提取特征点总和作为这幅图像的oFAST特征点。
步骤五:特征点的旋转不变性。 ORB算法提出使用矩(moment)法来确定FAST特征点的方向。也就是说通过矩来计算特征点以r为半径范围内的质心,特征点坐标到质心形成一个向量作为该特征点的方向。
参考:https://blog.csdn.net/zhou5513/article/details/108309752#computeOrientation_1
矩定义如下:
其中,I(x,y)为图像灰度表达式。该矩的质心为:
假设角点坐标为O,则向量的角度即为该特征点的方向。计算公式如下:
1.2 rBRIEF特征描述
rBRIEF特征描述是在BRIEF特征描述的基础上加入旋转因子改进的。下面先介绍BRIEF特征提取方法,然后说一说是怎么在此基础上修改的。
BRIEF算法描述
BRIEF算法计算出来的是一个二进制串的特征描述符。
它是在一个特征点的邻域内,选择n对像素点pi、qi(i=1,2,…,n)。
然后比较每个点对的灰度值的大小。
如果I(pi)> I(qi),则生成二进制串中的1,否则为0。
所有的点对都进行比较,则生成长度为n的二进制串。
一般n取128、256或512,opencv默认为256。
另外,值得注意的是为了增加特征描述符的抗噪性,算法首先需要对图像进行高斯平滑处理。在ORB算法中,在这个地方进行了改进,在使用高斯函数进行平滑后,又用了其他操作,使其更加的具有抗噪性。具体方法下面将会描述。
关于在特征点SxS的区域内选取点对的方法,BRIEF论文(附件2)中测试了5种方法:
1)在图像块内平均采样;
2)p和q都符合(0,S2/25)的高斯分布;
3)p符合(0,S2/25)的高斯分布,而q符合(0,S2/100)的高斯分布;
4)在空间量化极坐标下的离散位置随机采样;
5)把p固定为(0,0),q在周围平均采样。
五种采样方法的示意图如下:
论文指出,第二种方法可以取得较好的匹配结果。在旋转不是非常厉害的图像里,用BRIEF生成的描述子的匹配质量非常高,作者测试的大多数情况中都超越了SURF。但在旋转大于30°后,BRIEF的匹配率快速降到0左右。BRIEF的耗时非常短,在相同情形下计算512个特征点的描述子时,SURF耗时335ms,BRIEF仅8.18ms;匹配SURF描述子需28.3ms,BRIEF仅需2.19ms。在要求不太高的情形下,BRIEF描述子更容易做到实时。
从上图(1)(2)(3)可以看出,ORB算法的特征匹配效果比较理想,并且具有较稳定的旋转不变性。
但是通过(4)看出,ORB算法在尺度方面效果较差,在增加算法的尺度变换的情况下仍然没有取得较好的结果。
ORB是一种快速的特征提取和匹配的算法。它的速度非常快,但是相应的算法的质量较差。
和sift相比,ORB使用二进制串作为特征描述,这就造成了高的误匹配率。