FAST特征点检测算法由E.Rosten和T.Drummond在2006年在其论文“Machine Learning for High-speed Corner Detection”中首次提出。英文全称是“Features from  Accelerated Segment Test”,可以翻译成“基于加速分割测试的特征”。从论文名字可以看出FAST是一种高效的特征点(角点)检测算法,基本上可以满足实时检测系统要求,是计算机视觉领域最主流的角点检测算法之一。虽然FAST特征检测速度很快,但首字母刚好拼成fast,实在是一个美丽的巧合。

FAST算子

FAST算子的基本原理是:若某像素点与其周围领域内足够多的连续的像素点存在某一属性差异,并且该差异大于指定阈值,则可以断定该像素点与其邻域像素有可被识别的不同之处,可以作为一个特征点(角点);对于灰度图像,FAST算子考察的属性是像素与其邻域的灰度差异。

这个检查过程可以用下图更清楚的描述:对于图像上所有像素点,考察其7*7邻域内以该点为圆心,半径是3的圆周上的共计16个像素点和中心点的差异。如果有连续的12(或9)个像素点与中心点的灰度差的绝对值大于某一给定阈值,则该点被检测为FAST特征点。

为了提高检测速度,FAST提出分割测试的概念,不是逐个遍历考察圆周上的16个像素点,而是先考察垂直和水平方向上的4个点,对上图来说就是第2、10、6、14点。基于FAST算子要求圆周上最少有12(或9)个连续的差异较大的点,如果垂直和水平方向上4个点中有2个或2个以上不满足要求的点,则可以直接判断该点不是FAST特征点,这样可以排除绝大部分非FAST特征点。进过初步筛选,在对剩下的符合条件的点实施FAST算子进行特征点检测,最后进过非极大值抑制后得到最终的特征点检测结果。

FAST算子是通过邻域像素的比对来检测特征点,所以没有多尺度的问题。 并且FAST算子检测的不单单是“角点”这一个特征,还可以检测其他符合要求的特征点,如孤立的噪点等,健壮性不是很好。这就引入一个问题就是当图片中的噪点较多的时候,会产生较多误检的特征点。但基于其“fast”的特点,仍然是一些实时性要求较高场景的新宠。

Opencv中FAST特征检测类是在features2d.hpp中定义的,使用前要加上头文件“opencv2/features2d/features2d.hpp”

#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include <opencv2/features2d/features2d.hpp> using namespace cv; int main(int argc,char*argv[])
{
Mat image=imread(argv[1]);
vector<KeyPoint> keyPoints; //特征点向量
FastFeatureDetector fastDetecrtor(50); //设置检测阈值50
fastDetecrtor.detect(image,keyPoints); //FAST特征点检测
drawKeypoints(image,keyPoints,image,Scalar::all(-1)); //特征点绘制
imshow("Corner Detected",image);
waitKey();
return 0;
}

设置阈值为50时检测效果:

随着阈值越来越小,更多的角点被检测出来:

KeyPoint特征点类

保存特征点各种信息的KeyPoint类在使用中是不透明的,我们来看看KeyPoint类的主要属性:

class KeyPoint

{
Point2f  pt;  //特征点坐标
float  size; //特征点邻域直径
float  angle; //特征点的方向,值为0~360,负值表示不使用
float  response; //特征点的响应强度,代表了该点是特征点的程度,可以用于后续处理中特征点排序
int  octave; //特征点所在的图像金字塔的组
int  class_id; //用于聚类的id

}

主要包含的特征点信息有:位置、邻域直径、特征的方向、响应强度、多尺度信息和分类等。特征点匹配的实现就是通过逐个匹配特征点的这些信息。

drawKeypoints特征点绘制

opencv提供了一个快速绘制特征点的函数drawKeypoints,函数原型:

void drawKeypoints( const Mat& image, const vector<KeyPoint>& keypoints, CV_OUT Mat& outImage,
const Scalar& color=Scalar::all(-1), int flags=DrawMatchesFlags::DEFAULT );

第一个参数image:原始图像,可以使三通道或单通道图像;

第二个参数keypoints:特征点向量,向量内每一个元素是一个KeyPoint对象,包含了特征点的各种属性信息;

第三个参数outImage:特征点绘制的画布图像,可以是原图像;

第四个参数color:绘制的特征点的颜色信息,默认绘制的是随机彩色;

第五个参数flags:特征点的绘制模式,其实就是设置特征点的那些信息需要绘制,那些不需要绘制,有以下几种模式可选:

  DEFAULT:只绘制特征点的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标。

  DRAW_OVER_OUTIMG:函数不创建输出的图像,而是直接在输出图像变量空间绘制,要求本身输出图像变量就                                                     是一个初始化好了的,size与type都是已经初始化好的变量

  NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制

  DRAW_RICH_KEYPOINTS:绘制特征点的时候绘制的是一个个带有方向的圆,这种方法同时显示图像的坐                                                                  标,size,和方向,是最能显示特征的一种绘制方式。

FAST特征点检测&&KeyPoint类的更多相关文章

  1. FAST特征点检测

    Features From Accelerated Segment Test 1. FAST算法原理 博客中已经介绍了很多图像特征检测算子,我们可以用LoG或者DoG检测图像中的Blobs(斑点检测) ...

  2. FAST特征点检测算法

    一 原始方法 简介 在局部特征点检测快速发展的时候,人们对于特征的认识也越来越深入,近几年来许多学者提出了许许多多的特征检测算法及其改进算法,在众多的特征提取算法中,不乏涌现出佼佼者. 从最早期的Mo ...

  3. FAST特征点检测features2D

    #include <opencv2/core/core.hpp> #include <opencv2/features2d/features2d.hpp> #include & ...

  4. matlab练习程序(FAST特征点检测)

    算法思想:如果一个像素与它邻域的像素差别较大(过亮或过暗) , 那它更可能是角点. 算法步骤: 1.上图所示,一个以像素p为中心,半径为3的圆上,有16个像素点(p1.p2.....p16). 2.定 ...

  5. OPENCV图像特征点检测与FAST检测算法

    前面描述角点检测的时候说到,角点其实也是一种图像特征点,对于一张图像来说,特征点分为三种形式包括边缘,焦点和斑点,在OPENCV中,加上角点检测,总共提供了以下的图像特征点检测方法 FAST SURF ...

  6. ORB特征点检测

    Oriented FAST and Rotated BRIEF www.cnblogs.com/ronny   这篇文章我们将介绍一种新的具有局部不变性的特征 -- ORB特征,从它的名字中可以看出它 ...

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

    1.FAST(featuresfrom accelerated segment test)算法 http://blog.csdn.net/yang_xian521/article/details/74 ...

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

    转载地址:https://blog.csdn.net/maweifei/article/details/62887831 (一)ORB特征点提取算法的简介 Oriented FAST and Rota ...

  9. 第十四节、FAST角点检测(附源码)

    在前面我们已经陆续介绍了许多特征检测算子,我们可以根据图像局部的自相关函数求得Harris角点,后面又提到了两种十分优秀的特征点以及他们的描述方法SIFT特征和SURF特征.SURF特征是为了提高运算 ...

随机推荐

  1. jquery的图片轮播 模板类型

    先说一下用到的几个重要的事件 j jQuery on()方法是官方推荐的绑定事件的一个方法. $(selector).on(event,childSelector,data,function,map) ...

  2. Linux在应用层读写寄存器的方法。。。

    参考链接:http://blog.csdn.net/liukang325/article/details/26601811 /dev/mem:物理内存的全镜像.可以用来访问物理内存.由于应用运行都在用 ...

  3. BZOJ2160: 拉拉队排练(Manacher)

    Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训 ...

  4. 2018/8/15 qbxt 测试

    2018/8/15 qbxt 测试 期望得分:100:实际得分:50   不知道为什么写挂了,明明是个水题 T^T 思路:模拟 注意:如果用 char 类型存储的话,如果有'z' + 9 会爆char ...

  5. WPF 入门《数据绑定》

    简单而言, 数据绑定是一种关系, 这种关系告诉WPF 从一个源目标对象中提取一些信息, 并且使用该信息设置为目标对象的属性.目标属性总是依赖项属性, 并且通常位于WPF元素中. 然而, 源对象可以是任 ...

  6. 【Python】用Python的“结巴”模块进行分词

    之前都是用计算所的分词工具进行分词,效果不错可是比較麻烦,近期開始用Python的"结巴"模块进行分词,感觉很方便.这里将我写的一些小程序分享给大家,希望对大家有所帮助. 以下这个 ...

  7. HDU 5389 Zero Escape (MUT#8 dp优化)

    [题目链接]:pid=5389">click here~~ [题目大意]: 题意: 给出n个人的id,有两个门,每一个门有一个标号,我们记作a和b,如今我们要将n个人分成两组,进入两个 ...

  8. get_browser()用法

    get_browser()用法 get_browser()函数是用来分析USER_AGENT的,它的执行方法是自动获取客户端的USER_AGENT,然后调用browscap.ini库进行分析得到结果 ...

  9. ProgressBar-style属性分析

    首先我们看下framework下关于进度条的style定义,如下 <style name="Widget.ProgressBar"> <item name=&qu ...

  10. Linux体系结构

    linux内核结构: system call interface (SCI层) 为用户空间提供了一套标准的系统调用函数来访问linux内核. process management (PM层) 进程管理 ...