OpenCV旋转估计(3)帮助构建一个最大生成树(Maximum Spanning Tree)函数findMaxSpanningTree()

news/2025/3/26 18:29:57/
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::detail::findMaxSpanningTree 是 OpenCV 中用于图像拼接工作流的一个函数,它帮助构建一个最大生成树(Maximum Spanning Tree),这在图像拼接中用于确定图像之间的最佳连接方式。这个函数特别适用于处理多个图像间的匹配信息,并基于这些信息来构建一个图结构,从而为后续的图像拼接步骤提供基础。

函数原型

void cv::detail::findMaxSpanningTree 	
(int  	num_images,const std::vector< MatchesInfo > &  	pairwise_matches,Graph &  	span_tree,std::vector< int > &  	centers ) 	

参数

  • num_images: 图像的数量。
  • pairwise_matches: 包含每对图像之间匹配信息的向量。每个 MatchesInfo 结构体包含了两个图像之间的匹配点、置信度等信息。
  • span_tree: 输出参数,表示由函数计算得到的最大生成树。这个图结构描述了如何以最优的方式将所有图像连接起来。
  • centers: 输出参数,包含可能作为拼接中心的图像索引列表。在全景拼接中,通常选择一个或几个中心图像来开始拼接过程。

代码示例

#include <opencv2/opencv.hpp>
#include <opencv2/stitching/detail/matchers.hpp>
#include <opencv2/stitching/detail/util.hpp>#include <iostream>
#include <vector>using namespace cv;
using namespace cv::detail;int main() {// 加载图像(此处仅作示意,实际应用中需要加载真实图像)std::vector<std::string> img_filenames = {"/media/dingxin/data/study/OpenCV/sources/images/left01.jpg","/media/dingxin/data/study/OpenCV/sources/images/right01.jpg","/media/dingxin/data/study/OpenCV/sources/images/right01.jpg"};std::vector<cv::Mat> imgs;for (const auto& filename : img_filenames) {cv::Mat img = cv::imread(filename);if (img.empty()) {std::cerr << "无法加载图像: " << filename << std::endl;return -1;}imgs.push_back(img);}// 初始化特征检测器和描述符提取器Ptr<Feature2D> detector = ORB::create();BestOf2NearestMatcher matcher(false, 0.3f);// 计算每张图像的特征点std::vector<ImageFeatures> features(imgs.size());for (size_t i = 0; i < imgs.size(); ++i) {detector->detectAndCompute(imgs[i], Mat(), features[i].keypoints, features[i].descriptors);}// 匹配特征点std::vector<MatchesInfo> pairwise_matches;matcher(features, pairwise_matches);// 构建最大生成树Graph span_tree;std::vector<int> centers;findMaxSpanningTree(imgs.size(), pairwise_matches, span_tree, centers);// 打印中心图像索引std::cout << "Centers: ";for (int center : centers) {std::cout << center << " ";}std::cout << std::endl;// 手动重建最大生成树的边std::vector<bool> visited(imgs.size(), false);for (int center : centers) {std::cout << "Starting from center: " << center << std::endl;visited[center] = true;for (size_t i = 0; i < pairwise_matches.size(); ++i) {const MatchesInfo& match_info = pairwise_matches[i];if (match_info.confidence > 0 && !visited[match_info.src_img_idx] && !visited[match_info.dst_img_idx]) {std::cout << "(" << match_info.src_img_idx << ", " << match_info.dst_img_idx << ")" << std::endl;visited[match_info.src_img_idx] = true;visited[match_info.dst_img_idx] = true;}}}return 0;
}

运行结果

Centers: 2 
Starting from center: 2
(0, 1)

http://www.ppmy.cn/news/1582776.html

相关文章

【Centos7搭建Zabbix4.x监控HCL模拟网络设备:zabbix-server搭建及监控基础05

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 5.zabbix监控HCL模拟网络设备 在保证zabbix-server与HCL网络相通的情况下进行如下操作。 5.1创建主机群 配置-主机群-创建主机群 图 19 取名&#xff0c;添加。 图 20 5.2 创建监控…

国内首家,百度智能云千帆AppBuilder全面兼容MCP协议

百度智能云千帆 AppBuilder 已兼容 MCP 协议&#xff01;作为国内首家支持 MCP 协议的大模型应用开发平台&#xff08;Claude、LangGraph、Cursor、Cline、N8N等海外平台已支持&#xff09;&#xff0c;千帆 AppBuilder 完成兼容后&#xff0c;用户可通过千帆 AppBuilder 轻松调…

游戏引擎学习第178天

回顾和今天的计划 我们正在进行一场直播游戏开发&#xff0c;完全不使用任何引擎或库&#xff0c;所有的代码都由我们自己编写&#xff0c;甚至不调用 GPU。如果你能相信的话。现在&#xff0c;我们正处在调试代码的阶段&#xff0c;决定开始开发一些不错的调试工具&#xff0…

React + Node.js实践 仿B站评论

仿B站评论 效果展示Node.js后端实现模拟网络请求静态结构效果展示代码部分 tab切换排序功能的实现按照热度排序按照时间排序 删除评论功能发布评论功能组件的封装完整代码App.js后端server.js 效果展示 Node.js后端实现模拟网络请求 采用了Express框架来构建服务器&#xff0c…

LeetCode热题100_移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 /** 移动零* 非0左移&#xff0c;最后补0* *//*public void moveZeroes(int[] nums) {int …

【mysql】唯一性约束unique

文章目录 唯一性约束 1. 作用2. 关键字3. 特点4. 添加唯一约束5. 关于复合唯一约束 唯一性约束 1. 作用 用来限制某个字段/某列的值不能重复。 2. 关键字 UNIQUE3. 特点 同一个表可以有多个唯一约束。唯一约束可以是某一个列的值唯一&#xff0c;也可以多个列组合的值唯…

MySQL自动化配置工具开发:探索如何用脚本实现MySQL一键安装与配置,提升运维效率

引言 MySQL作为最流行的开源关系型数据库之一,广泛应用于各类业务场景。然而,手动安装和配置MySQL不仅耗时,还容易出错。为了提高运维效率,开发一款MySQL自动化配置工具显得尤为重要。本文将探索如何通过脚本实现MySQL的一键安装与配置,并提供具体的配置脚本文档和关键参…

使用LLM自动化生成微电网Simulink模型

&#x1f680; 使用LLM自动化生成微电网Simulink模型&#xff01;⚡ 在构建微电网仿真模型时&#xff0c;我们通常需要手动拖拽模块、设置参数&#xff0c;耗费大量时间。现在&#xff0c;通过结合LLM&#xff08;如 GPT-4&#xff09;与 MATLAB 脚本&#xff0c;我们可以自动…