OpenCV特征点提取----Fast特征

简介: 1.FAST(featuresfrom accelerated segment test)算法   http://blog.csdn.net/yang_xian521/article/details/7411438   特征点检测和匹配是计算机视觉中一个很有用的技术。

1.FASTfeaturesfrom accelerated segment test算法

 

http://blog.csdn.net/yang_xian521/article/details/7411438

 

特征点检测和匹配是计算机视觉中一个很有用的技术。在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用。很多传统的算法都很耗时,而且特征点检测算法只是很多复杂图像处理里中的第一步,得不偿失。FAST特征点检测是公认的比较快速的特征点检测方法,只利用周围像素比较的信息就可以得到特征点,简单,有效。

 

 

FAST特征检测算法来源于corner的定义,这个定义基于特征点周围的图像灰度值,检测候选特征点周围一圈的像素值,如果候选点周围领域内有足够多的像素点与该候选点的灰度值差别够大,则认为该候选点为一个特征点。

 

 

其中Ix)为圆周上任意一点的灰度,Ip)为圆心的灰度,Ed为灰度值差得阈值,如果N大于给定阈值,一般为周围圆圈点的四分之三,则认为p是一个特征点。

 

 

为了获得更快的结果,还采用了额外的加速办法。如果测试了候选点周围每隔90度角的4个点,应该至少有3个和候选点的灰度值差足够大,否则则不用再计算其他点,直接认为该候选点不是特征点。候选点周围的圆的选取半径是一个很重要的参数,这里我为了简单高效,采用半径为3,共有16个周边像素需要比较。为了提高比较的效率,通常只使用N个周边像素来比较,也就是大家经常说的FAST-N。我看很多文献推荐FAST-9,作者的主页上有FAST-9FAST-10FAST-11FAST-12,大家使用比较多的是FAST-9FAST-12。上个图说明的更形象一些

 

 


 

 

OpenCV里对FAST的使用也非常简单,先声明一组特征点,构建FAST特征检测,接下来调用detect函数检测图像中的特征点,最后把特征点绘制到图片上。上代码说的清楚些

 


 

 

Features From Accelerated Segment Test

1. Fast算法原理

博客中已经介绍了很多图像特征检测算子,我们可以用LoG或者DoG检测图像中的Blobs(斑点检测),可以根据图像局部的自相关函数来求得Harris角点(Harris角点),后面又提到了两种十分优秀的特征点及它们的描述方法SIFT特征与SURF特征。

 

SURF特征算是为了提高运算效率对SIFT特征的一种近似,虽然在有些实验环境中已经达到了实时,但是我们实践工程应用中,特征点的提取与匹配只是整个应用算法中的一部分,所以我们对于特征点的提取必须有更高的要求,从这一点来看前面介绍的的那些特征点方法都不可取。

 

为了解决这个问题,Edward RostenTom Drummond2006年发表的“Machine learning for high-speedcorner detection[1]”文章中提出了一种FAST特征,并在2010年对这篇论文作了小幅度的修改后重新发表[2]FAST的全称为Features From Accelerated SegmentTestRosten等人将FAST角点定义为:若某像素点与其周围领域内足够多的像素点处于不同的区域,则该像素点可能为角点。

 

也就是某些属性与众不同,考虑灰度图像,即若该点的灰度值比其周围领域内足够多的像素点的灰度值大或者小,则该点可能为角点。

 

 

2. FAST算法步骤

  1. 从图片中选取一个像素$P$,下面我们将判断它是否是一个特征点。我们首先把它的亮度值设为$I_p$

 

  1. 设定一个合适的阈值$t$

 

  1. 考虑以该像素点为中心的一个半径等于3像素的离散化的Bresenham圆,这个圆的边界上有16个像素(如图1所示)。

 

    1 FAST特征点示意图

    1. 现在,如果在这个大小为16个像素的圆上有$n$个连续的像素点,它们的像素值要么都比$I_p + t$大,要么都比$I_p - t$小,那么它就是一个角点。(如图1中的白色虚线所示)。$n$的值可以设置为12或者9,实验证明选择9可能会有更好的效果。

     

     

     

      上面的算法中,对于图像中的每一个点,我们都要去遍历其邻域圆上的16个点的像素,效率较低。我们下面提出了一种高效的测试(high-speed test)来快速排除一大部分非角点的像素。该方法仅仅检查在位置19513四个位置的像素,首先检测位置1和位置9,如果它们都比阈值暗或比阈值亮,再检测位置5和位置13。如果$P$是一个角点,那么上述四个像素点中至少有3个应该必须都大于$I_p+t$或者小于$I_p-t$,因为若是一个角点,超过四分之三圆的部分应该满足判断条件。

       

      如果不满足,那么$p$不可能是一个角点。对于所有点做上面这一部分初步的检测后,符合条件的将成为候选的角点,我们再对候选的角点,做完整的测试,即检测圆上的所有点。

      上面的算法效率实际上是很高的,但是有点一些缺点:

      1. $n<12$时不能拒绝许多的候选点;
      2. 检测出来的角点不是最优的,这是因为它的效率取决于问题的排序与角点的分布;
      3. 对于角点分析的结果被丢弃了;
      4. 多个特征点容易挤在一起。

       

        4.非极大值抑制

        从邻近的位置选取了多个特征点是另一个问题,我们可以使用Non-Maximal Suppression来解决。

        1. 为每一个检测到的特征点计算它的响应大小(score function$V$。这里$V$定义为点$p$和它周围16个像素点的绝对偏差的和。
        2. 考虑两个相邻的特征点,并比较它们的$V$值。
        3. $V$值较低的点将会被删除。

        5. OpenCV中进行FAST特征检测

        OpenCV中进行FAST特征提取的函数为FAST。它一共有4个参数,第一个参数是输入的图像,第二个是返回的特征点,第三个是定义的阈值,第四个决定是否使用非极大值抑制。

        void FAST(InputArray image,vector& keypoints,int threshold,boolnonmaxSuppression=true )

         

        C++:void FASTX(InputArray image,vector& keypoints,int threshold,boolnonmaxSuppression, int type)

         

        另外还有一个接口为FASTX,它提供了第五个参数type用来指定FAST检测中像素邻域圆的参数:TYPE_9_16TYPE_7_12TYPE_5_8

         

         

         

        6.总结

         

        FAST算法比其他已知的角点检测算法要快很多倍,但是当图片中的噪点较多时,它的健壮性并不好,而且算法的效果还依赖于一个阈值$t$

         

        而且FAST不产生多尺度特征而且FAST特征点没有方向信息,这样就会失去旋转不变性。

         

         

         

         

        [1] Edward Rosten and Tom Drummond, “Machine learning for high speedcorner detection” in 9th European Conference on Computer Vision, vol. 1, 2006,pp. 430–443.

         

         

        [2] Edward Rosten, Reid Porter, and Tom Drummond, “Faster and better: amachine learning approach to corner detection” in IEEE Trans. Pattern

        Analysisand Machine Intelligence, 2010, vol 32, pp. 105-119.

         

        FAST特征提出之后,实时计算机视觉应用中特征提取性能才有显著改善。目前以其高计算效率(computational performance)、高可重复性(high repeatability)成为计算机视觉领域最流行的角点检测方法。

        1997年,Simth提出了SUSAN角点检测方法[1]。网址http://users.fmrib.ox.ac.uk/~steve/susan/.

        SUSAN方法的基础上,2005, Rosten在论文[2]中提出基于The segment test criterion的角点检测方法,全称“Features fromAccelerated Segment Test”,简称FAST

         

         

         



        2006

        年,Rosten[3]中使用机器学习对FAST的一些缺点进行改进,他的主页http://www.edwardrosten.com/work/fast.html提供的FAST实现即基于此论文。后续在2009年提出性能增强(可重复性增强、计算效率下降)FAST-ER[4]

         

         

         



        2010

        年,MairECCV会议论文[5]中提出AGAST特征。对FAST底层的the accelerated segment test进行改进,通过在扩展配置空间寻找最优决策树,使用特定树的组合获得自适应并且通用的accelerated segment test。对FAST 9-16 detector提速约13%,对FAST 7-12 detector提速最高30%,对FAST 5-8 detector提速最高50%AGAST项目网址http://www6.in.tum.de/Main/ResearchAgast.

         

         

         



        2011

        年,S. LeuteneggerBRISK描述子[6]中提出multi-scale AGAST detector, 并用实验证明与SURF detector有等效的可重复性(equivalentrepeatability)。对Graffiti序列的第一幅图检测时间为17.20ms,约为SURF detector消耗时间的16%SIFT detector消耗时间的1%.BRISK项目地址

         

         

         



        参考文献:
        [1]S. M. Simth, J. M. Brady, Susan - a new approach to low level imageprocessing. International Journal of Computer Vision 23, 1997.
        [2]E. Rosten, T. Drummond, Fusing points and lines for high performancetracking. IEEE International Conference on Computer Vision, 2005.
        [3]E. Rosten, T. Drummond, Machine learning for high-speed corner detection,ECCV 2006.
        [4]E. Rosten, R. Porter, T. Drummond, Faster and better: A machine learningapproach to corner detection, IEEE PAMI, 2009.
        [5]E. Mair, G. D. Hager, Adaptive and generic corner detection based on theaccelerated segment test, ECCV 2010.
        [6]S. Leutenegger, et.al. Brisk:Binary robust invariant scalable keypoints,ICCV 2011.

         

         

         

        代码:

         

         

         

        // feature_detection.cpp : 定义控制台应用程序的入口点。
        //
        
        #include "stdafx.h"
        #include 
        
        #include 
        #include 
        #include 
        #include              //  sift特征在这个头文件中  
        
        #include 
        
        #pragma comment(lib,"opencv_core2410d.lib")              
        #pragma comment(lib,"opencv_highgui2410d.lib")              
        #pragma comment(lib,"opencv_imgproc2410d.lib") 
        #pragma comment(lib,"opencv_features2d2410d.lib") 
        #pragma comment(lib,"opencv_nonfree2410d.lib") 
        
        using namespace std;
        using namespace cv;
        
        //struct DrawMatchesFlags
        //{   
        //	enum    {
        //		DEFAULT = 0, // 输出图像将被创建(Mat::create),
        //		// 只画出特征点,而不画出周围的circle包含特征点的大小和方向.
        //		DRAW_OVER_OUTIMG = 1, // 输出图像将被创建(using Mat::create),匹配点将被画在输出图像的内容上.
        //		NOT_DRAW_SINGLE_POINTS = 2, // 单个的点不画出.
        //		DRAW_RICH_KEYPOINTS = 4 // 对每个特征点周围的circle,包含特征点的大小和方向将被画出.    
        //	};
        //};
        void fast_feature()
        {
        	Mat image;
        	image = imread("swan.jpg");
        	// vector of keyPoints
        	std::vector keyPoints;
        	// construction of the fast feature detector object
        	FastFeatureDetector fast(80);	// 检测的阈值为80
        	// feature point detection
        	fast.detect(image,keyPoints);
        	drawKeypoints(image, keyPoints, image, Scalar::all(-1), DrawMatchesFlags::DRAW_OVER_OUTIMG);
        	imshow("FAST feature", image);
        	//cvWaitKey(0);
        }
        
        
        
        bool sift_feature()
        {
        	Mat image = imread("swan.jpg", 1);
        	if(!image.data)
        	{
        		cout << "Fail to load image" << endl;
        		return 0;
        		
        	}
        	vector keypoints;          //  存放关键点
        
        	// 其中0.03代表特征的阀值:用于去除低对比度的关键点   10是用于降低直线敏感度的阀值:去除不稳点的边缘响应点
        	SiftFeatureDetector sift(0.03, 10.0);   
        	sift.detect(image, keypoints);
        
        	drawKeypoints(image, keypoints, image, Scalar(255,255,255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
        	namedWindow("sift");
        	imshow("sift", image);
        	
        	
        }
        
        void main()
        {
        	sift_feature();
        	fast_feature();
        
        	waitKey(0);
        	
        }


         

         

         

        参考文献:

         

         

         

        http://blog.csdn.net/yang_xian521/article/details/7411438

         

        http://blog.csdn.net/cy513/article/details/4285579

         

        http://blog.csdn.net/sunanger_wang/article/details/7949202

         

         

        相关文章
        |
        Kubernetes 容器 Perl
        使用kube-proxy让外部网络访问K8S service的ClusterIP
        配置方式 kubernetes版本大于或者等于1.2时,外部网络(即非K8S集群内的网络)访问cluster IP的办法是: 修改master的/etc/kubernetes/proxy,把KUBE_PROXY_ARGS=”“改为KUBE_PROXY_ARGS=”–proxy-mode=userspace” 重启kube-proxy服务 在核心路由设备或者源主机上添加一条路由,访问cluster IP段的路由指向到master上。
        4996 0
        |
        5月前
        |
        JavaScript 数据可视化 Java
        开源医院随访系统:基于Spring Boot、Vue前后端分离的源码解决方案
        医院随访系统是连接院内HIS/EMR的智能平台,支持电话、短信、微信等多渠道随访,涵盖关怀与管理两类场景。采用Java+Spring Boot+Vue技术栈,具备模板灵活配置、智能提醒、满意度闭环、数据报表等功能,延伸医疗服务链,提升康复质量与管理决策水平。
        450 0
        |
        2月前
        |
        人工智能 运维 安全
        企业级Java AI新范式:AgentRAG+经验库精准触发
        JBoltAI提出AgentRAG新范式,融合RAG精准检索与Agent执行能力,以可配置、可复用的“经验库”为核心,实现意图精准触发、固定步骤自动执行,解决企业Java系统中检索不准、流程失控、幻觉、复用难、对接繁等痛点,助力AI真正落地核心业务。(239字)
        174 2
        |
        2月前
        |
        人工智能 机器人 API
        阿里云计算巢部署OpenClaw图文攻略|飞书集成+千问Qwen3.6-Plus配置+新手避坑指南
        2026年,开源AI智能体框架OpenClaw(曾用名Clawdbot,被用户亲切称为“小龙虾”)已成为企业与个人搭建专属AI助手的首选方案。其核心优势在于支持自然语言指令理解、主动任务规划、多工具调用与多渠道消息接入,能实现7×24小时自动化办公、客户服务与内容处理。阿里云计算巢提供官方认证的OpenClaw部署模板,让新手无需掌握复杂运维知识,即可一键完成生产级环境搭建;搭配阿里云千问Qwen3.6-Plus大模型,可解锁超长上下文、深度逻辑推理与精准任务执行能力;集成飞书后,能无缝融入企业协作流程,实现群聊指令响应、自动化通知、文件处理等核心功能。
        496 0
        |
        9月前
        |
        数据采集 运维 监控
        构建企业级Selenium爬虫:基于隧道代理的IP管理架构
        构建企业级Selenium爬虫:基于隧道代理的IP管理架构
        |
        9月前
        |
        异构计算 Python
        ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
        ERROR: pip’s dependency resolver does not currently take into 报错-Python项目依赖冲突的解决方案-优雅草优雅草卓伊凡
        728 1
        |
        10月前
        |
        Ubuntu 搜索推荐 Linux
        从下载到使用:详细虚拟机安装Ubuntu的指南
        对于未曾体验过的用户而言,通过虚拟机安装Ubuntu的过程清晰明了,每一步操作都简单易懂,使得系统能够迅速安装完成。此外,虚拟机还提供了快照功能,允许用户保存系统各个阶段的状态,并可随时删除或重新安装,为初次尝试Ubuntu系统的用户带来了极大的便利。这正是踏入Linux世界的最简单、最便捷的途径。不妨现在就开始,加入Ubuntu的行列,亲身体验Linux的魅力吧。
        质数
        【10月更文挑战第22天】质数。
        667 67
        |
        数据采集 机器学习/深度学习 自然语言处理
        一文讲懂大模型调优技术
        随着AI技术的发展,大模型如GPT系列、BERT等成为推动自然语言处理和计算机视觉领域进步的重要驱动力。然而,大模型的调优过程复杂且资源消耗巨大,对开发者构成严峻挑战。本文旨在全面解析大模型调优的关键技术,涵盖数据预处理、模型架构调整、超参数优化、正则化与泛化能力提升,以及分布式训练与并行优化等内容,为开发者提供系统性的调优指南。
        |
        消息中间件 Kafka 数据安全/隐私保护
        RabbitMQ异步通信详解
        RabbitMQ异步通信详解
        695 17