OpenCV2学习笔记(十一):特征点检测之FAST算法

在上一节中,记录了Harris算子检测图像特征点的定义和基于OpenCV的实现方法,它基于两个正交方向上的强度变化率。本节记录另一种特征点检测算子FAST(Features from Accelerated Segment Test),它依赖少数像素的比较来确定是否接受一个特征点,其检测效率要好于Harris。

与Harris算法相同,FAST特征算法需要定义什么是特征点。这次的定义基于假定特征点周围的图像强度,通过检查候选像素的周围一圈像素来决定是否接受这一个特征点。与中心点差异较大的像素如果组成连续的圆弧,并且弧长大于圆周长的3/4,则可判断为特征点。

在此基础上,算法还使用了额外的技巧进行加速。首先测试一个圆圈上被90度分隔的四个点(如顶部、底部,左侧和右侧四个点),如果要满足FAST的定义条件,四个点中至少要有三个点必须同时大于或小于中心像素。如果条件不成立,则该点可以直接被移除而不需要进一步的验证。在实践中,大部分的像素点可以通过这个测试进行移除,因此该算法非常高效。

和Harris方法相同的是,可以在找到的角点上执行非极大值抑制,因此需要指定角点强度的测量方法。

这里可以使用OpenCV 2的通用接口来创建任意的特征检测器,比如FAST检测器的使用方法如下:

    // 创建特征点的向量
    std::vector<cv::KeyPoint>keypoints;
    // 构造FAST特征检测器
    cv::FastFeatureDetector fast(75);
    // 进行检测
    fast.detect(image, keypoints);

同时,为了方便标记特征点,OpenCV提供了通用的特征点绘制函数cv::drawKeypoints,其调用方法如下:

    // 通用的特征点绘制函数
    cv::drawKeypoints(image, // 输入图像
                      keypoints, // 特征点向量
                      image, // 输出图像
                      cv::Scalar(255,255,255), // 特征点颜色
                      cv::DrawMatchesFlags::DRAW_OVER_OUTIMG); // 绘制标记

通过指定选中的绘制标记,可以看到输出图像中特征点均得到了绘制:

完整的实现代码如下,只需修改main函数:

#include <QCoreApplication>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d/features2d.hpp>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 输入图像
    cv::Mat image = cv::imread("c:/031.jpg", 0);
    cv::namedWindow("Original Image");
    cv::imshow("Original Image", image);
    // 特征点的向量
    std::vector<cv::KeyPoint>keypoints;
    // 构造FAST特征检测器
    cv::FastFeatureDetector fast(75);
    // 进行检测
    fast.detect(image, keypoints);

    // 通用的特征点绘制函数
    cv::drawKeypoints(image, // 输入图像
                      keypoints, // 特征点向量
                      image, // 输出图像
                      cv::Scalar(255, 255, 255), // 特征点颜色
                      cv::DrawMatchesFlags::DRAW_OVER_OUTIMG); // 绘制标记

    cv::namedWindow("Fast Feature");
    cv::imshow("Fast Feature", image);

    return a.exec();
}

FAST算法可以获得非常快速的特征点检测,在需要考虑运行速度的时候可以选用,比如在高帧率的视频序列中进行视觉跟踪。

关于FAST特征算法的详细描述,可参考以下论文:

The article by E.Rosten, T.Drummond, Machine Learning for High-speed Corner Detection, In European Conference on Computer Vision, pp.430-443, 2006

时间: 2024-08-07 21:16:37

OpenCV2学习笔记(十一):特征点检测之FAST算法的相关文章

第十七篇:实例分析(4)--初探WDDM驱动学习笔记(十一)

感觉有必要把 KMDDOD_INITIALIZATION_DATA 中的这些函数指针的意思解释一下, 以便进一步的深入代码. DxgkDdiAddDevice 前面已经说过, 这个函数的主要内容是,将BASIC_DISPLAY_DRIVER实例指针存在context中, 以便后期使用, 支持多实例. DxgkDdiStartDevice 取得设备信息, 往注册表中加入内容, 从POST设备中获取FRAME BUFFER以及相关信息(DxgkCbAcquirePostDisplayOwnershi

Linux System Programming 学习笔记(十一) 时间

1. 内核提供三种不同的方式来记录时间: Wall time (or real time):actual time and date in the real world Process time:the time that a process spends executing on a processor 包括用户时间user time 和 系统时间system time Monotonic time:use the system's uptime (time since boot) for t

《Hibernate学习笔记十一》:树状结构设计

<Hibernate学习笔记十一>:树状结构设计 这是马士兵老师讲解Hibernate的一个作业题,树状结构设计,这是一个比较典型的例子,因此有必要写篇博文记录下. 树状结构的设计,它是在同一个类中使用了多对一(ManyToOne)和一对多(OneToMany). 在完成这个题目我们应该按照如下的步骤进行: 1.先思考数据库的模型应该是什么样的?? 数据库中的模型应该如下:即存在id p_id 2.思考面向对象的模型,及如何来进行映射??? 根据数据库中表的特点,对象应该有id name;由于

初探swift语言的学习笔记十一(performSelector)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/35842441 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! 在OC中使用好好的performSelector,但不知为什么在swift有意的被拿掉了.更有甚者连IMP, objc_msgSend也不能用了.虽然想不通为什么,但应该有他的道理.就不纠结了. 大家可能在OC中使用得更多的就是延时处理,及后台处

OpenCV2学习笔记:图像的读取与显示

1. 图像读取:imread() Mat imread(const string& ?lename, int ?ags=1 ) 参数介绍: filename: 待加载的文件名称. flags: 此标志用来指定被加载图像的颜色类型(color type).这个标志的取值可以有: -- CV_LOAD_IMAGE_ANYDEPTH : 如果设置这个标志的话,如果图像为16位或32位深度的图像,则返回对应深度的图像:否则,将图像转换为8位深度图像再返回. -- CV_LOAD_IMAGE_COLOR

OpenCV2学习笔记(十):特征点检测之Harris法

在计算机视觉中,特征点的概念被大量用于解决物体识别.图像匹配.视觉跟踪.三维重建等问题,比如图像中物体的角点,它们是在图像中可被轻易而精确地定位的二维特征.顾名思义,特征点检测的思想是无需观察整幅图像,而是通过选择某些特殊点,然后对它们执行局部分析.如果能检测到足够多的这种点,同时它们的区分度很高,并且可以精确定位稳定的特征,那么这个方法就很有效.这里主要使用Harris特征检测器检测图像角点.使用的开发平台为Qt5.3.2+OpenCV2.4.9. Harris角点的理论部分可见这篇blog:

OpenCV2学习笔记(二十二):ORB特征提取

ORB(ORiented Brief)特征提取算法,其前身Brief,是由EPFL的Calonder在ECCV2010上提出了一种可以快速计算且表达方式为二进制编码的描述子,主要思路就是在特征点附近随机选取若干点对,将这些点对的灰度值的大小,组合成一个二进制串,并将这个二进制串作为该特征点的特征描述子.BRIEF最大的优点在于速度快,然而其缺点也相当明显,主要有以下几方面: 不具有旋转不变性: 不具有尺度不变性: 对抗噪声性能差. ORB就是试图解决上述缺点中的1和3,即具有旋转不变性的同时具有

OpenCV2学习笔记(十三):利用SURF匹配不同图像的特征点

SURF算法是著名的尺度不变特征检测器SIFT(Scale-Invariant Features Transform)的高效变种,它为每个检测到的特征定义了位置和尺度,其中尺度的值可用于定义围绕特征点的窗口大小,使得每个特征点都与众不同.这里便是使用SURF算法提取两幅图像中的特征点描述子,并调用OpenCV中的函数进行匹配,最后输出一个可视化的结果,开发平台为Qt5.3.2+OpenCV2.4.9.以下给出图像匹配的实现步骤: 一.输入两幅图像,使用OpenCV中的cv::FeatureDet

OpenCV2学习笔记(八):使用霍夫变换检测直线和圆

在研究一幅图像时,常常会遇到一些平面或线性问题,直线在图像中频繁可见.这些富有意义的特征在物体识别等图像处理过程中扮演着重要的角色.本节主要记录一种经典的检测直线算法--霍夫变换(Hough Transform),用Hough变换检测图像中的直线和圆,开发平台为Qt5.3.2+OpenCV2.4.9. 一:Hough变换检测图像的直线 1.基础Hough变换 在霍夫变换中,直线用以下方程表示: 其中,参数表示一条直线到图像原点(左上角)的距离, 表示与直线垂直的角度.如下图所示,直线1的垂直线的