欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

FAST特征点检测算法

程序员文章站 2022-06-11 15:42:47
...

一、FAST算法简介
  如今,特征点检测的算法有很多,从最初的Moravec,到Harris,再到SIFT、SUSAN、GLOH、SURF算法,可以说特征点提取算法层出不穷。各种改进算法PCA-SIFT、ICA-SIFT、P-ASURF、R-ASURF、Radon-SIFT等也是搞得如火如荼。其中上面的算法如SIFT、SURF提取到的特征效果非常好(有较强的不变性),但是时间消耗依然很大,而在一个系统中,特征提取仅仅是一部分,还需要进行诸如配准、提纯、融合等后续算法。这使得系统的实时性变差,降系了系统性能。所以FAST算法的提出就是为了解决系统检测的实时性问题。
  2006年,Edward Rosten和Tom Drummond在《Machine learning for high-speed corner detection》中提出了一种FAST特征点检测算法,并在2010年稍作修改后发表了《Features From Accelerated Segment Test》,简称FAST算法。需要强调的是FAST算法只是一种特征点检测算法,并不涉及特征点的特征描述。具体的特征点描述可以通过其它算法来实现。

二、FAST算法主要内容
1、FAST特征角点
  在理解具体算法之前先了解FAST特征角点的概念,如果某点的像素与其周围邻域内足够多的其它点的像素相差较大,则该点可能是角点。
2、FAST算法实现的具体步骤如下:
  (1)在图像中任选一点p, 假定其像素(亮度)值为 Ip
  (2)以p点为中心,以3为半径画圆,圆上有16个像素,如下图所示:

FAST特征点检测算法

  (3)定义一个阈值。计算p1、p9与中心p的像素差,若它们绝对值都小于阈值,则p点不可能是特征点,直接丢弃;否则,当做候选点,进行下一步判断;
  (4)若p是候选点,则计算p1、p5、p9、p13与中心p的像素差,若它们的绝对值有至少3个超过阈值,则当做候选点,进行下一步判断;否则,直接丢弃;
  (5)若p是候选点,则计算p1到p16这16个点与中心p的像素差,若它们有至少9个超过阈值,则是特征点;否则,直接丢弃。
  (6)对图像进行非极大值抑制:判断以特征点p为中心的一个邻域(如3x3或5x5)内是否有多个特征点,如果有多个特征点,则分别计算各个特征点的FAST得分值(即s值,为16个点与中心差值的绝对值总和),如果p是领域所有特征点中s值最大的,则保留这个特征点,否则丢弃掉。如果领域内只有一个特征点,则将这个特征点进行保留,不参与别的计算。其中上面用到的得分计算公式如下(公式中用V表示得分,t表示阈值):

FAST特征点检测算法

  由上可以看出,FAST算法实现起来简单,这也就是它为什么这么快速的原因,它也因为其速度快而著称。

三、利用OpenCV实现的FAST实例
1、代码

#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("1.jpg"); //读取图片
    std::vector<KeyPoint> keypoints;
    FAST(img, keypoints, 10); //调用FAST算法,10为阈值
    //-- Draw keypoints 
    Mat img_keypoints;
    drawKeypoints(img, keypoints, img_keypoints, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
    //-- Show detected (drawn) keypoints 
    imshow("Keypoints", img_keypoints);

    waitKey(0);
    return 0;
}

2、运行结果
  (1)原图

FAST特征点检测算法

  (2)FAST特征点检测

FAST特征点检测算法

四、总结
  FAST算法比其他已知的角点检测算法要快很多倍,但是当图片中的噪点较多时,它的健壮性并不好,而且算法的效果还依赖于一个阈值tt。而且FAST不产生多尺度特征而且FAST特征点没有方向信息,这样就会失去旋转不变性。