FAST是一种角点检测算法,其思想源于corner的定义,也就是检测候选点周围像素点的像素值,如果候选点周围邻域内有足够多的像素点与该候选点的灰度值差别够大,则认为该候选点为一个特征点。
FAST检测角点的过程:
1. 初步筛选,如下图所示,将像素点P1、P5、P9、P13的像素值与中心像素点P的像素值进行比较, 如果至少有三个像素点的像素值都大于Ip + t,或者都小于Ip – t,则像素点P可能是角点,并在步骤2中进一步判断,否则像素点P不是角点。
2.进一步判断,将像素点P周围的16个像素点的像素值与像素点P的像素值进行比较, 如果有连续12个像素点的像素值都大于Ip +t,或者都小于Ip – t,则像素点P是角点。
3. 非极大抑制,首先计算角点的FAST得分(记为V),也就是上一步中12个连续像素点的像素值与该点像素值的差值的绝对值之和,按如下公式计算;然后,对于相邻的两个角点,比较它们的FAST得分,保留得分较大的角点。


分析与总结:
该角点检测算法的速度比较快,但是也存在一些缺点:
1. 检测效果依赖于阈值t
2. 当图像中存在噪声点时,检测效果不理想
3. 不产生多尺度特征,所以不具有尺度不变性
4. 特征点没有方向性,这样会失去旋转不变性
代码实现:(opencv3.0)
#include
#include
#include
#include
using namespace cv; void main() { Mat image; image = imread("dog.png"); // vector of keyPoints std::vector
keyPoints; // construction of the fast feature detector object Ptr
fast; fast = cv::FastFeatureDetector::create(40); // 检测的阈值为40 // feature point detection fast->detect(image, keyPoints); drawKeypoints(image, keyPoints, image, cvScalar(0, 225,0), DrawMatchesFlags::DRAW_OVER_OUTIMG); imshow("FAST feature", image); cvWaitKey(0); }
相关的论文:
Real-time Video Annotations for Augmented Reality
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176322.html原文链接:https://javaforall.net
