步驟:
特征檢測 —— 特征描述 —— 特征匹配
實現流程:
(1)特征檢測:SurfFeatureDetector類 . detect( )函數
(2)特征描述:SurfDescriptorExtractor類 . compute( )函數
(3)特征匹配:BruteForceMatcher類 . match( )函數
(這三步的實現都類似:類實例化一個對象,(定義vector或者Mat存放結果),調用函數,將計算結果存儲供給下一步使用)
(4)最后顯示“匹配圖”:drawMatches( )函數
實現代碼:
#include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include <opencv2/nonfree/nonfree.hpp> #include<opencv2/legacy/legacy.hpp> #include <iostream> using namespace cv; using namespace std; int main() { //【1】載入素材圖 Mat srcImage1 = imread("1.jpg", 1); Mat srcImage2 = imread("2.jpg", 1); if (!srcImage1.data || !srcImage2.data) { printf("讀取圖片錯誤,請確定目錄下是否有imread函數指定的圖片存在~! \n"); return false; } //【2】使用SURF算子檢測關鍵點 int minHessian = 700;//SURF算法中的hessian閾值 SurfFeatureDetector detector(minHessian);//定義一個SurfFeatureDetector(SURF) 特征檢測類對象 std::vector<KeyPoint> keyPoint1, keyPoints2;//vector模板類,存放任意類型的動態數組 //【3】調用detect函數檢測出SURF特征關鍵點,保存在vector容器中 detector.detect(srcImage1, keyPoint1); detector.detect(srcImage2, keyPoints2); //【4】計算描述符(特征向量) SurfDescriptorExtractor extractor; Mat descriptors1, descriptors2; extractor.compute(srcImage1, keyPoint1, descriptors1); extractor.compute(srcImage2, keyPoints2, descriptors2); //【5】使用BruteForce進行匹配 // 實例化一個匹配器 BruteForceMatcher< L2<float> > matcher; std::vector< DMatch > matches; //匹配兩幅圖中的描述子(descriptors) matcher.match(descriptors1, descriptors2, matches); //【6】繪制從兩個圖像中匹配出的關鍵點 Mat imgMatches; drawMatches(srcImage1, keyPoint1, srcImage2, keyPoints2, matches, imgMatches);//進行繪制 //【7】顯示效果圖 imshow("匹配圖", imgMatches); waitKey(0); return 0; }