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

一、原始检测方法

具体内容如下:
判别特征点pp是否是一个特征点,可以通过判断以该点为中心画圆,该圆过16个像素点。设在圆周上的16个像素点中是否最少有nn个连续的像素点满足都比Ip+tI_p+t大,或者都比Ip−tI_p-t小。(这里IpI_p指的点pp的灰度值,tt是一个阈值)如果满足这样的要求,则判断pp是一个特征点,否则pp不是。在原论文中nn的值一般设为12。
如下图所示:

由于在检测特征点时是需要对图像中所有的像素点进行检测,然而图像中的绝大多数点都不是特征点,如果对每个像素点都进行上述的检测过程,那显然会浪费许多时间,因此论文中采用了一种进行非特征点判别的方法。如上图中,对于每个点都检测第1、5、9、13号像素点,如果这4个点中至少有3个满足都比Ip+tI_p+t大或者都比Ip−tI_p-t小,则继续对该点进行16个邻域像素点都检测的方法,否则则判定该点是非特征点,直接剔除即可。
这种做法在大幅减少了判断特征点的运算量,提升了算法的运行速度。但是还是存在一些问题,如下:
(1)当我们使用的n<12n时就不能通过上面说明的方法对非角点进行快速过滤;
(2)这样检测出来的特征点不是最优的,因为这种检测方法暗含了对特征周围的像素分布的假定;
(3)忽略了上述的前4个检测的结果分析;
(4)检测得到的特征点容易挤在一起。
针对以上问题作者提出了一种基于学习的特征点检测方法,这种检测方法解决了上面的前3个问题。

二、基于学习的特征点检测方法

这种基于学习的特征点检测方法分成两个阶段,如下所示:
阶段1:对你需要检测的场景的多张图像进行角点提取,在提取的过程中,使用你给定的nn和一个合适的阈值进行检测,同时这里不使用上面提出的先检测4个像素点的方法(因为你选择的nn可能小于12啊)。这样我们就提取到了许多的特征点,作为训练数据。
对于圆上的16像素点位置x∈{1,...,16}x \in \{1,...,16\},若选择一个位置xx对上面得到的特征点集进行划分,划分为3个部分,如下:

Sp→x=⎧⎩⎨⎪⎪d,s,b,Ip→x≤Ip−tIp−t<Ip→x<Ip+tIp+t≤Ip→x(darker)(similar)(brighter)

S_{p\rightarrow x} = \begin{cases} d, &I_{p\rightarrow x} \leq I_p-t&(darker)\\s, &I_p - t
另外,对每个特征点设一个boolbool变量KpK_p,用来表示是否为角点,Kp=trueK_p = true为角点。
阶段2:对上面得到的特征点集进行训练,使用ID3ID3算法建立一棵决策树,假设通过使用第xx个像素点进行决策树的划分,那么对集合PP得到的熵KK是

H(P)=(c+c¯)log2(c+c¯)−clog2c−c¯log2c¯

H(P) = (c+\overline{c})log_2(c+\overline{c}) - clog_2c - \overline{c}log_2\overline{c}其中cc为角点的数目,c¯\overline c为非角点的数目。
由此得到的信息增益为

H(P)−H(Pd)−H(Ps)−H(Pb)

H(P) - H(P_d) - H(P_s) - H(P_b)然后选择使信息增益最大位置进行分割,最终得到这棵决策树。以后再有类似的场景进行特征点检测时,则使用该决策树进行检测。

三、非最大值抑制

最后还有一个问题,如何解决特征点容易挤在一起的问题呢?
作者在这里提出了一种非最大值抑制的方法,给每个已经检测到的角点一个量化的值VV,然后比较相邻的角点的VV值,然后删除VV值较小的角点。
作者在论文中提出了几种不同的VV值的定义,最后主要是使用两种不同的定义:
(1)把角点的灰度与它邻近的16个点的灰度值的差值的绝对值的和作为VV的值;
(2)作者提出,为了计算速度的提升,在(1)的基础上更改为:

V=max⎛⎝∑x∈Sbright|Ip→x−Ip|−t,∑x∈Sdark|Ip−Ip→x|−t⎞⎠

V = max \left( \sum_{x\in S_{bright}}|I_{p \rightarrow x} - I_p| - t, \sum_{x\in S_{dark}}|I_p - I_{p \rightarrow x}| - t\right)在这里SbrightS_{bright}是16个邻域像素点中灰度值大于Ip+tI_p + t的像素点的集合,而SdarkS_{dark}表示的是那些灰度值小于Ip−tI_p - t的像素点。
至此,就是FAST特征点检测方法的算法整体过程,FAST算法在opencv中有实现。值得注意的是,在opencv中并没有对前面提到的基于学习的去检测特征点,原因也很简单,因为基于学习的检测方法学习的是对于某种场景下的特征点检测的学习,而opencv显然不是针对某个场景下的。
opencv调用FAST算法的例子如下:

#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\features2d\features2d.hpp>
#include <vector>using namespace std;
using namespace cv;int main()
{Mat img = imread("1.jpg");vector<KeyPoint> keypoints;    //KeyPoint是opencv中定义的特征点类FastFeatureDetector fast(40);  //定义FAST特征检测器,这里的40是算法中的阈值tfast.detect(img, keypoints);   //检测img图像,特征点存在keypoints中for (size_t i = 0; i < keypoints.size(); i++){circle(img, Point(keypoints[i].pt.x, keypoints[i].pt.y), 2, Scalar(0, 255, 0), 1);}imshow("1.jpg", img);waitKey(0);return 0;
}

这里需要注意,opencv中还有一个FAST函数,我开始用的这个,不过检测的结果不对,应该不是FAST函数的检测结果。上面的运行结果如下:

特征点匹配——FAST特征点检测相关推荐

  1. 图像拼接 之 特征点匹配

    图像拼接 之 特征点匹配 介绍 特征点对搜索 建立 K-D 树 搜索 K-D 树 特征点对的筛选 计算单应性矩阵 基于特征点对计算单应性矩阵 RANSAC 优化单应性矩阵 总结 参考资料 介绍 在人们 ...

  2. OpenCV之feature2d 模块. 2D特征框架(2)特征描述 使用FLANN进行特征点匹配 使用二维特征点(Features2D)和单映射(Homography)寻找已知物体 平面物体检测

    特征描述 目标 在本教程中,我们将涉及: 使用 DescriptorExtractor 接口来寻找关键点对应的特征向量. 特别地: 使用 SurfDescriptorExtractor 以及它的函数  ...

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

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

  4. 特征点检测和特征点匹配(ORB)

    前言 本文介绍了特征点检测的一些算法,然后基于OpenCV的ORB,实现了不同尺度和旋转的图像特征点匹配. 本文用到的代码存储在这里. 特征点是什么? 当我们人在对比两张图片时(例如上面的妙蛙种子), ...

  5. C++OpenCV矩形的角点检测与坐标提取,基于fast特征点

    目的:提取图片中某个矩形的四个角点的坐标 方法:采用非极大值抑制的fast特征点检测 流程: 图像滤波(可选) fast角点检测 自己设定矩形大致范围 输出矩形角点坐标 程序: 主函数文件 #incl ...

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

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

  7. 【特征检测】FAST特征点检测算法

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

  8. FAST特征点检测算法

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

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

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

最新文章

  1. Codeforces Beta Round #9 (Div. 2 Only) C. Hexadecimal's Numbers dfs
  2. 【童年回忆】【FC模拟器 + ROM大合集下载】
  3. 【PHP】安装 ssh2 模块
  4. 高维数据使用npy格式保存
  5. 【已解决】Navicat 远程连接 Linux服务器上的MySQL数据库
  6. php attr,PHP DOMAttr isId()用法及代码示例
  7. CPU you selected does not support x86-64 instruction set
  8. python import 问题
  9. Java并发编程(08):Executor线程池框架
  10. 服务器芯片组c621,三路千兆LAN:GIGABYTE 技嘉 发布 C621-SU8 服务器主板
  11. learn python the hard way 习题6~10总结
  12. layui 树状图默认全部展开_SolidWorks 钣金展开基础设定
  13. 设计模式(Design pattern—
  14. word转pdf公式乱码_word转pdf乱码
  15. 计算机内存地址对齐,深入理解内存对齐
  16. linux sed命令
  17. Android中一个有趣的crash的日志分析
  18. 跨时钟域处理所用到的同步器
  19. 入职两周,怀疑自己进了假百度!跟传说中完全不一样
  20. Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operat

热门文章

  1. ios 简书 获取通讯录信息_iOS9以后获取手机通讯录
  2. android qmui框架,腾讯QMUI Android框架使用(三)QMUIDialog
  3. 一个简单易用的容器管理平台-Humpback
  4. 飞讯管理员端的后端数据表格展现
  5. 服务号和订阅号链接验证方式(自己根据查看资料整理)
  6. 如何选择适合你的兴趣爱好(四十三),国际象棋
  7. zabbix安装监控客户端应用
  8. 在Windows下编译多种VS版本的Skia
  9. 个人和组织高绩效的秘籍:OKR工作法
  10. ffly-plus 又又又一个`gin` demo项目,带你快速上手用`gin`进行`web`开发!!!!