opencv3/C++ FAST特征检测

FAST( Features from Accelerated Segment Test)

FAST特征检测的特点是简单、快速、有效。作者为了在实时帧速率情况下进行高速特征检测,提出FAST特征检测。
相比SIFT、DoG、Harris、SUSAN等比较耗时的特征检测方法,FAST只利用周围的像素进行比较,速度大大加快。

FAST提出

大多数特征检测算法通过在图像上计算角点响应函数(C),然后检测超过阈值(并且是局部最大值)的像素。
如Harris特征使用的角点响应函数:
这里写图片描述
Shi-Tomasi特征使用的角点响应函数:
这里写图片描述
计算候选角点附近的一个窗口和多个方向上的一小段距离的窗口之间的平方和差(SSD)。 C是如此获得的最小的SSD,从而确保提取的角点是在变化最大的那些位置。 Harris在此基础上通过计算SSD的二阶导数关于移位的近似值来近似:
这里写图片描述

另一类角点探测器的工作原理是检查一小块图像,看它是否看起来像一个角点。 由于不计算二阶导数,因此不需要降噪步骤(例如高斯平滑)。 因此,这些角点检测器在计算上是有效的,因为对于检测到的每个角点只检查少量的像素。 因此,它们仅具有诸如模糊图像的大尺寸特征。FAST角点检测属于这一类。
如图,图像中突出显示的正方形是用于角点检测的像素。 p处的像素是候选角点的中心。圆弧(Bresenham圆 )由虚线表示,12个连续的像素,比p更亮,超过阈值。
这里写图片描述

使用FAST进行功能检测:

1、p在图像中选择一个被识别为兴趣点的像素。令它的强度为  IP   I P
2、选择一个合适的阈值Ť;
3、考虑被测像素周围的16个像素的圆圈。
4、如果这16个像素中存在一组ñ个连续的像素的像素值,比  Ip+t   I p + t 大,或比  Ipt   I p − t 小,则像素p是一个角点。ñ被设置为12。
5、使用一种快速测试(high-speed test)可快速排除了大量的非角点。这个方法只检测在1、9、5、13个四个位置的像素,(首先检测1、9位置的像素与阈值比是否太亮或太暗,如果是,则检查5、13)。如果p是一个角点,则至少有3个像素比  Ip+t   I p + t 大或比  Ipt   I p − t 暗。如果这两者都不是这样的话,那么p就不能成为一个角点。然后可以通过检查圆中的所有像素,将全部分段测试标准应用于通过的对候选的角点。这种探测器本身表现出很高的性能,但有一些缺点:
- 它不能拒绝n <12的候选角点。
- 检测到的角点不是最优的,因为它的效率取决于问题的排序和角点的分布。
- 角点分析的结果被扔掉了。
- 多个特征点容易挤到一起。
前三点是用机器学习方法解决的。最后一个是使用非极大值抑制来解决。

机器学习角点探测器

  • 选择一组用于训练的图像(最好来自目标应用区域)
  • 在每个图像中运行FAST算法以查找特征点。
  • 对于每个特征点,将其周围的16个像素存储为一个向量。获取所有图像的特征向量P。
  • 对于圆上的每个位置x∈{1..16},这16个相对于p的位置(由p→x表示)的像素有以下3种状态:
    这里写图片描述
  • 根据这些状态,特征向量P被细分为3个子集  PD...PSPB   P D , . . . P S , P B
  • 定义一个新的布尔变量  Kp   K p ,若p是一个角点,则为true,否则为false。
  • 使用ID3算法(决策树分类器)使用变量来查询每个子集,利用  Kp   K p 确认其真实类别。通过测量  Kp   K p 的熵,选择产生关于候选像素是否是一个角点的信息最多的x。
  • 递归地应用于所有的子集,直到它的熵为零。
  • 这样创建的决策树用于其他图像的快速检测。

非极大值抑制(Non-Maximal Suppression):
检测到邻近的多个特征点问题,通过使用非极大值抑制(Non-Maximal Suppression)来解决。

  • 计算所有检测到的特征点的得分函数(score function)V。Vd定义为p和16个周围像素之间的绝对偏差的总和。
  • 考虑两个相邻的特征点并计算它们的V值。
  • 丢弃V值较低的特征点。
OpenCV3中FAST的使用:

OpenCV3中FAST方法以FastFeatureDetector类的形式封装,为Feature2D类的子类。

class CV_EXPORTS_W FastFeatureDetector : public Feature2D
{
public:
    enum
    {
        TYPE_5_8 = 0, TYPE_7_12 = 1, TYPE_9_16 = 2,
        THRESHOLD = 10000, NONMAX_SUPPRESSION=10001, FAST_N=10002,
    };
    CV_WRAP static Ptr<FastFeatureDetector> create( 
int threshold=10,                                                    bool nonmaxSuppression=true,
int type=FastFeatureDetector::TYPE_9_16 );
    CV_WRAP virtual void setThreshold(int threshold) = 0;
    CV_WRAP virtual int getThreshold() const = 0;
    CV_WRAP virtual void setNonmaxSuppression(bool f) = 0;
    CV_WRAP virtual bool getNonmaxSuppression() const = 0;
    CV_WRAP virtual void setType(int type) = 0;
    CV_WRAP virtual int getType() const = 0;
};

FAST特征点检测示例:

#include "opencv2/opencv.hpp"
#include<opencv2/xfeatures2d.hpp>
using namespace cv;
using namespace cv::xfeatures2d;

int thre = 40;
Mat src;
void trackBar(int, void*);

int main(int argc, char** argv)
{
    src = imread("E:/image/image/house2.jpg"); 
    if (src.empty())
    {
        printf("can not load image \n");
        return -1;
    }
    namedWindow("input",WINDOW_AUTOSIZE);
    imshow("input", src);  

    namedWindow("output",WINDOW_AUTOSIZE);
    createTrackbar("threshould", "output", &thre,255, trackBar);
    cvWaitKey(0);  
    return 0;
}

void trackBar(int, void*)
{
    std::vector<KeyPoint> keypoints;
    Mat dst = src.clone();
    Ptr<FastFeatureDetector> detector = FastFeatureDetector::create(thre);
    detector->detect(src,keypoints);
    drawKeypoints(dst, keypoints, dst, Scalar::all(-1), DrawMatchesFlags::DRAW_OVER_OUTIMG);  
    imshow("output", dst);  
}

这里写图片描述
这里写图片描述

相关链接:

1、Machine learning for high-speed corner detection

2、OpenCV3:FAST Algorithm for Corner Detection

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值