1. 程式人生 > >OpenCv-C++-特徵描述子(BruteForce(暴力匹配))

OpenCv-C++-特徵描述子(BruteForce(暴力匹配))

本片文主要是通過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、匹配結果:
在這裡插入圖片描述
可以看到,雖然能夠匹配成功,但是特徵的匹配並不是很精準。這是暴力匹配的弊端。