OpenCv-C++-特徵描述子(BruteForce(暴力匹配))
阿新 • • 發佈:2018-12-23
本片文主要是通過BFMatcher()來進行特徵匹配,暴力匹配就是在一個數組或連結串列裡面進行一一查詢,迴圈匹配。如下圖:
通過SURF運算元分別找到兩張影象的特徵點,再使用BFMatcher函式對兩張影象上的特徵點進行一一檢測和計算,最後通過drawMatches函式繪製兩張影象之間的相似連線線。
下面附上原始碼:
#include<opencv2/opencv.hpp> #include<iostream> #include<opencv2/xfeatures2d.hpp> #include<math.h> using namespace cv; using namespace std; using namespace xfeatures2d; Mat img1,img2; int main(int argc, char** argv) { img1 = imread("D:/test/machesBook.png", 0); img2 = imread("D:/test/Book.png", 0); if (!img1.data||!img2.data) { cout << "圖片未找到" << endl; return -1; } imshow("Book", img1); imshow("machesBook", img2); //使用surf運算元求特徵點 int minHession = 400; Ptr<SURF> detector = SURF::create(minHession); vector<KeyPoint> keypoints_1;//img1的特徵點儲存 vector<KeyPoint> keypoints_2;//imh2的特徵點儲存 Mat descriptor_1, descriptor_2; detector->detectAndCompute(img1,Mat(),keypoints_1,descriptor_1);//檢測特徵點並計算描述子 detector->detectAndCompute(img2, Mat(),keypoints_2, descriptor_2); ////使用BruteForce(暴力匹配)進行匹配 BFMatcher bfmatcher; vector<DMatch> matchs; //儲存裡面的一些點的資訊 bfmatcher.match(descriptor_1, descriptor_2, matchs, Mat()); Mat resultImg; drawMatches(img1, keypoints_1, img2, keypoints_2, matchs, resultImg); imshow("BruteForce demo", resultImg); waitKey(0); return 0; }
執行結果:
1、匹配的圖:
2、被匹配的圖:
3、匹配結果:
可以看到,雖然能夠匹配成功,但是特徵的匹配並不是很精準。這是暴力匹配的弊端。