简介

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

从最早期的Moravec,到Harris,再到SIFT、SUSAN、GLOH、SURF算法,可以说特征提取算法层出不穷。各种改进算法PCA-SIFT、ICA-SIFT、P-ASURF、R-ASURF、Radon-SIFT等也是搞得如火如荼,不亦乐乎。上面的算法如SIFT、SURF提取到的特征也是非常优秀(有较强的不变性),但是时间消耗依然很大,而在一个系统中,特征提取仅仅是一部分,还要进行诸如配准、提纯、融合等后续算法。这使得实时性不好,降系了统性能。

Edward Rosten和Tom Drummond两位大神经过研究,于2006年在《Machine learning for high-speed corner detection》中提出了一种FAST特征点,并在2010年稍作修改后发表了《Features From Accelerated Segment Test》,简称FAST。注意:FAST只是一种特征点检测算法,并不涉及特征点的特征描述。

FAST详解

FAST特征的定义

FAST的提出者Rosten等将FAST角点定义为:若某像素与其周围邻域内足够多的像素点相差较大,则该像素可能是角点。

FAST算法的步骤

1、上图所示,一个以像素p为中心,半径为3的圆上,有16个像素点(p1、p2、...、p16)。

2、定义一个阈值。计算p1、p9、p5、p13与中心p的像素差,若它们的绝对值有至少3个超过阈值,则当做候选角点,再进行下一步考察;否则,不可能是角点;

3、若p是候选点,则计算p1到p16这16个点与中心p的像素差,若它们有至少连续9个超过阈值,则是角点;否则,不可能是角点。

4、对图像进行非极大值抑制:计算特征点出的FAST得分值(即score值,也即s值),判断以特征点p为中心的一个邻域(如3x3或5x5)内,计算若有多个特征点,则判断每个特征点的s值(16个点与中心差值的绝对值总和),若p是邻域所有特征点中响应值最大的,则保留;否则,抑制。若邻域内只有一个特征点(角点),则保留。得分计算公式如下(公式中用V表示得分,t表示阈值):

上面是FAST-9,当然FAST-10、FAST-11、FAST-12也是一样的,只是步骤3中,超过阈值的个数不一样。FAST算法实现起来简单,尤其是以速度快著称。

以上便是FAST特征检测的过程,清晰明了,而对于角点的定义也是做到了返璞归真,大师就是大师,还原本质的能力很强,估计以前这种简单想法被很多人忽略了。

实验

opencv代码

#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <cv.h>
#include <vector>using namespace cv;
using namespace std;int main()
{Mat frame=imread("lena.jpg", 1);double t = getTickCount();//当前滴答数std::vector<KeyPoint> keyPoints;FastFeatureDetector fast(50);   // 检测的阈值为50fast.detect(frame, keyPoints);drawKeypoints(frame, keyPoints, frame, Scalar(0,0,255), DrawMatchesFlags::DRAW_OVER_OUTIMG);t = ((double)getTickCount() - t)/getTickFrequency();cout<<"算法用时:"<<t<<"秒"<<endl;imshow("FAST特征点", frame);cvWaitKey(0);return 0;
}

输出结果:

MATLAB代码

再上一个自己编写的MATLAB代码,没有进行非极大值抑制,效果不及opencv,而且检测出的角点有一定的出入,应该是opencv内部做了一定的优化。

clear all;
close all;
%%
pic=imread('lena.jpg');
img=pic;
[M N D]=size(pic);
if D==3pic=rgb2gray(pic);
end
%%
mask=[0 0 1 1 1 0 0;...0 1 0 0 0 1 0;...1 0 0 0 0 0 1;...1 0 0 0 0 0 1;...1 0 0 0 0 0 1;...0 1 0 0 0 1 0;...0 0 1 1 1 0 0];
mask=uint8(mask);
threshold=50;
figure;imshow(img);title('FAST角点检测');hold on;
tic;
for i=4:M-3for j=4:N-3%若I1、I9与中心I0的差均小于阈值,则不是候选点delta1=abs(pic(i-3,j)-pic(i,j))>threshold;delta9=abs(pic(i+3,j)-pic(i,j))>threshold;delta5=abs(pic(i,j+3)-pic(i,j))>threshold;delta13=abs(pic(i,j-3)-pic(i,j))>threshold;if sum([delta1 delta9 delta5 delta13])>=3block=pic(i-3:i+3,j-3:j+3);block=block.*mask;%提取圆周16个点pos=find(block);block1=abs(block(pos)-pic(i,j))/threshold;block2=floor(block1);res=find(block2);if size(res,1)>=12plot(j,i,'ro');endendend
end
toc;
%%

输出结果:

参考文献

1、Machine learning for high-speed corner detection[J],2006.

2、Features From Accelerated Segment Test[J],2010.

3、基于自适应阈值的FAST特征点提取算法[J],2013

【特征检测】FAST特征点检测算法相关推荐

  1. FAST特征点检测算法

    一.FAST算法简介   如今,特征点检测的算法有很多,从最初的Moravec,到Harris,再到SIFT.SUSAN.GLOH.SURF算法,可以说特征点提取算法层出不穷.各种改进算法PCA-SI ...

  2. FAST角点检测算法(二)- 非极大值抑制筛选fast特征点

    FAST角点检测算法(二)- 非极大值抑制筛选fast特征点 author@jason_ql(lql0716) http://blog.csdn.net/lql0716 fast角点检测算法参考文章& ...

  3. OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算

    OpenCV学习笔记(四十六)--FAST特征点检测features2D 特征点检测和匹配是计算机视觉中一个很有用的技术.在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用.这一次先介绍特征点检 ...

  4. 特征点匹配——FAST特征点检测

    FAST算法是ECCV 2006上发表的Machine learning for high-speed corner detection上提出的,从论文名字中就可以看出,这是一种检测特征点的方法. 一 ...

  5. FAST特征点检测的matlab实现

    FAST特征点检测的matlab源码实现 1. 简介 2. FAST的原理介绍 2.1 特征点检测 2.2 极值点抑制 3. matlab源码实现 4. 结果展示 1. 简介 Features Fro ...

  6. PFLD:简单、快速、超高精度人脸特征点检测算法

    作者 | 周强(CV君) 来源 | 我爱计算机视觉(公众号id:aicvml) 60s测试:你是否适合转型人工智能? https://edu.csdn.net/topic/ai30?utm_sourc ...

  7. FAST角点检测算法

    FAST是一种角点检测算法,其思想源于corner的定义,也就是检测候选点周围像素点的像素值,如果候选点周围邻域内有足够多的像素点与该候选点的灰度值差别够大,则认为该候选点为一个特征点. FAST检测 ...

  8. OpenCV特征点检测算法对比

    识别算法概述: SIFT/SURF基于灰度图, 一.首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值点周围26个点进行NMS,从而得到粗略的特征点, ...

  9. 图像特征点检测算法汇总

    FAST Harris 概述:寻找图像中灰度沿任意方向变化都非常大的点,并将其转换为根据梯度矩阵M特征值进行判断. 参考: Harris角点检测原理详解_lwzkiller的专栏-CSDN博客_har ...

最新文章

  1. Flask之Cookie与Session
  2. Vue-Cli3.0怎么使用预渲染怎么配置prerender-spa-plugin
  3. “跟着菜鸟一起学R语言” 现已更名为“数据志”
  4. leetcode968. 监控二叉树
  5. 2018年江苏省计算机小高考,江苏2018年小高考成绩查询系统网站入口:江苏省教育考试院...
  6. 荣大速印机维修手册_荣大佳文一体机(速印机)故障及排除方法
  7. 【303】C# 复制窗体 修改名称
  8. Java 微服务框架选型(Dubbo 和 Spring Cloud?),大厂 HR 如何面试
  9. 1971旗舰cpu intel_Intel 酷睿i7 9700F搭配影驰GeForce RTX 2060大将
  10. 阿里技术专家玄惭回忆:我是如何自学技术拿到阿里offer
  11. document.addEventListener理解
  12. python可视化案例书籍推荐_我用python5年后,我发现学python编程必看的三本书!...
  13. python能做什么软件-python可以编写什么软件
  14. 文件和目录(一)--unix环境高级编程
  15. 量化金融笔记2-期货量化基础
  16. 使用NDWI提取水体详细流程
  17. 计算机专业英语09章在线测,審计学第09章在线测试.doc
  18. JavaWeb-Servlet生命周期
  19. c 打开静态html文件,静态网页可以直接被浏览器解析显示,下面
  20. monkey自定义脚本

热门文章

  1. 计算机应用论文做游戏,计算机游戏探究论文(2)
  2. 在HiFive1开发板上运行RT-Thread
  3. 第一次链接出租房的宽带弹出上网公告
  4. 手机号区分运营商 php
  5. 攻防世界_Crypto_告诉你个秘密
  6. centos7使用yum安装mysql5.7(官网标准安装方式)
  7. Unity3D 大型游戏 最后一站 源码部分重点 对象池GameObejctPool(4)
  8. Java jar 命令行运行程序如何引用第三方依赖包
  9. Java Ide配置tomcat和maven
  10. Matlab——线图包络线