SURF采用的是Hessian矩阵(SURF算法核心)行列式近似值图像。SURF(加速版的具有鲁棒性的特征,SpeededUp Robust Features),SURF是尺度不变特征变换算法(SIFT算法)的加速版。SURF最大的特征在于采用了harr特征以及积分图像的概念。
而Hessian矩阵是Surf算法的核心,为了方便运算,如果函数f(z,y),Hessian矩阵H是由函数,偏导数组成。首先来看看图像中某个像素点的Hessian矩阵。例如以下:
所以每个像素点都能够求出一个Hessian矩阵。
理论部分必须要参考这篇两文章:https://blog.csdn.net/qq_31531635/article/details/73798398
https://www.cnblogs.com/gavanwanggw/p/7073905.html
#include<opencv2/opencv.hpp>
#include<opencv2/xfeatures2d.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;
using namespace cv::xfeatures2d;
Mat src;
int main(int argc, char** argv)
{
src = imread("D:/test/src.png",IMREAD_GRAYSCALE);//IMREAD_GRAYSCALE加载的就变成一张灰度图像
if (src.empty())
{
cout << "图片未找到!" << endl;
return -1;
}
imshow("input title", src);
int minHessian = 400;//默认值为100
//SURF特征检测
Ptr<SURF>detector = SURF::create(minHessian, 4, 3, false, false);
//也可以写成SURF::create(minHessian)
vector<KeyPoint>keyPoints;
detector->detect(src, keyPoints, Mat());
Mat resultImg;
//绘制关键点
drawKeypoints(src, keyPoints, resultImg, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
imshow("KetPoint image", resultImg);
waitKey(0);
return 0;
}
运行结果: