OpenCv-C++-SURF特徵檢測
阿新 • • 發佈:2018-11-30
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; }
執行結果: