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

以下是特征匹配评估的C++代码示例: ```c++ #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { // 读取两张待匹配的图像 Mat img1 = imread("image1.jpg", IMREAD_GRAYSCALE); Mat img2 = imread("image2.jpg", IMREAD_GRAYSCALE); // 初始化特征检测器和描述符提取器 Ptr<FeatureDetector> detector = ORB::create(); Ptr<DescriptorExtractor> extractor = ORB::create(); // 检测特征点并提取特征描述符 vector<KeyPoint> keypoints1, keypoints2; Mat descriptors1, descriptors2; detector->detect(img1, keypoints1); detector->detect(img2, keypoints2); extractor->compute(img1, keypoints1, descriptors1); extractor->compute(img2, keypoints2, descriptors2); // 进行特征点匹配 Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming"); vector<DMatch> matches; matcher->match(descriptors1, descriptors2, matches); // 计算匹配结果的正确匹配率和误匹配率 double max_dist = 0; double min_dist = 100; for (int i = 0; i < descriptors1.rows; i++) { double dist = matches[i].distance; if (dist < min_dist) min_dist = dist; if (dist > max_dist) max_dist = dist; } cout << "最大距离:" << max_dist << endl; cout << "最小距离:" << min_dist << endl; vector<DMatch> good_matches; for (int i = 0; i < descriptors1.rows; i++) { if (matches[i].distance <= max(2 * min_dist, 0.02)) { good_matches.push_back(matches[i]); } } double accuracy = double(good_matches.size()) / matches.size(); double error_rate = 1 - accuracy; cout << "正确匹配率:" << accuracy << endl; cout << "误匹配率:" << error_rate << endl; // 显示匹配结果 Mat img_matches; drawMatches(img1, keypoints1, img2, keypoints2, good_matches, img_matches); imshow("特征匹配结果", img_matches); waitKey(0); return 0; } ``` 在这个示例中,我们使用ORB算法来检测特征点并提取特征描述符,使用暴力匹配算法进行特征点匹配,并计算匹配结果的正确匹配率和误匹配率。最后,我们将匹配结果可视化并显示在窗口中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值