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、匹配结果:
在这里插入图片描述
可以看到,虽然能够匹配成功,但是特征的匹配并不是很精准。这是暴力匹配的弊端。

猜你喜欢

转载自blog.csdn.net/Daker_Huang/article/details/84876499