花老湿学习OpenCV:SURF特征检测

引言:

SIFT是一种鲁棒性好的尺度不变特征描述方法,但SIFT算法计算数据量大、时间复杂度高、算法耗时长。针对上述缺点许多研究者对SIFT算法做了不同的改进,Yanke等人提出用PCA-SIFT方法对特征描述进行数据降维,但在没有任何先验知识的情况下反而增加了计算量;Delpont等人提出用SVD方法进行特征匹配,但匹配过程计算复杂,且不能用于宽基线匹配;Grabner等人用积分图像虽提高了SIFT的计算速度,但是降低了SIFT方法的优越性。 
Herbert Bay等人于2006年提出了SIFT算法的改进算法SURF算法,其性能超过了SIFT算法且能够获得更快的速度。SURF在光照变化和视角变化不变性方面的性能接近SIFT算法,尤其对图像严重模糊和旋转处理得非常好。且标准的SURF算子比SIFT算子快好几倍,SURF算法最大的特征在于采用了harr特征以及积分图像的概念,这大大加快了程序的运行速度。 
 

SURF算法原理:

参考博文:

【特征匹配】SURF原理与源码解析(一)https://blog.csdn.net/luoshixian099/article/details/47807103

 opencv之SURF算法原理及关键点检测 https://blog.csdn.net/keith_bb/article/details/70225785

 下面是相关书籍中的介绍:

API:

 

#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"
#include <opencv2/xfeatures2d.hpp>



using namespace std;
using namespace cv;
using namespace cv::xfeatures2d;

Mat src;
int hessianThreshold = 400;
int maxTrackbarNum = 1500;

void SurfDecetor_demo(int pos, void* data);

int main()
{
	//待检测图像
	src = imread("F:\\visual studio\\Image\\hand4.jpg");
	if (src.empty())
	{
		cout << "Can't load the image" << endl;
		return -1;
	}
	resize(src, src, Size(), 0.5, 0.5);
	imshow("src", src);

	namedWindow("SURF_feature", WINDOW_AUTOSIZE);
	createTrackbar("nfeatures", "SURF_feature", &hessianThreshold, maxTrackbarNum, SurfDecetor_demo);
	SurfDecetor_demo(0, 0);

	waitKey(0);
}


void  SurfDecetor_demo(int pos, void* data)
{
	//SURF特征检测
	Ptr<SURF> detector = SURF::create(hessianThreshold);
	vector<KeyPoint> keypoints;
	detector->detect(src, keypoints, Mat());
	//绘制
	Mat kp_img;
	drawKeypoints(src, keypoints, kp_img, Scalar::all(-1), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
	imshow("SURF_feature", kp_img);
}

 效果展示:

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值