1. 程式人生 > >OpenCv-C++-SURF特徵檢測

OpenCv-C++-SURF特徵檢測

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;
}

執行結果:
在這裡插入圖片描述