一:Fast特征定义什么是角点:
这次的定义基于假定特征点周围的图像强度,通过检查候选像素周围一圈像素来决定是否接受一个特征点。与中心点差异较大的像素如果组成连续的圆弧,并且弧长大于原周长的3/4,那么我们认为找到了一个特征点。
二:加速技巧
首先测试圆上被90度分割的四个点(顶部,底部,左侧及右侧),那么为了满足上述条件,四个点中至少三个点必须大于或者小于中心像素。如果不成立,那么该点可以被直接移除而不需要检查额外圆周上的点。在实践中,大部分的像素点可以通过该测试进行移除,因此非常有效。
三:半径参数
测试中圆的半径是一个参数,实践中发现,半径为3可以兼顾结果和效率。
四:算法适用
该算法可以获得非常快的特征点检测,在需要考虑进行速度时可以选用,如在高帧率的视频序列中进行视觉跟踪。
Code:
#include <iostream>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\features2d\features2d.hpp> // 特征点检测类都封装在features2d这个模块中
#include <opencv2\imgproc\imgproc.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat image = imread("F:\\lena.png", 1);
if(!image.data)
{
cout << "Fail to load image" << endl;
return 0;
}
vector<KeyPoint> keypoints;
FastFeatureDetector fast(20); // 20 为阀值
fast.detect(image,keypoints);
drawKeypoints(image, keypoints, image, Scalar::all(-1), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); // opencv2 提供的一个特征点绘制函数 ---- keypoints
namedWindow("fast");
imshow("fast", image);
waitKey(0);
return 0;
}
Result:
参考blog:
http://blog.youkuaiyun.com/yangtrees/article/details/7530354
作者:小村长 出处:http://blog.youkuaiyun.com/lu597203933 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:小村长zack, 欢迎交流!)