vc2017+opencv+orb特征匹配

博客提及ORB特征提取与匹配的理论部分可点击相关链接,还给出了该特征提取与匹配的C++代码及匹配结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

理论部分戳这个ORB特征提取与匹配

C++代码如下:

#include<opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include<opencv2/features2d.hpp>
using namespace cv;
using namespace std;

/////////////////////ORB特征匹配变量声明///////////////////////
vector<KeyPoint> keypoints1, keypoints2;
Mat descriptors1, descriptors2;
Ptr<FeatureDetector> detector = ORB::create(500);
Ptr<DescriptorExtractor> descriptor = ORB::create(500);
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");
////////////////////////////end/////////////////////////////////
int main()
{
	Mat img1 = imread("11.jpg");
	Mat img2 = imread("car.jpg");
	Mat orbimg;
	imshow("1", img1);
	imshow("2", img2);

	detector->detect(img1, keypoints1);
	descriptor->compute(img1, keypoints1, descriptors1);

	detector->detect(img2, keypoints2);
	descriptor->compute(img2, keypoints2, descriptors2);

	vector<DMatch>matches;
	matcher->match(descriptors1, descriptors2, matches);

	double min_dist = 10000, max_dist = 0;
	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;
	}
	min_dist = min_element(matches.begin(), matches.end(), [](const DMatch& m1, const DMatch& m2) {return m1.distance < m2.distance; })->distance;
	max_dist = max_element(matches.begin(), matches.end(), [](const DMatch& m1, const DMatch& m2) {return m1.distance < m2.distance; })->distance;
	cout << min_dist << endl;
	cout << max_dist << endl;
	std::vector< DMatch > good_matches;

	for (int i = 0; i < descriptors1.rows; i++)
	{
		if (matches[i].distance <= max(2 * min_dist, 30.0))
		{
			good_matches.push_back(matches[i]);
		}
	}

	for (int i = 0; i < 10; i++)
	{
		cout << good_matches[i].distance << endl;
	}
	drawMatches(img1, keypoints1, img2, keypoints2, good_matches, orbimg, Scalar::all(-1),
		Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
	imwrite("orbing.jpg", orbimg);
	imshow("orbimg", orbimg);
	waitKey(0);
	return 0;
}

 匹配结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值