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在图像中选择一个被识别为兴趣点的像素。令它的强度为;
2、选择一个合适的阈值Ť;
3、考虑被测像素周围的16个像素的圆圈。
4、如果这16个像素中存在一组ñ个连续的像素的像素值,比大,或比小,则像素p是一个角点。ñ被设置为12。
5、使用一种快速测试(high-speed test)可快速排除了大量的非角点。这个方法只检测在1、9、5、13个四个位置的像素,(首先检测1、9位置的像素与阈值比是否太亮或太暗,如果是,则检查5、13)。如果p是一个角点,则至少有3个像素比大或比暗。如果这两者都不是这样的话,那么p就不能成为一个角点。然后可以通过检查圆中的所有像素,将全部分段测试标准应用于通过的对候选的角点。这种探测器本身表现出很高的性能,但有一些缺点:
- 它不能拒绝n <12的候选角点。
- 检测到的角点不是最优的,因为它的效率取决于问题的排序和角点的分布。
- 角点分析的结果被扔掉了。
- 多个特征点容易挤到一起。
前三点是用机器学习方法解决的。最后一个是使用非极大值抑制来解决。
机器学习角点探测器
- 选择一组用于训练的图像(最好来自目标应用区域)
- 在每个图像中运行FAST算法以查找特征点。
- 对于每个特征点,将其周围的16个像素存储为一个向量。获取所有图像的特征向量P。
- 对于圆上的每个位置x∈{1..16},这16个相对于p的位置(由p→x表示)的像素有以下3种状态:
- 根据这些状态,特征向量P被细分为3个子集。
- 定义一个新的布尔变量,若p是一个角点,则为true,否则为false。
- 使用ID3算法(决策树分类器)使用变量来查询每个子集,利用确认其真实类别。通过测量的熵,选择产生关于候选像素是否是一个角点的信息最多的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
下一篇: 论坛的审核系统怎么设计?