OpenCV中feature2D学习——FAST特征点检测

在前面的文章《OpenCV中feature2D学习——SURF和SIFT算子实现特征点检测》中讲了利用SIFT和SURF算子进行特征点检测,这里尝试使用FAST算子来进行特征点检测。

FAST的全名是:Features from Accelerated Segment Test,主要特点值计算速度快,比已知的其他特征点检测算法要快很多倍,可用于计算机视觉应用的实时场景。目前以其高计算效率(computational performance)、高可重复性(highrepeatability)成为计算机视觉领域最流行的特征点检测方法。其缺点在于当图片中的噪点较多时,FAST算子的健壮性不好且算法的效果还依赖于一个阈值threshold,此外FAST算子不产生多尺度特征而且没有方向信息,这样就会失去旋转不变性。

FAST特征点检测的详细原理和过程可以参考:FAST特征点检测图像处理特征不变算子系列之FAST算子(四)。相关论文:

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

[2] Edward Rosten, Reid Porter, and TomDrummond, “Faster and better: a machine learning approach to corner detection”in IEEE Trans. Pattern Analysis and Machine Intelligence, 2010, vol 32, pp.105-119.

I、采用FAST函数进行特征检测

OpenCV中的FAST/FASTX函数用于FAST特征点检测。函数原型如下:

C++: void FAST(InputArray image, vector<KeyPoint>& keypoints, int threshold, bool nonmaxSuppression=true)
C++: void FASTX(InputArray image, vector<KeyPoint>& keypoints, int threshold, bool nonmaxSuppression, int type)

参数:

·image – 输入灰度图像。

·keypoints – 检测到的特征点。

·threshold – 中心像素的像素值和该像素周围的像素值之差的阈值。

·nonmaxSuppression – 是否对特征点采用极大值抑制。

·type – 像素邻域圆的三种类型:FastFeatureDetector::TYPE_9_16,FastFeatureDetector::TYPE_7_12, FastFeatureDetector::TYPE_5_8。

函数基本使用例子如下:

/**
* @概述: 使用FAST进行特征点检测
* @类和函数: FAST函数,FastFeatureDetector类
* @author: holybin
*/
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat img = imread("box_in_scene.png");

	vector<KeyPoint> keypoints;
	FAST(img, keypoints, 20); 

	//-- 绘制特征点
	Mat img_keypoints;
	drawKeypoints(img, keypoints, img_keypoints, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
	//-- 显示特征点
	imshow("Keypoints", img_keypoints);
	imwrite("fast_detection_result.png", img_keypoints);

	waitKey(0);
	return 0;
}

运行结果如图:

II、使用FastFeatureDetector进行FAST特征点检测

FastFeatureDetector继承自2D图像特征检测的虚基类FeatureDetector,专用于FAST特征检测,类似的还有如下类:

FastFeatureDetector的类定义如下:

class FastFeatureDetector : public FeatureDetector
{
public:
FastFeatureDetector( int threshold=1, bool nonmaxSuppression=true, type=FastFeatureDetector::TYPE_9_16 );
//可以看出FastFeatureDetector的构造函数默认的阈值为1,进行非极大值抑制,以及圆周像素为16个。
    virtual void read( const FileNode& fn );
virtual void write( FileStorage& fs ) const;
	//注意detect函数是定义于虚基类FeatureDetector中的。
protected:
    ...
};

FastFeatureDetector类的具体使用例子如下:

/**
* @概述: 使用FAST进行特征点检测
* @类和函数: FAST函数,FastFeatureDetector类
* @author: holybin
*/
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat img = imread("box_in_scene.png");

	vector<KeyPoint> keypoints;
	FastFeatureDetector fast(20);
	fast.detect(img,keypoints);

	//-- 绘制特征点
	Mat img_keypoints;
	drawKeypoints(img, keypoints, img_keypoints, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
	//-- 显示特征点
	imshow("Keypoints", img_keypoints);
	imwrite("fast_detection_result.png", img_keypoints);

	waitKey(0);
	return 0;
}

运行结果如图:

这里注意到两种方法出来的效果不同,究其原因,在使用detect函数进行特征点检测时,实际调用的是FeatureDetector的各个派生类(这里是FastFeatureDetector类)中的detectImpl函数,参考detect函数源代码(位置 \OpenCV2.4.0\modules\features2d\src\detectors.cpp):

void FeatureDetector::detect( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask ) const
{
    keypoints.clear();

    if( image.empty() )
        return;

    CV_Assert( mask.empty() || (mask.type() == CV_8UC1 && mask.size() == image.size()) );

    detectImpl( image, keypoints, mask );//实际调用派生类的该函数
}

而派生类FastFeatureDetector中的detectImpl函数的源代码如下(位置 \OpenCV2.4.0\modules\features2d\src\fast.cpp):

void FastFeatureDetector::detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask ) const
{
    Mat grayImage = image;
    if( image.type() != CV_8U ) cvtColor( image, grayImage, CV_BGR2GRAY );
    FAST( grayImage, keypoints, threshold, nonmaxSuppression );//调用FAST函数
    KeyPointsFilter::runByPixelsMask( keypoints, mask );
}

可以看到detectImpl函数调用了FAST函数来做特征点检测,而随后调用了runByPixelsMask函数来进行一些别的处理,因为所有的传入参数都是一致的,可以断定就是这些操作使得最后的检测结果不一样。但是具体操作我还不清楚,如果有大神知道望赐教。

时间: 2024-10-10 20:40:43

OpenCV中feature2D学习——FAST特征点检测的相关文章

OpenCV中feature2D学习——FAST特征点检测与SIFT/SURF/BRIEF特征提取与匹配

在前面的文章<OpenCV中feature2D学习--FAST特征点检测>中讲了利用FAST算子进行特征点检测,这里尝试使用FAST算子来进行特征点检测,并结合SIFT/SURF/BRIEF算子进行特征点提取和匹配. I.结合SIFT算子进行特征点提取和匹配 由于数据类型的不同,SIFT和SURF算子只能采用FlannBasedMatcher或者BruteForceMatcher来进行匹配(参考OpenCV中feature2D学习--BFMatcher和FlannBasedMatcher).

OpenCV中feature2D学习——亚像素级角点检测(cornerSubPix)

概述 除了利用Harris进行角点检测和利用Shi-Tomasi方法进行角点检测外,还可以使用cornerEigenValsAndVecs()函数和cornerMinEigenVal()函数自定义角点检测函数.如果对角点的精度有更高的要求,可以用cornerSubPix()函数将角点定位到子像素,从而取得亚像素级别的角点检测效果. cornerSubPix()函数 (1)函数原型 cornerSubPix()函数在角点检测中精确化角点位置,其函数原型如下: C++: void cornerSub

利用opencv中的级联分类器进行人脸检测-opencv学习(1)

OpenCV支持的目标检测的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification).注意,新版本的C++接口除了Haar特征以外也可以使用LBP特征. 先介绍一下相关的结构,级联分类器的计算特征值的基础类FeatureEvaluator,功能包括读操作read.复制clone.获得特征类型getFeatureType,分配图片分配窗口的操作setImage.setWindow,计算有序特征calcOrd,计算绝对特征calcC

OpenCV2马拉松第26圈——FAST特征点检测

计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/28424579 关于角点检测,我写过两篇文章 openCV2马拉松第19圈--Harris角点检测(自己实现) OpenCV2马拉松第21圈--形态学操作实现角点检测 有兴趣的童鞋可以去看看--- 收入囊中 FAST角点检测原理 使用OpenCV  FAST API检测角点 葵花宝典 对于一个角点来说,应该与周围的大多数像素点有很大的差别 如上图,

OpenCV入门教程之九 特征点检测与图像匹配

特征点又称兴趣点.关键点,它是在图像中突出且具有代表意义的一些点,通过这些点我们可以用来识别图像.进行图像配准.进行3D重建等.本文主要介绍OpenCV中几种定位与表示关键点的函数. 一.Harris角点 角点是图像中最基本的一种关键点,它是由图像中一些几何结构的关节点构成,很多都是线条之间产生的交点.Harris角点是一类比较经典的角点类型,它的基本原理是计算图像中每点与周围点变化率的平均值.  (1)  (2) 其中I(x+u,y+u)代表了点(x,y)邻域点的灰度值.通过变换可以将上式变化

Fast特征点检测

Features From Accelerated Segment Test 1. FAST算法原理 博客中已经介绍了很多图像特征检测算子,我们可以用LoG或者DoG检测图像中的Blobs(斑点检测),可以根据图像局部的自相关函数来求得Harris角点(Harris角点),后面又提到了两种十分优秀的特征点及它们的描述方法SIFT特征与SURF特征.SURF特征算是为了提高运算效率对SIFT特征的一种近似,虽然在有些实验环境中已经达到了实时,但是我们实践工程应用中,特征点的提取与匹配只是整个应用算

[OpenCV-Python] OpenCV 中计算摄影学 部分 IX 对象检测 部分 X

部分 IX计算摄影学 49 图像去噪目标 ? 学习使用非局部平均值去噪算法去除图像中的噪音 ? 学习函数 cv2.fastNlMeansDenoising(),cv2.fastNlMeansDenoisingColored()等原理 在前面的章节中我们已经学习了很多图像平滑技术,比如高斯平滑,中值平滑等,当噪声比较小时这些技术的效果都是很好的.在这些技术中我们选取像素周围一个小的邻域然后用高斯平均值或者中值平均值取代中心像素.简单来说,像素级别的噪声去除是限制在局部邻域的.噪声有一个性质.我们认

OpenCV中CascadeClassifier类实现多尺度检测源码解析

级联分类器检测类CascadeClassifier,在2.4.5版本中使用Adaboost的方法+LBP.HOG.HAAR进行目标检测,加载的是使用traincascade进行训练的分类器 class CV_EXPORTS_W CascadeClassifier { public: CV_WRAP CascadeClassifier(); // 无参数构造函数,new自动调用该函数分配初试内存 CV_WRAP CascadeClassifier( const string& filename )

[OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (二)

部分 V图像特征提取与描述 34 角点检测的 FAST 算法 目标 ? 理解 FAST 算法的基础 ? 使用 OpenCV 中的 FAST 算法相关函数进行角点检测原理 我们前面学习了几个特征检测器,它们大多数效果都很好.但是从实时处理的角度来看,这些算法都不够快.一个最好例子就是 SLAM(同步定位与地图构建),移动机器人,它们的计算资源非常有限.为了解决这个问题,Edward_Rosten 和 Tom_Drummond 在 2006 年提出里 FAST 算法.我们下面将会对此算法进行一个简单