【opencv】教程代码 —features2D(8)AKAZE 特征点匹配和图像拼接
graf1.png
graf3.png
<?xml version="1.0"?>
<opencv_storage>
<H13 type_id="opencv-matrix"><rows>3</rows><cols>3</cols><dt>d</dt><data>7.6285898e-01 -2.9922929e-01 2.2567123e+023.3443473e-01 1.0143901e+00 -7.6999973e+013.4663091e-04 -1.4364524e-05 1.0000000e+00 </data></H13>
</opencv_storage>
H1to3p.xml
AKAZE_match.cpp 特征点匹配和图像拼接
此代码为功能强大的特征点匹配和图像拼接程序,主要使用OPENCV库的AKAZE算法。流程如下:
读取两张图片及齐次图矩阵。
利用AKAZE算法提取图像的特征点和描述子。
使用Brute-Force匹配器,对两组描述子执行近邻搜索,找出最佳匹配对。
进行比率测试来剔除不良匹配。
利用齐次图矩阵验证匹配点,筛选出内点。
我们对之前通过比例测试找到的匹配点对进行进一步的同质性检查,通过计算变换后的点与原始匹配点之间的欧氏距离来评估匹配质量。如果点对对应的变换后的距离小于设定的内点阈值,这对点匹配就被认定为好的匹配,并分别添加到内点向量
inliers1
、inliers2
和良好匹配向量good_matches
中。最终,good_matches
中包含了所有通过同质性检查的内点匹配对,可以用于后续绘制匹配结果或其他处理。绘制和保存匹配点的结果图片。
打印关于匹配的统计信息,并显示结果。
整个代码实现的是对两张图片进行特征点匹配,并通过一定的筛选条件去除错误的匹配点,最后绘制出内点并计算内点比例。
#include <opencv2/features2d.hpp> // 引入OpenCV特征检测相关头文件
#include <opencv2/imgproc.hpp> // 引入OpenCV图像处理相关头文件
#include <opencv2/highgui.hpp> // 引入OpenCV高级GUI(图形用户界面)相关头文件
#include <iostream> // 引入输入输出流头文件using namespace std; // 使用标准命名空间
using namespace cv; // 使用OpenCV命名空间const float inlier_threshold = 2.5f; // 设置内点距离阈值,用于同质性检查识别内点
const float nn_match_ratio = 0.8f; // 设置最近邻匹配比例int main(int argc, char* argv[])
{//! [load]// 解析命令行参数CommandLineParser parser(argc, argv,"{@img1 | graf1.png | input image 1}""{@img2 | graf3.png | input image 2}""{@homography | H1to3p.xml | homography matrix}");// 读取图片1,以灰度模式Mat img1 = imread( samples::findFile( parser.get<String>("@img1") ), IMREAD_GRAYSCALE);// 读取图片2,以灰度模式Mat img2 = imread( samples::findFile( parser.get<String>("@img2") ), IMREAD_GRAYSCALE);// 读取同质性矩阵Mat homography;FileStorage fs( samples::findFile( parser.get<String>("@homography") ), FileStorage::READ);fs.getFirstTopLevelNode() >> homography;//! [load]//! [AKAZE]// 初始化特征点向量和描述符矩阵vector<KeyPoint> kpts1, kpts2;Mat desc1, desc2;// 创建AKAZE特征检测器Ptr<AKAZE> akaze = AKAZE::create();// 对img1进行特征检测和描述符计算akaze->detectAndCompute(img1, noArray(), kpts1, desc1);// 对img2进行特征检测和描述符计算akaze->detectAndCompute(img2, noArray(), kpts2, desc2);//! [AKAZE]//! [2-nn matching]// 创建BFMatcher,用于特征匹配BFMatcher matcher(NORM_HAMMING);vector< vector<DMatch> > nn_matches;// 执行2近邻匹配matcher.knnMatch(desc1, desc2, nn_matches, 2);//! [2-nn matching]//! [ratio test filtering]// 初始化过滤后的匹配特征点向量vector<KeyPoint> matched1, matched2;// 过滤不符合比例测试的匹配for(size_t i = 0; i < nn_matches.size(); i++) {DMatch first = nn_matches[i][0];float dist1 = nn_matches[i][0].distance;float dist2 = nn_matches[i][1].distance;// 如果第一个距离小于第二个距离乘以设定的比例,则认为是好的匹配if(dist1 < nn_match_ratio * dist2) {matched1.push_back(kpts1[first.queryIdx]);matched2.push_back(kpts2[first.trainIdx]);}}//! [ratio test filtering]//! [homography check]vector<DMatch> good_matches; // 初始化一个DMatch向量,用于存储良好匹配对vector<KeyPoint> inliers1, inliers2; // 初始化两个KeyPoint向量,用于存储一致性检查后的内点匹配// 遍历所有已匹配的特征点对for(size_t i = 0; i < matched1.size(); i++) {Mat col = Mat::ones(3, 1, CV_64F); // 创建一个三行一列的矩阵,初始化为1,用于齐次坐标表示col.at<double>(0) = matched1[i].pt.x; // 设置矩阵的第一个元素为当前匹配对的第一个点的x坐标col.at<double>(1) = matched1[i].pt.y; // 设置矩阵的第二个元素为当前匹配对的第一个点的y坐标col = homography * col; // 通过同质性矩阵变换第一个点的坐标col /= col.at<double>(2); // 使变换后的坐标成为非齐次坐标// 计算两个匹配点之间的欧氏距离double dist = sqrt( pow(col.at<double>(0) - matched2[i].pt.x, 2) +pow(col.at<double>(1) - matched2[i].pt.y, 2));// 如果距离小于内点阈值,则认为这个匹配是好的内点匹配if(dist < inlier_threshold) {int new_i = static_cast<int>(inliers1.size()); // 计算当前内点的索引inliers1.push_back(matched1[i]); // 将第一个点添加到内点集中inliers2.push_back(matched2[i]); // 将第二个点添加到内点集中good_matches.push_back(DMatch(new_i, new_i, 0)); // 将这对内点添加到良好匹配向量中}}//! [homography check]//! [draw final matches]// 初始化结果图像Mat res;// 绘制好的匹配点对drawMatches(img1, inliers1, img2, inliers2, good_matches, res);// 保存结果图像imwrite("akaze_result.png", res);// 计算内点比率double inlier_ratio = inliers1.size() / (double) matched1.size();// 输出统计结果cout << "A-KAZE Matching Results" << endl;cout << "*******************************" << endl;cout << "# Keypoints 1: \t" << kpts1.size() << endl;cout << "# Keypoints 2: \t" << kpts2.size() << endl;cout << "# Matches: \t" << matched1.size() << endl;cout << "# Inliers: \t" << inliers1.size() << endl;cout << "# Inliers Ratio: \t" << inlier_ratio << endl;cout << endl;// 显示结果图像imshow("result", res);// 等待用户响应waitKey();//! [draw final matches]return 0;
}
终端输出:
A-KAZE Matching Results
*******************************
# Keypoints 1: 2418
# Keypoints 2: 2884
# Matches: 382
# Inliers: 267
# Inliers Ratio: 0.698953
相关文章:
【opencv】教程代码 —features2D(8)AKAZE 特征点匹配和图像拼接
graf1.png graf3.png <?xml version"1.0"?> <opencv_storage> <H13 type_id"opencv-matrix"><rows>3</rows><cols>3</cols><dt>d</dt><data>7.6285898e-01 -2.9922929e-01 2.2567123e02…...
ssm基于springboot的数字家庭亲子视频分享网站java+vue
本网站的模块主要分为前台展示模块和后台管理模块。 前台展示模块功能如下: 1)家庭照片模块 主要功能是对家庭照片的分类显示,如旅游、运动、生活、工作、学习等,每一类中的照片按时间轴展示出来。 2)家庭亲子视频模块…...
产品经理功法修炼(1)之自我管理
点击下载《产品经理功法修炼(1)之自我管理》 1. 前言 产品经理的能力修炼并非局限于某一技能的速成,而是需要全面参与到产品的整个生命周期中,通过不断的实践来逐步提升自己的各项能力。尽管在企业的日常运作中,我们不可能身兼数职去扮演每一个角色,但作为产品的核心负…...
2024年04月IDE流行度最新排名
点击查看最新IDE流行度最新排名(每月更新) 2024年04月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多,这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…...
17.应用负载压力测试
早些点,下午题考,最近几年出现的少; 备考较为简单;历年真题相似度高; 主要议题: 1.负载压力测试概述 注意这些测试细微的差别; 负载测试和压力测试的方法比较相似,但是目的不同&a…...
Gauss到底是不是国产数据库
华为GaussDB数据库深度解析 引言 在数字化转型的浪潮中,数据成为企业最宝贵的资产之一。如何高效地管理和利用这些数据,成为企业面临的一大挑战。数据库作为数据存储和管理的核心系统,其性能、安全性、可用性和扩展性等特性直接影响到企业的…...
spark sql执行引擎原理及配置
如果我们想要给上层开发人员配置好一个统一的sql开发界面,让他们统一通过sql开发即可,可通过spark中的thriftserver服务实现,与hive中的thriftserver类似,配置好该服务后,上层通过db client或者代码中通过jdbc连接即可…...
【C语言基础】:自定义类型(二) -->联合和枚举
文章目录 一、联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算1.5 联合体练习 二、枚举类型2.1 枚举类型的声明2.2 枚举的优点 书山有路勤为径,学海无涯苦作舟。 创作不易,宝子们!如果这篇…...
【授时防火墙】GPS北斗卫星授时信号安全防护装置系统
【授时防火墙】GPS北斗卫星授时信号安全防护装置系统 【授时防火墙】GPS北斗卫星授时信号安全防护装置系统 1、装置概述 卫星信号安全防护装置(以下简称“防护装置”)是一款专门针对卫星导航授时安全的设备。该设备能接收 BD 系统和 GPS 系统卫星信号&am…...
关于 MySQL 优化(详解)
文章目录 关于 MySQL 优化一、硬件方面的优化1、关于 CPU2、关于内存3、关于磁盘 二、MySQL 配置文件1、 default-time-zone8:002、interactive_timeout 1203、wait_timeout 1204、open_files_limit 102405、group_concat_max_len 1024006、usermysql7、character-set-serv…...
Hive详解(5)
Hive 窗口函数 案例 需求:连续三天登陆的用户数据 步骤: -- 建表 create table logins (username string,log_date string ) row format delimited fields terminated by ; -- 加载数据 load data local inpath /opt/hive_data/login into table log…...
阿里云效codeup如何执行github flow工作流
在阿里云效中执行 GitHub 工作流,实质上是在使用 Git 进行版本控制的过程中遵循 GitHub Flow 的原则。GitHub Flow 是一种简洁高效的工作流程,特别适用于追求快速迭代的团队。下面是在阿里云效中执行 GitHub 工作流的基本步骤: 1. 准备工作 …...
node.js的模块化 与 CommonJS规范
一、node.js的模块化 (1)什么是模块化? 将一个复杂的程序文件依据一定的规则拆分成为多个文件的过程就是模块化 在node.js中,模块化是指把一个大文件拆分成独立并且相互依赖的多个小模块,将每个js文件被认为单独的一个模块;模块…...
RK3588平台开发系列讲解(PWM开发篇)
目录 前⾔ 驱动文件 DTS 节点配置 PWM 流程 PWM 使⽤ 常⻅问题 PWM 在 U-Boot 与 kernel 之间的衔接问题 PWM Regulator 时 PWM pin 脚上下拉配置问题 前⾔ 脉宽调制( PWM , Pulse Width Modulation )功能在嵌⼊式系统中是⾮常常⻅的…...
宝塔面板操作一个服务器域名部署多个网站
此处记录IP一样,端口不一样的操作方式: 宝塔面板操作: 1、创建第一个网站: 网站名用IP地址,默认80端口。 创建好后,直接IP访问就可以了。看到自带的默认首页 2、接下来部署第二个网站: 仍然是…...
surfer绘制等值线图
surfer介绍 Surfer软件,是美国Golden Software公司编制的一款以画三维图的软件。该软件具有强大的插值功能和绘制图件能力,可用来处理XYZ数据,是地质工作者常用的专业成图软件(来源于百度百科)。 surfer可以用来绘制…...
免费开源的 AI 绘图工具 ImgPilot
免费开源的 AI 绘图工具 ImgPilot 分类 开源分享 项目名: ImgPilot -- 通过提示词及涂鸦生成图片 Github 开源地址: GitHub - leptonai/imgpilot: Turn the draft into amazing artwork with the power of Real-Time Latent Consistency Model 在线地址ÿ…...
Java系统架构设计:构建稳定高效的软件基石
在当今数字化时代,软件系统的稳定性、可扩展性和性能至关重要。Java作为一种广泛应用的编程语言,其系统架构设计对于软件的成功实施具有决定性的影响。本文将探讨Java系统架构设计的重要性以及设计过程中的关键要素。 首先,Java系统架构设计…...
【IntermLM2】学习笔记
微调方式 在大模型的下游应用中,可以有两种微调方式 增量续训 即无监督的方式,让模型学习一些新知识,比如某些垂直领域的新知识 使用的数据有:书籍,文章,代码等有监督微调 为了让模型学会理解指令进行对话…...
【二叉树】Leetcode 230. 二叉搜索树中第K小的元素【中等】
二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。 示例1: 输入:root [3,1,4,null,2], k 1 输出:1 解…...
JS中常用的几种事件
在js中分为多种事件,比如点击事件,焦点事件,加载事件,鼠标事件等等... ... 点击事件 onclick点击事件,ondblclick双击事件 焦点事件 onblur元素失去焦点,onfocus元素获取焦点 加载事件 onload一个页面…...
Android WebView的使用与后退键处理
目录 前言首先,我们需要在布局文件中添加webView组件在Activity中获取webView实例,并加载网页内容 前言 webView是Android中常用的组件之一,用于展示网页内容。它可以加载HTML文件、URL链接等网页内容,并提供交互功能。在使用webV…...
【备忘录】Docker 2375远程端口安全漏洞解决
最近为了项目需要,把docker 的远程端口2375 给开放了。不出意外出意外了。没多久,网站报流量告警,第一反应就是开放2375这个端口问题导致,毫不迟疑直接切换服务器。关闭该台服务器的docker服务,并逐步清理掉挖矿进程&a…...
343. 整数拆分(力扣LeetCode)
文章目录 343. 整数拆分题目描述动态规划 343. 整数拆分 题目描述 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释:…...
Spring面试题系列-3
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。 Spring的属性…...
【比特币】比特币的奥秘、禁令的深层逻辑与风云变幻
导语: 比特币(Bitcoin),这个充满神秘色彩的数字货币,自诞生以来便成为各界瞩目的焦点。它背后所蕴含的Mining机制、禁令背后的深层逻辑以及市场的风云变幻,都让人欲罢不能。今天,我们将深入挖掘比特币的每一个角落&…...
【情感分析概述】
文章目录 一、情感极性分析概述1. 定义2. 情感极性的类别3. 应用场景 二、情感极性分析的技术方法1. 基于规则的方法a. 关键词打分b. 情感词典的使用 2. 基于机器学习的方法a. 监督学习方法b. 深度学习方法 三、Python进行情感极性分析 一、情感极性分析概述 情感极性分析&…...
【御控物联】JavaScript JSON结构转换(12):对象To数组——键值互换属性重组
文章目录 一、JSON结构转换是什么?二、核心构件之转换映射三、案例之《JSON对象 To JSON数组》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换…...
5.6 物联网RK3399项目开发实录-Android开发之U-Boot 编译及使用(wulianjishu666)
物联网入门到项目实干案例下载: https://pan.baidu.com/s/1fHRxXBqRKTPvXKFOQsP80Q?pwdh5ug --------------------------------------------------------------------------------------------------------------------------------- U-Boot 使用 前言 RK U-B…...
Python版【植物大战僵尸 +源码】
文章目录 写在前面:功能实现环境要求怎么玩个性化定义项目演示:源码分享Map地图:Menubar.py主菜单 主函数:项目开源地址 写在前面: 今天给大家推荐一个Gtihub开源项目:PythonPlantsVsZombies,翻译成中就是…...
前端一个页面多少钱/抖音seo是什么
1.df 列出文件系统的整体磁盘使用量(7.2.1)参数:-m 以MB容量显示-k 以KB容量显示-h 以人们交易阅读的GB,MB,KB等格式显示-H 以M1000K 取代M1024K的方式显示2.du 列出当前目录下的所有目录的容量(不显示文件,只显示目录,要显式文件夹-a)参数&a…...
网站建设布吉/尚硅谷培训机构官网
转: http://developer.51cto.com/art/201211/364737.htm AD:2013大数据全球技术峰会课程PPT下载 在我多年的 Python 编程经历以及在 Github 上的探索漫游过程中,我发掘到一些很不错的 Python 开发包,这些包大大简化了开发过程&…...
wordpress后台链接/台州网络推广
EasyNVS云管理平台是EasyNVR的管理平台,可以远程控制与管理多台EasyNVR,它可以将分布在不同区域和网络环境下的多套EasyNVR设备,进行统一的接口登记和管理,借助云端宽带资源解决单路设备在云直播中多路分发观看所需的上行宽带问题…...
做网站协调/友情链接
HTML与CSS二三事概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器 ...Tomcat 的三种(bio,nio.apr) 高级 Connec…...
中堂镇做网站/网站优化关键词公司
前言 目前正在自学C语言,看的教材是清华大学出版社出版的C语言入门经典(第5版),由Ivor Horton 著,杨浩 译。在编辑并编译第74页的练习题4时报了如下的错误: 解决方法: 后经网上查…...
承包装修工程平台/seo排名技术软件
展开全部一 setuptools 和easy_installsetuptools:setuptools 是一组由PEAK(Python Enterprise Application Kit)开发的Python 的 distutils 工具的增强工具,32313133353236313431303231363533e78988e69d8331333337373730可以让程序员更方便的创建和发布Python的egg…...