【CV】opencv特征匹配算法

特征匹配是计算机视觉领域中的一项关键任务,它用于在不同图像中寻找相似的特征点,并将它们进行匹配。这些特征点可以是图像中的角点、边缘、斑点等,在不同的图像中可能因为旋转、缩放、光照变化等因素发生变化。

在OpenCV中,提供了多种特征匹配算法,其中包括ORB、SIFT、SURF、KAZE、AKAZE等。接下来,简要介绍这些算法,主要给出OpenCV示例。这里挖个坑,每个算法原理后续再填

ORB (Oriented FAST and Rotated BRIEF)

ORB是一种高效的特征提取和描述符算法,它结合了FAST关键点检测器和BRIEF描述符算法。ORB算法具有良好的旋转不变性和尺度不变性,并且计算速度较快,适用于实时应用场景。

#include <opencv2/opencv.hpp>using namespace cv;int main() {Mat img1 = imread("image1.jpg", IMREAD_GRAYSCALE);Mat img2 = imread("image2.jpg", IMREAD_GRAYSCALE);Ptr<ORB> orb = ORB::create();vector<KeyPoint> keypoints1, keypoints2;Mat descriptors1, descriptors2;orb->detectAndCompute(img1, Mat(), keypoints1, descriptors1);orb->detectAndCompute(img2, Mat(), keypoints2, descriptors2);// 进行特征点匹配BFMatcher matcher(NORM_HAMMING);vector<DMatch> matches;matcher.match(descriptors1, descriptors2, matches);// 绘制匹配结果Mat img_matches;drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);imshow("Matches", img_matches);waitKey(0);return 0;
}

SIFT (Scale-Invariant Feature Transform)

SIFT是一种基于尺度空间的特征提取和描述符算法,具有良好的旋转和尺度不变性,但计算速度较慢。它是一种经典的特征匹配算法,在许多应用中仍然被广泛使用。

#include <opencv2/opencv.hpp>using namespace cv;int main() {Mat img1 = imread("image1.jpg", IMREAD_GRAYSCALE);Mat img2 = imread("image2.jpg", IMREAD_GRAYSCALE);Ptr<SIFT> sift = SIFT::create();vector<KeyPoint> keypoints1, keypoints2;Mat descriptors1, descriptors2;sift->detectAndCompute(img1, Mat(), keypoints1, descriptors1);sift->detectAndCompute(img2, Mat(), keypoints2, descriptors2);// 进行特征点匹配BFMatcher matcher;vector<DMatch> matches;matcher.match(descriptors1, descriptors2, matches);// 绘制匹配结果Mat img_matches;drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);imshow("Matches", img_matches);waitKey(0);return 0;
}

SURF (Speeded-Up Robust Features)
SURF是一种基于快速Hessian矩阵检测的特征提取算法,它具有比SIFT更快的计算速度,但牺牲了一些旋转不变性。SURF适用于对速度要求较高的应用场景。

#include <opencv2/opencv.hpp>using namespace cv;int main() {Mat img1 = imread("image1.jpg", IMREAD_GRAYSCALE);Mat img2 = imread("image2.jpg", IMREAD_GRAYSCALE);Ptr<SURF> surf = SURF::create();vector<KeyPoint> keypoints1, keypoints2;Mat descriptors1, descriptors2;surf->detectAndCompute(img1, Mat(), keypoints1, descriptors1);surf->detectAndCompute(img2, Mat(), keypoints2, descriptors2);// 进行特征点匹配BFMatcher matcher;vector<DMatch> matches;matcher.match(descriptors1, descriptors2, matches);// 绘制匹配结果Mat img_matches;drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);imshow("Matches", img_matches);waitKey(0);return 0;
}

KAZE (Accelerated-KAZE)

KAZE是一种快速的特征提取算法,它在保持较好旋转和尺度不变性的同时,具有更快的计算速度。KAZE适用于对计算资源要求较高的应用场景。

#include <opencv2/opencv.hpp>using namespace cv;int main() {Mat img1 = imread("image1.jpg", IMREAD_GRAYSCALE);Mat img2 = imread("image2.jpg", IMREAD_GRAYSCALE);Ptr<KAZE> kaze = KAZE::create();vector<KeyPoint> keypoints1, keypoints2;Mat descriptors1, descriptors2;kaze->detectAndCompute(img1, Mat(), keypoints1, descriptors1);kaze->detectAndCompute(img2, Mat(), keypoints2, descriptors2);// 进行特征点匹配BFMatcher matcher(NORM_L2);vector<DMatch> matches;matcher.match(descriptors1, descriptors2, matches);// 绘制匹配结果Mat img_matches;drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);imshow("Matches", img_matches);waitKey(0);return 0;
}

AKAZE (Accelerated-KAZE)

AKAZE是KAZE的改进版本,它在保持计算速度的同时,进一步提升了匹配的性能。AKAZE适用于对性能要求较高的实时应用场景。

#include <opencv2/opencv.hpp>using namespace cv;int main() {// 读取两张图像Mat image1 = imread("image1.jpg");Mat image2 = imread("image2.jpg");// 检查图像是否成功读取if (image1.empty() || image2.empty()) {std::cerr << "Error: Unable to load images." << std::endl;return -1;}// 创建 AKAZE 特征检测器Ptr<AKAZE> akaze = AKAZE::create();// 检测特征点和描述符std::vector<KeyPoint> keypoints1, keypoints2;Mat descriptors1, descriptors2;akaze->detectAndCompute(image1, noArray(), keypoints1, descriptors1);akaze->detectAndCompute(image2, noArray(), keypoints2, descriptors2);// 创建 BFMatcherBFMatcher matcher(NORM_HAMMING);// 在第一张图像中的每个特征点上寻找最佳匹配std::vector<DMatch> matches;matcher.match(descriptors1, descriptors2, matches);// 绘制匹配结果Mat img_matches;drawMatches(image1, keypoints1, image2, keypoints2, matches, img_matches);// 显示匹配结果imshow("Matches", img_matches);waitKey(0);return 0;
}

python 调用opencv 方法类似

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为数通HCIA ——企业网络架构以及产品线

一.学习目标&#xff1a;精讲网络技术&#xff0c;可以独立搭建和维护中小企业网络&#xff01; 模拟器&#xff08;华为方向请安装ENSP&#xff0c;Ensp-Lite已有安装包&#xff0c;号称功能更加完善-这意味着要耗费更多的系统资源但是仅对华为内部伙伴申请后方可使用&#x…

VS2022配置和搭建QT

一、下载QT 可以去QT官网下载:https://www.qt.io/product/development-tools。 直接安装。 二、安装qt插件 直接在vs插件市场搜索就行。 安装的时候根据提示&#xff0c;关闭vs自动安装 再次进去vs提示你选择qt版本&#xff0c;psth里边找到安装版本的qmake.exe就行 配…

卡尔曼滤波器(一):卡尔曼滤波器简介

观看MATLAB技术讲座笔记&#xff0c;该技术讲座视频来自bilibili账号&#xff1a;MATLAB中国。 一、什么是卡尔曼滤波器 卡尔曼滤波器是一种优化估计算法&#xff0c;是一种设计最优状态观测器的方法&#xff0c;其功能为&#xff1a; 估算只能被间接测量的变量&#xff1b;通…

https加密证书

网站要出去安全模式访问&#xff0c;加强网络安全就需要使用HTTPS加密证书。 本文主要介绍什么是HTTPS加密证书&#xff0c;如何申请HTTPS加密证书&#xff0c;如何安装HTTPS加密证书等问题展开讨论。 什么是HTTPS加密证书&#xff1f; HTTPS加密证书的行业产品用语叫作SSL证…

互联网大佬座位排排坐:马化腾第一,雷军第二

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 这是马化腾、雷军、张朝阳、周鸿祎的座位&#xff0c;我觉得是按照互联网地位排序的。 马化腾坐头把交椅&#xff0c;这个没毛病&#xff0c;有他在的地方&#xff0c;其他几位都得喊声“大哥”。雷军坐第二把交椅…

Go语言常见错误 | 工程组织不合理 (工程结构和包的组织)

编写程序的过程中,组织代码的方式,不仅影响到代码的质量,也决定了团队的协作效率。在使用Golang进行项目开发时,工程组织不合理(包括工程结构和包的组织)是个常见的问题。下文将详述这个问题,并提供改善的方案。 工程结构不合理 Golang项目的工程结构对于代码的模块性…

ApplicationListener监听器

在spring-context 5.3.26中来看一下它的定义&#xff1a; package org.springframework.context;import java.util.EventListener; import java.util.function.Consumer;FunctionalInterface public interface ApplicationListener<E extends ApplicationEvent> extends…

[论文笔记] megatron训练参数:dataloader_type

在深度学习中&#xff0c;dataloader_type参数通常控制着数据的加载、处理和输入到模型的方式。不同的dataloader可能会按照不同的策略处理数据集&#xff0c;这可以显著影响模型训练和评估的效果。具体来说&#xff0c;single和cyclic类型通常如此区别&#xff1a; Single Dat…

关键绩效指标(KPI):明确目标及跟踪进展

在企业管理中&#xff0c;关键绩效指标&#xff08;KPI&#xff09;是一种重要的工具&#xff0c;用于明确目标并跟踪进展。通过设定和监控这些指标&#xff0c;企业能够确保员工、团队和整个组织都朝着既定的目标努力。本文将详细探讨关键绩效指标的重要性、设定方法以及如何有…

缓解工作压力的小窍门:保持健康与创新

目录 1 前言2 工作与休息的平衡3 保持心理健康4 社交与网络建设5 结语 1 前言 作为程序员&#xff0c;我们常常承受着高度的工作压力和持续的创新挑战。为了保持高效和健康&#xff0c;我们需要采取一些方法来缓解工作压力&#xff0c;同时促进个人的心理和身体健康。 2 工作…

大模型的原理与特点,奇异值分解(SVD);低秩近似

目录 一、大模型的原理与特点 二、一个基本架构,三种形式: Parameter-Efficient Fine-Tuning

5. Tailwind CSS 响应式设计的实现

Tailwind CSS 是一个功能类优先的 CSS 框架&#xff0c;它允许开发者通过使用响应式工具类来构建自适应的用户界面。这些工具类可以在不同的断点处有条件地应用&#xff0c;使得在不离开 HTML 的情况下构建复杂的响应式界面变得轻而易举。 基本概念 响应式设计在 Tailwind CS…

Python dlib(HOG+SVM)人脸识别总结

Python dlib(HOG+SVM)人脸识别总结 面部标志检测 dlib 68点(HOG+SVM),194点人脸识别模型,包括口(外嘴唇,内嘴唇),鼻,眉毛(左右眉),眼睛(左右眼),下鄂 5点面部标志检测器(左眼2点,右眼2点,鼻子1点)面部对齐更高效 眨眼检测 ear 眨眼瞬间达到0 疲劳驾驶检测…

kill 端口所属进程

IC:\Users\23022>netstat -ano | findstr “8080” TCP 127.0.0.1:8080 0.0.0.0:0 LISTENING 13532 C:\Users\23022>taskkill /f /t /pid 13532 成功: 已终止 PID 21028 (属于 PID 13532 子进程)的进程。 成功: 已终止 PID 13532 (属于 PID 19260 子进程)的进程。 C:\U…

如何在PostgreSQL中设置自动清理过期数据的策略

文章目录 方法一&#xff1a;使用临时表和定期清理步骤&#xff1a;示例代码&#xff1a;创建临时表&#xff1a;定期清理脚本&#xff08;bash psql&#xff09;&#xff1a; 方法二&#xff1a;使用分区表和定期清理步骤&#xff1a;示例代码&#xff1a;创建分区表&#xf…

初始化Git仓库时应该运行哪个命令?

文章目录 初始化Git仓库时&#xff0c;你应该运行git init这个命令。这个命令的作用是在你当前所在的目录里创建一个新的Git仓库。这样&#xff0c;你就可以在这个目录里开始使用Git来管理你的文件了。 下面我给你举个详细的例子来说明一下&#xff1a; 首先&#xff0c;你需要…

【Mysql】用frm和ibd文件恢复mysql表数据

问题 总是遇到mysql服务意外断开之后导致mysql服务无法正常运行的情况&#xff0c;使用Navicat工具查看能够看到里面的库和表&#xff0c;但是无法获取数据记录&#xff0c;提示数据表不存在。 这里记录一下用frm文件和ibd文件手动恢复数据表的过程。 思路 1、frm文件&…

c++ 派生类向基类转换的可访问性

1.如果派生类以public继承基类&#xff0c;则是is a关系&#xff0c;用派生类可以完成基类的所有功能&#xff0c;所以可以在任意地方将派生类自动转换成基类&#xff0c;注意&#xff0c;这里都是指指针或引用&#xff0c;而不是对象。 比如&#xff1a; class A{}&#xff1…

【代码】Python3|用Python PIL压缩图片至指定大小,并且不自动旋转

代码主体是GPT帮我写的&#xff0c;我觉得这个功能非常实用。 解决自动旋转问题参考&#xff1a;一行代码解决PIL/OpenCV读取图片出现自动旋转的问题&#xff0c;增加一行代码image ImageOps.exif_transpose(image) 即可恢复正常角度。 from PIL import Image, ImageOpsdef …

call,apply,bind

入参 call: 参数数量不固定。第一个参数指定了函数体内的this指向&#xff0c;从第二个参数开始往后&#xff0c;每个参数被依次传入函数。 apply: 接受两个参数。第一个参数指定了函数体内的this指向。第二个参数接受一个数组 [1,2]&#xff0c;但函数拿到的是解构后的入参 1…