学习OpenCV——Fast(特征点篇) (&DrawMatchFlags)

特征点检测和匹配是计算机视觉中一个很有用的技术。在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用。这一次先介绍特征点检测的一种方法——FAST(features from accelerated segment test)。很多传统的算法都很耗时,而且特征点检测算法只是很多复杂图像处理里中的第一步,得不偿失。FAST特征点检测是公认的比较快速的特征点检测方法,只利用周围像素比较的信息就可以得到特征点,简单,有效。

FAST特征检测算法来源于corner的定义,这个定义基于特征点周围的图像灰度值,检测候选特征点周围一圈的像素值,如果候选点周围领域内有足够多的像素点与该候选点的灰度值差别够大,则认为该候选点为一个特征点。


其中I(x)为圆周上任意一点的灰度,I(p)为圆心的灰度,Ed为灰度值差得阈值,如果N大于给定阈值,一般为周围圆圈点的四分之三,则认为p是一个特征点。

为了获得更快的结果,还采用了额外的加速办法。如果测试了候选点周围每隔90度角的4个点,应该至少有3个和候选点的灰度值差足够大,否则则不用再计算其他点,直接认为该候选点不是特征点候选点周围的圆的选取半径是一个很重要的参数,这里我为了简单高效,采用半径为3,共有16个周边像素需要比较。但我看很多文献推荐FAST-9,认为半径取9效果更佳。上个图说明的更形象一些


OpenCV里对FAST的使用也非常简单,先声明一组特征点,构建FAST特征检测,接下来调用detect函数检测图像中的特征点,最后把特征点绘制到图片上。上代码说的清楚些

  1. #include <opencv2/core/core.hpp>
  2. #include <opencv2/features2d/features2d.hpp>
  3. #include <opencv2/highgui/highgui.hpp>
  4. #include <vector>
  5. using namespace cv;
  6. void main()
  7. {
  8. Mat src;
  9. src = imread("D:/Demo.jpg");
  10. // vector of keyPoints
  11. std::vector<KeyPoint> keyPoints;
  12. // construction of the fast feature detector object
  13. FastFeatureDetector fast(40); // 检测的阈值为40
  14. // feature point detection
  15. fast.detect(src,keyPoints);
  16. drawKeypoints(src, keyPoints, src, Scalar::all(-1), DrawMatchesFlags::DRAW_OVER_OUTIMG);
  17. imshow("FAST feature", src);
  18. cvWaitKey(0);
  19. }
#include <opencv2/core/core.hpp>   
#include <opencv2/features2d/features2d.hpp>   
#include <opencv2/highgui/highgui.hpp>
#include <vector>

using namespace cv;

void main()
{
	Mat src;
	src = imread("D:/Demo.jpg");
	// vector of keyPoints
	std::vector<KeyPoint> keyPoints;
	// construction of the fast feature detector object
	FastFeatureDetector fast(40);	// 检测的阈值为40
	// feature point detection
	fast.detect(src,keyPoints);
	drawKeypoints(src, keyPoints, src, Scalar::all(-1), DrawMatchesFlags::DRAW_OVER_OUTIMG);
	imshow("FAST feature", src);
	cvWaitKey(0);
}


DrawMatchFlags:

  1. struct DrawMatchesFlags{enum {
  2. DEFAULT = 0, // 输出图像将被创建(Mat::create),
  3. // 只画出特征点,而不画出周围的circle包含特征点的大小和方向.
  4. DRAW_OVER_OUTIMG = 1, // 输出图像将被创建(using Mat::create),匹配点将被画在输出图像的内容上.
  5. NOT_DRAW_SINGLE_POINTS = 2, // 单个的点不画出.
  6. DRAW_RICH_KEYPOINTS = 4 // 对每个特征点周围的circle,包含特征点的大小和方向将被画出.
  7. };
  8. };
struct DrawMatchesFlags{    enum    {
        DEFAULT = 0, // 输出图像将被创建(Mat::create),
                     // 只画出特征点,而不画出周围的circle包含特征点的大小和方向.
        DRAW_OVER_OUTIMG = 1, // 输出图像将被创建(using Mat::create),匹配点将被画在输出图像的内容上.
        NOT_DRAW_SINGLE_POINTS = 2, // 单个的点不画出.
        DRAW_RICH_KEYPOINTS = 4 // 对每个特征点周围的circle,包含特征点的大小和方向将被画出.    
    };
};


另附drawMatches:

void drawMatches(const Mat&img1, const vector<KeyPoint>&keypoints1, const Mat&img2, const vector<KeyPoint>&keypoints2, const vector<DMatch>&matches1to2, Mat&outImg, const Scalar&matchColor=Scalar::all(-1), const Scalar&singlePointColor=Scalar::all(-1), const vector<char>&matchesMask=vector<char>(), intflags=DrawMatchesFlags::DEFAULT)

Parameters:
  • img1 – 源图像1
  • keypoints1 –源图像1的特征点.
  • img2 – 源图像2.
  • keypoints2 – 源图像2的特征点
  • matches1to2 – 源图像1的特征点匹配源图像2的特征点[matches[i]] .
  • outImg – 输出图像具体由flags决定.
  • matchColor – 匹配的颜色(特征点和连线),若matchColor==Scalar::all(-1),颜色随机.
  • singlePointColor – 单个点的颜色,即未配对的特征点,若matchColor==Scalar::all(-1),颜色随机.
  • matchesMask – Mask决定哪些点将被画出,若为空,则画出所有匹配点.
  • flags – Fdefined by DrawMatchesFlags.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值