OpenCV2马拉松第26圈——FAST特征点检测

计算机视觉讨论群162501053

关于角点检测,我写过两篇文章
有兴趣的童鞋可以去看看~~~

收入囊中
  • FAST角点检测原理
  • 使用OpenCV  FAST API检测角点

葵花宝典

对于一个角点来说,应该与周围的大多数像素点有很大的差别


如上图,对于点P,我们圈出了周围的16个点.



I(x)是这16个点的灰度值,I(p)是中心点p的灰度值,只要相差超过一个阀值(譬如40),N就会增加1.当N超过了一定值(比如16个点中的12个),就会被认为是角点,直观明了。

加速算法:测试候选点周围每隔90度角的4个点(点1,5,9,13),应该至少有3个和候选点的灰度值差足够大,否则直接认为其不是特征点为了提高比较的效率,通常只使用N个周边像素来比较,也就是大家经常说的FAST-N。大家使用比较多的是FAST-9和FAST-12

半径也是一个参数,如上图选的半径是3,半径3通常给出好的结果和较高效率



初识API


class FastFeatureDetector : public FeatureDetector
{
public:
    FastFeatureDetector( int threshold=1, bool nonmaxSuppression=true, type=FastFeatureDetector::TYPE_9_16 );
    virtual void read( const FileNode& fn );
    virtual void write( FileStorage& fs ) const;
protected:
    ...
};
参数有阀值,非极大值抑制和类型(fast-n)

在之前的Harris角点检测中,进行非极大值抑制是比较好的选择。因此,一个角点的强度定义如下:中心点灰度值与周围灰度值差的绝对值的和。


荷枪实弹

#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <vector>

using namespace cv;
void main(int argv, char **argc)
{
	Mat image;
	image = imread(argc[1]);
	std::vector<KeyPoint> keyPoints;
	FastFeatureDetector fast(40,true,TYPE_9_16);
	fast.detect(image,keyPoints);
	drawKeypoints(image, keyPoints, image, Scalar::all(255), DrawMatchesFlags::DRAW_OVER_OUTIMG);
	imshow("FAST feature", image);
	cvWaitKey(0);
}





  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值