引言:
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);
}
效果展示: