[转]ORB特征提取-----FAST角点检测

转载地址:https://blog.csdn.net/maweifei/article/details/62887831

(一)ORB特征点提取算法的简介

       Oriented FAST and Rotated BRIEF,简称ORB,该特征检测算子是在著名的FAST特征检测和BRIEF特征描述子的基础上提出来的,其运行时间远远优于SIFT和SURF,可应用于实时性特征检测。ORB特征检测具有尺度和旋转不变性,对于噪声及其透视变换也具有不变性,良好的性能是的利用ORB在进行特征描述时的应用场景十分广泛。ORB特征检测主要分为以下两个步骤:(1)方向FAST特征点检测(2)BRIEF特征描述。

(二)方向FAST特征点检测

     局部特征检测快速发展的时候,人们对于特征的认识也越来越深入,近几年来,许多学者提出了许许多多的特征检测算法及其相应算法的改进,在众多的特征提取算法中,不乏佼佼者的出现。
        从早期的Moravec,到Harris,再到SIFT,SURF等,可以说特征提取的算法层出不穷,各种改进的算法PCA-SIFT,ICA-SIFT,P-ASURF等也是搞得如火如荼,不亦乐乎。上面所说的SIFT和SURF提取到的特征也是非常的优秀(有较强的不变性),但是时间消耗依然十分巨大,而在一个系统中,特征点的提取仅仅是一部分,后续还需要进行诸如配准、提纯、图像融合等,这就使得系统的实时性不是很好,降低了系统的性能。Edward Rosten和Tom Drummond两位大神经过研究,与2006年在《Machine learning for high-speed corner detection》中提出了一种FAST特征点,并在2010年稍作修改之后发表了《Feature From Accelerated Segment Test》,简称FAST。注意:FAST只是一种特点检测算法,并不涉及特征点的描述。
        ORB采用的是FAST算子检测特征点,然后再给检测到的特征点加个特征方向信息,构成oFAST。解决了FAST算子不带有方向的严重缺陷。
       FAST角点检测是一种基于机器学习的快速角点特征的检测算法,具有方向的FAST关键点检测是对兴趣点所在圆周上的16个像素点进行判断,其核心思想就是找出那些卓尔不群的点,也就是拿出一个点跟它周围足够多的点比较,如果这个点和周围足够多的点不一样,那么就认为它是一个FAST角点.考虑图像中的任意一个像素点和以这个像素点为中心的区域,通常情况下,该区域选择圆形区域。如下图所示:要判断P点是否为角点:将P点的灰度值和它邻域内的16个像素点的灰度值进行比较,如果P点的像素值和圆圈上邻域内n个连续的像素点的像素值相减大于阈值t,那么就认为点P是一个角点。
         FAST角点检测计算的时间复杂度小,检测效果突出。FAST角点检测为加速该算法,通常首先对圆周上的点集进行排序,排序使得其计算过程大大得到了优化。FAST多尺度特性通过建立图像金字塔获得,引入灰度质心法用于实现特征点方向。


 

 

步骤一:粗提取。该步能够提取大量的特征点,但是有很大一部分的特征点的质量不高。下面介绍提取方法。从图像中选取一点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为半径范围内的质心,特征点坐标到质心形成一个向量作为该特征点的方向。矩定义如下:


 

其中,I(x,y)为图像灰度表达式。该矩的质心为:


 

假设角点坐标为O,则向量的角度即为该特征点的方向。计算公式如下:

  1. /********************************************************************************************************
  2. 文件说明:
  3. FAST角点检测
  4. 开发环境:
  5. Win7 + OpenCv2.4.8 + VS2012
  6. 时间地点:
  7. 陕西师范大学 2017.3.17
  8. 作 者:
  9. 九 月
  10. *********************************************************************************************************/
  11. #include <opencv2/core/core.hpp>
  12. #include <opencv2/highgui/highgui.hpp>
  13. #include <opencv2/imgproc/imgproc.hpp>
  14. #include <opencv2/features2d/features2d.hpp>
  15.  
  16. using namespace cv;
  17. using namespace std;
  18.  
  19. int main(int argc, char** argv)
  20. {
  21. cv::Mat img = imread( "hand1.jpg");
  22. std::vector<cv::KeyPoint> keypoints;
  23.  
  24. cv:: FastFeatureDetector fast(15); // 检测的阈值为50
  25. fast.detect(img, keypoints);
  26.  
  27. cv::Mat img_keypoints;
  28. cv::drawKeypoints(img, keypoints, img_keypoints, Scalar::all( -1), DrawMatchesFlags::DEFAULT);
  29.  
  30. cv::imshow( "Keypoints", img_keypoints);
  31. cv::waitKey( 0);
  32. return 0;
  33. }


参考资料:

1)http://blog.csdn.net/hujingshuang/article/details/46898007

2)http://m.blog.csdn.net/article/details?id=52625678

3)http://download.csdn.net/detail/yang843061497/7785917

 

4)http://www.cvchina.info/2011/07/04/whats-orb/ 

5)http://blog.sina.com.cn/s/blog_916b71bb0100w9al.html

猜你喜欢

转载自www.cnblogs.com/qiuheng/p/9274583.html