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

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

(二)方向FAST特征点检测

局部特征检测快速发展的时候,人们对于特征的认识也越来越深入,近几年来,许多学者提出了许许多多的特征检测算法及其相应算法的改进,在众多的特征提取算法中,不乏佼佼者的出现。

注意:FAST只是一种特点检测算法,并不涉及特征点的描述。

        ORB采用的是FAST算子检测特征点,然后再给检测到的特征点加个特征方向信息,构成oFAST。解决了FAST算子不带有方向的严重缺陷。

FAST角点检测是一种基于机器学习的快速角点特征的检测算法,具有方向的FAST关键点检测是对兴趣点所在圆周上的16个像素点进行判断,其核心思想就是找出那些卓尔不群的点,也就是拿出一个点跟它周围足够多的点比较,如果这个点和周围足够多的点不一样,那么就认为它是一个FAST角点.考虑图像中的任意一个像素点和以这个像素点为中心的区域,通常情况下,该区域选择圆形区域。如下图所示:要判断P点是否为角点:将P点的灰度值和它邻域内的16个像素点的灰度值进行比较,如果P点的像素值和圆圈上邻域内n个连续的像素点的像素值相减大于阈值t,那么就认为点P是一个角点。

         FAST角点检测计算的时间复杂度小,检测效果突出。FAST角点检测为加速该算法,通常首先对圆周上的点集进行排序,排序使得其计算过程大大得到了优化。FAST多尺度特性通过建立图像金字塔获得,引入灰度质心法用于实现特征点方向。

特征稳定性psi特征筛选 python实现 特征检测_像素点

 

 

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

特征稳定性psi特征筛选 python实现 特征检测_特征点_02

 

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

特征稳定性psi特征筛选 python实现 特征检测_像素点_03

 

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

特征稳定性psi特征筛选 python实现 特征检测_特征点_04

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. "hand1.jpg"); 
22. std::vector<cv::KeyPoint> keypoints; 
23.  
24. FastFeatureDetector fast(15);   // 检测的阈值为50  
25. 	fast.detect(img, keypoints);   
26.  
27.     cv::Mat img_keypoints; 
28. -1), DrawMatchesFlags::DEFAULT); 
29.  
30. "Keypoints", img_keypoints);
31. 0); 
32. return 0; 
33. }

特征稳定性psi特征筛选 python实现 特征检测_特征点_05