ORB特征是目前最优秀的特征提取与匹配算法之一,下面具体讲解一下:html
【转载自 https://www.cnblogs.com/zjiaxing/p/5616653.html】算法
特征点的检测性能
图像的特征点能够简单的理解为图像中比较显著显著的点,如轮廓点,较暗区域中的亮点,较亮区域中的暗点等。ORB采用FAST(features from accelerated segment test)算法来检测特征点。这个定义基于特征点周围的图像灰度值,检测候选特征点周围一圈的像素值,若是候选点周围领域内有足够多的像素点与该候选点的灰度值差异够大,则认为该候选点为一个特征点。测试
其中I(x)为圆周上任意一点的灰度,I(p)为圆心的灰度,Ed为灰度值差得阈值,若是N大于给定阈值,通常为周围圆圈点的四分之三,则认为p是一个特征点。
为了得到更快的结果,还采用了额外的加速办法。若是测试了候选点周围每隔90度角的4个点,应该至少有3个和候选点的灰度值差足够大,不然则不用再计算其余点,直接认为该候选点不是特征点。候选点周围的圆的选取半径是一个很重要的参数,这里为了简单高效,采用半径为3,共有16个周边像素须要比较。为了提升比较的效率,一般只使用N个周边像素来比较,也就是你们常常说的FAST-N。不少文献推荐FAST-9,做者的主页上有FAST-九、FAST-十、FAST-十一、FAST-12,你们使用比较多的是FAST-9和FAST-12。编码
计算特征描述子3d
获得特征点后咱们须要以某种方式描述这些特征点的属性。这些属性的输出咱们称之为该特征点的描述子(Feature DescritorS).ORB采用BRIEF算法来计算一个特征点的描述子。
BRIEF算法的核心思想是在关键点P的周围以必定模式选取N个点对,把这N个点对的比较结果组合起来做为描述子。htm
步骤:
1.以关键点P为圆心,以d为半径作圆O。
2.在圆O内某一模式选取N个点对。这里为方便说明,N=4,实际应用中N能够取512.
假设当前选取的4个点对如上图所示分别标记为:blog
3.定义操做T图片
4.分别对已选取的点对进行T操做,将获得的结果进行组合。
假如:字符串
则最终的描述子为:1011
理想的特征点描述子应该具有的属性:
在现实生活中,咱们从不一样的距离,不一样的方向、角度,不一样的光照条件下观察一个物体时,物体的大小,形状,明暗都会有所不一样。但咱们的大脑依然能够判断它是同一件物体。理想的特征描述子应该具有这些性质。即,在大小、方向、明暗不一样的图像中,同一特征点应具备足够类似的描述子,称之为描述子的可复现性。
当以某种理想的方式分别计算描述子时,应该得出一样的结果。即描述子应该对光照(亮度)不敏感,具有尺度一致性(大小 ),旋转一致性(角度)等。
ORB并无解决尺度一致性问题,在OpenCV的ORB实现中采用了图像金字塔来改善这方面的性能。ORB主要解决BRIEF描述子不具有旋转不变性的问题。
回顾一下BRIEF描述子的计算过程:
在当前关键点P周围以必定模式选取N个点对,组合这N个点对的T操做的结果就为最终的描述子。当咱们选取点对的时候,是以当前关键点为原点,以水平方向为X轴,以垂直方向为Y轴创建坐标系。当图片发生旋转时,坐标系不变,一样的取点模式取出来的点却不同,计算获得的描述子也不同,这是不符合咱们要求的。所以咱们须要从新创建坐标系,使新的坐标系能够跟随图片的旋转而旋转。这样咱们以相同的取点模式取出来的点将具备一致性。
打个比方,我有一个印章,上面刻着一些直线。用这个印章在一张图片上盖一个章子,图片上分处直线2头的点将被取出来。印章不变更的状况下,转动下图片,再盖一个章子,但此次取出来的点对就和以前的不同。为了使2次取出来的点同样,我须要将章子也旋转同一个角度再盖章。(取点模式能够认为是章子上直线的分布状况)
ORB在计算BRIEF描述子时创建的坐标系是以关键点为圆心,以关键点和取点区域的形心的连线为X轴创建2维坐标系。
P为关键点。圆内为取点区域,每一个小格子表明一个像素。如今咱们把这块圆心区域看作一块木板,木板上每一个点的质量等于其对应的像素值。根据积分学的知识咱们能够求出这个密度不均匀木板的质心Q。计算公式以下。其中R为圆的半径。
咱们知道圆心是固定的并且随着物体的旋转而旋转。当咱们以PQ做为坐标轴时,在不一样的旋转角度下,咱们以同一取点模式取出来的点是一致的。这就解决了旋转一致性的问题。
BRIEF中,采用了9x9的高斯算子进行滤波,能够必定程度上解决噪声敏感问题,但一个滤波显然是不够的。ORB中提出,利用积分图像来解决:在31x31的窗口中,产生一对随机点后,以随机点为中心,取5x5的子窗口,比较两个子窗口内的像素和的大小进行二进制编码,而非仅仅由两个随机点决定二进制编码。(这一步可有积分图像完成)
特征点的匹配
ORB算法最大的特色就是计算速度快 。 这首先得益于使用FAST检测特征点,FAST的检测速度正如它的名字同样是出了名的快。再次是使用BRIEF算法计算描述子,该描述子特有的2进制串的表现形式不只节约了存储空间,并且大大缩短了匹配的时间。
例如特征点A、B的描述子以下。
A:10101011
B:10101010
咱们设定一个阈值,好比80%。当A和B的描述子的类似度大于90%时,咱们判断A,B是相同的特征点,即这2个点匹配成功。在这个例子中A,B只有最后一位不一样,类似度为87.5%,大于80%。则A和B是匹配的。
咱们将A和B进行异或操做就能够轻松计算出A和B的类似度。而异或操做能够借组硬件完成,具备很高的效率,加快了匹配的速度。
汉明距离:
汉明距离是以理查德•卫斯里•汉明的名字命名的。在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不一样字符的个数。换句话说,它就是将一个字符串变换成另一个字符串所须要替换的字符个数。例如:1011101 与 1001001 之间的汉明距离是 2。2143896 与 2233796 之间的汉明距离是 3。"toned" 与 "roses" 之间的汉明距离是 3。给予两个任何的字码,10001001和10110001,便可决定有多少个相对位是不同的。在此例中,有三个位不一样。要决定有多少个位不一样,只需将xor运算加诸于两个字码就能够,并在结果中计算有多个为1的位。例如:10001001Xor 1011000100111000两个字码中不一样位值的数目称为汉明距离(Hamming distance) 。