opencv学习-特征匹配

这篇具有很好参考价值的文章主要介绍了opencv学习-特征匹配。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

opencv特征匹配方法有两种,分别是:

暴力特征匹配

BF(Brute-Force),暴力特征匹配方法。它使用第一组中的每个特征的描述子,与第二组中的所有特征描述子进行匹配,计算它们之间的差距,然后将最接近一个匹配返回。

FLANN特征匹配

在进行批量特征匹配时,FLANN速度更快。
由于它使用的是邻近近似值,所以精度较差。

Opencv特征匹配实现的简单过程:

第一步:定义特征检测器(SIFT,SURF,ORB等)。
第二步:对图像中特征点进行检测,并将特征点存储在Keypoints中。
第三步:提取特征点的描述信息。
第四步:定义特征匹配器(特征匹配的方法主要有两种分别为暴力匹配BFmatch和FlannBased)。
第五步:过滤掉较差的匹配点位(一般根据临近两点的距离进行过滤)
主要是根据DMatch中的distance进行过滤,对于distance可以抽象理解为匹配的分值,distance越小说明检测点的相似度越高,效果越好。
第六步:对匹配的特征点显示。

实现代码

代码1(未滤波,只限制筛选点数为20)

#include <iostream>
#include <opencv2/opencv.hpp>  
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include <opencv2/xfeatures2d.hpp>
 
 
using namespace cv;  //包含cv命名空间
using namespace std;
using namespace xfeatures2d;
 
 
int main() {
 
	system("color 2E");
	//载入图片
	Mat src1 = imread("E:\\乔大花进度\\11-18\\sift特征检测和匹配\\3.jpg",1);
	Mat src2 = imread("E:\\乔大花进度\\11-18\\sift特征检测和匹配\\4.jpg", 1);
 
	//显示原图
	imshow("原图1",src1);
	imshow("原图2", src2);
 
	//定义变量
	vector<KeyPoint> keypoints1, keypoints2;//定义检测的特征点存储容器
	Mat descriptors1,descriptors2;//定义特征点描述信息为Mat类型
	Mat result_img;//匹配结果图片
 
	//创建sift特征检测器实例
	//将SIFT可以换位SURF、ORB
	Ptr<SIFT>detector = SIFT::create();
	//提取特征点
	detector->detect(src1,keypoints1,noArray());
	detector->detect(src2, keypoints2, Mat());
 
 
	//获取特征点的描述信息=>特征向量
	detector->compute(src1,keypoints1,descriptors1);
	detector->compute(src2, keypoints2, descriptors2);
 
 
	//定义匹配器的实例化=>方法为暴力匹配法
	Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create(DescriptorMatcher::BRUTEFORCE);//create中的参数可以填string FlannBased等匹配方法
 
	//第二种实例化方法
	//BFMatcher matcher;
 
	//进行暴力匹配
	vector<DMatch> matches;
 
	//第一个参数为queryDescription为目标,第二个参数为trainDescription模板
	matcher->match(descriptors1,descriptors2,matches);
 
 
	//限制特征点匹配数量=》只匹配前20个较好的特征点
	int num = 20;
	nth_element(matches.begin(), matches.begin()+num,matches.end());
	//vector去除20以后的元素
	matches.erase(matches.begin()+num,matches.end());
	
 
	//输出关键点和匹配结果
	//其中右侧图为trainDescription模板,左侧图为queryDescription目标
	//左图中的点与右图中进行匹配对应
	drawMatches(src1,keypoints1,src2,keypoints2, matches,result_img);
	drawKeypoints(src1,keypoints1,src1);
	drawKeypoints(src2,keypoints2,src2);
	
	imshow("匹配结果",result_img);
	imshow("特征点1",src1);
	imshow("特征点2",src2);
 
	waitKey(0);
	system("pause");
	return 0;
}

运行结果:
opencv 特征匹配,opencv,c++,opencv,学习,计算机视觉

代码2(通过距离进行滤波)

#include <iostream>
#include <opencv2/opencv.hpp>  
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include <opencv2/xfeatures2d.hpp>
 
 
using namespace cv;  //包含cv命名空间
using namespace std;
using namespace xfeatures2d;
 
 
int main() {
 
	system("color 2E");
	//载入图片
	Mat src1 = imread("E:\\乔大花进度\\11-18\\sift特征检测和匹配\\3.jpg",1);
	Mat src2 = imread("E:\\乔大花进度\\11-18\\sift特征检测和匹配\\4.jpg", 1);
 
	//显示原图
	imshow("原图1",src1);
	imshow("原图2", src2);
 
	//定义变量
	vector<KeyPoint> keypoints1, keypoints2;//定义检测的特征点存储容器
	Mat descriptors1,descriptors2;//定义特征点描述信息为Mat类型
	Mat result_img;//匹配结果图片
 
	//创建sift特征检测器实例
	//将SIFT可以换位SURF、ORB
	Ptr<SIFT>detector = SIFT::create();
	//提取特征点
	detector->detect(src1,keypoints1,noArray());
	detector->detect(src2, keypoints2, Mat());
 
 
	//获取特征点的描述信息=>特征向量
	detector->compute(src1,keypoints1,descriptors1);
	detector->compute(src2, keypoints2, descriptors2);
 
 
	//定义匹配器的实例化=>方法为暴力匹配法
	Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create(DescriptorMatcher::BRUTEFORCE);//create中的参数可以填string FlannBased等匹配方法
 
	//第二种实例化方法
	//BFMatcher matcher;
 
	//进行暴力匹配
	vector<DMatch> matches;
 
	//第一个参数为queryDescription为目标,第二个参数为trainDescription模板
	matcher->match(descriptors1,descriptors2,matches);
 
 
	//限制特征点匹配数量=》只匹配前20个较好的特征点
	int num = 20;
	nth_element(matches.begin(), matches.begin()+num,matches.end());
	//vector去除20以后的元素
	matches.erase(matches.begin()+num,matches.end());
	
	double Max_distance = matches[1].distance;
	double Min_distance = matches[1].distance;
	vector<DMatch> goodfeatrues;
	
	//根据特征点的距离去筛选
	for (int i = 0; i < matches.size(); i++)
	{
		double dist = matches[i].distance;
		if (dist>Max_distance)
		{
			Max_distance = dist;
		}
		if (dist<Min_distance)
		{
			Min_distance = dist;
		}
		
	}
 
	cout << "匹配点的最大距离:" << Max_distance << endl;
	cout << "匹配点的最小距离:" << Min_distance << endl;
 
	//M为距离阈值,M越大点数越多
	double M = 1.3;
	for (int  i = 0; i < matches.size(); i++)
	{
		double dist = matches[i].distance;
		if (dist<M*Min_distance)		{
			goodfeatrues.push_back(matches[i]);
		}
	}
	cout << "最终选取特征点的数量为:" << matches.size() << endl;
 
	//输出关键点和匹配结果
	//其中右侧图为trainDescription模板,左侧图为queryDescription目标
	//左图中的点与右图中进行匹配对应
	drawMatches(src1,keypoints1,src2,keypoints2, goodfeatrues,result_img);
	drawKeypoints(src1,keypoints1,src1);
	drawKeypoints(src2,keypoints2,src2);
	
	imshow("匹配结果",result_img);
	imshow("特征点1",src1);
	imshow("特征点2",src2);
 
	waitKey(0);
	system("pause");
	return 0;
}

运行结果:
opencv 特征匹配,opencv,c++,opencv,学习,计算机视觉

代码3(通过knnMatch匹配,可以通过对distance设置阈值进行滤波,效果最好)

#include <iostream>
#include <opencv2/opencv.hpp>  
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include <opencv2/xfeatures2d.hpp>
 
 
using namespace cv;  //包含cv命名空间
using namespace std;
using namespace xfeatures2d;
 
 
int main() {
 
	system("color 2E");
	//载入图片
	Mat src1 = imread("E:\\乔大花进度\\11-18\\sift特征检测和匹配\\3.jpg",1);
	Mat src2 = imread("E:\\乔大花进度\\11-18\\sift特征检测和匹配\\4.jpg", 1);
 
	//显示原图
	imshow("原图1",src1);
	imshow("原图2", src2);
 
	//定义变量
	vector<KeyPoint> keypoints1, keypoints2;//定义检测的特征点存储容器
	Mat descriptors1,descriptors2;//定义特征点描述信息为Mat类型
	Mat result_img;//匹配结果图片
 
	//创建sift特征检测器实例
	//将SIFT可以换位SURF、ORB
	Ptr<SIFT>detector = SIFT::create();
	//提取特征点
	detector->detect(src1,keypoints1,noArray());
	detector->detect(src2, keypoints2, Mat());
 
 
	//获取特征点的描述信息=>特征向量
	detector->compute(src1,keypoints1,descriptors1);
	detector->compute(src2, keypoints2, descriptors2);
 
 
	//定义匹配器的实例化=>方法为暴力匹配法
	Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create(DescriptorMatcher::BRUTEFORCE);//create中的参数可以填string FlannBased等匹配方法
 
	//第二种实例化方法
	//BFMatcher matcher;
 
	//进行暴力匹配
	vector<DMatch> matches;
 
	vector<Mat>train_desc(1, descriptors2);
	matcher->add(train_desc);
	matcher->train();
 
	vector<vector<DMatch>> matchpoints;
	matcher->knnMatch(descriptors1,matchpoints,2);
 
	vector<DMatch> goodfeatur;
	for (int i = 0; i < matchpoints.size(); i++)
	{
		if (matchpoints[i][0].distance<0.15*matchpoints[i][1].distance)
		{
			goodfeatur.push_back(matchpoints[i][0]);
		}
 
	}
	cout << "筛选后的特征点数量为: " << goodfeatur.size() << endl;
 
	//输出关键点和匹配结果
	//其中右侧图为trainDescription模板,左侧图为queryDescription目标
	//左图中的点与右图中进行匹配对应
	drawMatches(src1,keypoints1,src2,keypoints2, goodfeatur,result_img);
	drawKeypoints(src1,keypoints1,src1);
	drawKeypoints(src2,keypoints2,src2);
	
	namedWindow("匹配结果",WINDOW_NORMAL);
	resizeWindow("匹配结果",500,500);
	imshow("匹配结果",result_img);
 
	waitKey(0);
	system("pause");
	return 0;
}

运行结果:
opencv 特征匹配,opencv,c++,opencv,学习,计算机视觉

原文链接:https://blog.csdn.net/qiaodahua/article/details/127995517文章来源地址https://www.toymoban.com/news/detail-647759.html

到了这里,关于opencv学习-特征匹配的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机竞赛 机器视觉目标检测 - opencv 深度学习

    🔥 优质竞赛项目系列,今天要分享的是 🚩 机器视觉 opencv 深度学习目标检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/dancheng

    2024年02月07日
    浏览(28)
  • 计算机视觉+深度学习+机器学习+opencv+目标检测跟踪(代码+视频)

    计算机视觉、深度学习和机器学习是当今最热门的技术,它们被广泛应用于各种领域,如自动驾驶、医学图像分析、安防监控等。而目标检测跟踪技术则是计算机视觉中的一个重要分支,它可以帮助我们在图像或视频中自动识别和跟踪特定的目标。 下面我们来一一介绍这些技

    2024年02月01日
    浏览(83)
  • python 机器视觉 车牌识别 - opencv 深度学习 机器学习 计算机竞赛

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于python 机器视觉 的车牌识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 车牌识别其实是个经典的机器视觉任务了,

    2024年02月06日
    浏览(26)
  • 计算机竞赛 python 机器视觉 车牌识别 - opencv 深度学习 机器学习

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于python 机器视觉 的车牌识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 车牌识别其实是个经典的机器视觉任务了,

    2024年02月12日
    浏览(31)
  • 《OpenCV 计算机视觉编程攻略》学习笔记(一:图像编程入门)

    参考引用 OpenCV 计算机视觉编程攻略(第3版) 说明 本书结合 C++ 和 OpenCV 3.2 全面讲解计算机视觉编程 所有代码均在 Ubuntu 系统中用 g++ 编译执行 0. 安装 OpenCV 库 在Ubuntu上安装OpenCV及使用 OpenCV 库分为多个模块 ,常见模块如下 opencv_core 模块包含库的核心功能 opencv_imgproc 模块包

    2024年02月09日
    浏览(25)
  • 计算机竞赛 深度学习 机器视觉 人脸识别系统 - opencv python

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习 机器视觉 人脸识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 🧿 更多资料, 项目分享: https://gitee.com/dancheng

    2024年02月07日
    浏览(24)
  • 计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作

    键盘响应中有一个函数叫做 waitKey ,所有的获取键盘键值都是通过waitKey函数实现的。 1.键盘响应事件 cv.waitKey( [, delay] ) -- retval delay如果没有声明或者delay=0,表示一直阻塞 delay大于0,表示阻塞指定毫秒数 retval返回的对应键盘键值,注意:在不同的操作系统中可能会有差异! 典

    2024年02月09日
    浏览(25)
  • 计算机竞赛 深度学习 opencv python 公式识别(图像识别 机器视觉)

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的数学公式识别算法实现 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:4分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/d

    2024年02月07日
    浏览(32)
  • 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉 计算机竞赛

    🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习多目标跟踪 实时检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen

    2024年02月05日
    浏览(35)
  • 基于计算机视觉,深度学习、机器学习,OpenCV,图像分割,目标检测卷积神经网络计算机毕业设计选题题目大全选题指导

    随着深度学习、机器学习和神经网络技术的快速发展,计算机视觉领域的应用变得越来越广泛和有趣。本毕业设计旨在探索这一领域的前沿技术,将深度学习模型、神经网络架构、OpenCV图像处理工具,以及卷积神经网络(CNN)的强大能力结合起来,以解决实际图像处理问题。

    2024年02月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包