OpenCV图像拼接(3)图像拼接类cv::detail::MultiBandBlender

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::detail::MultiBandBlender 是 OpenCV 中用于图像拼接(stitching)模块的一个类,主要用于将多张重叠的图像无缝地融合成一张全景图。它实现了多频带融合算法,通过分解图像的频率成分来实现平滑的过渡效果。

主要功能与概念

  • 多频带融合(Multi-Band Blending)
    该算法将图像分解为多个频率带(使用高斯金字塔和拉普拉斯金字塔)。
    对每个频率带分别进行融合,然后重新组合成最终图像。
    这种方法可以有效减少拼接区域的可见接缝,并处理亮度差异。

  • 融合流程
    准备输入图像及其掩码。
    将图像和掩码送入融合器。
    执行融合并生成最终结果。

常用成员函数

  1. 构造函数
cv::detail::MultiBandBlender(bool try_gpu = false);
  • 参数:
    try_gpu: 如果为 true,尝试使用 GPU 加速(如果可用)。默认值为 false。
  1. 准备函数
void prepare(cv::Rect dst_roi);
  • 用途: 初始化融合器,设置目标图像的感兴趣区域(ROI)。
  • 参数:
    dst_roi: 目标图像中需要融合的区域。
  1. 添加图像
void feed(const cv::Mat& img, const cv::Mat& mask, cv::Point tl);
  • 用途: 向融合器中添加图像及其掩码。
  • 参数:
    img: 输入图像。
    mask: 图像的有效区域掩码。
    tl: 图像在最终全景图中的左上角位置。
  1. 执行融合
void blend(cv::Mat& dst, cv::Mat& dst_mask);
  • 用途: 执行实际的融合操作,并输出结果。
  • 参数:
    dst: 输出的融合图像。
    dst_mask: 输出的融合掩码。

代码示例

#include <opencv2/opencv.hpp>
#include <opencv2/stitching/detail/blenders.hpp>int main()
{// 创建 MultiBandBlender 对象cv::Ptr< cv::detail::MultiBandBlender > blender = cv::makePtr< cv::detail::MultiBandBlender >();// 加载图像cv::Mat img1 = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/stich1.png" );cv::Mat img2 = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/stich2.png" );if ( img1.empty() || img2.empty() ){std::cerr << "Error: Failed to load images!" << std::endl;return -1;}// 调试:单独显示原始图像cv::imshow( "Image1", img1 );cv::imshow( "Image2", img2 );// 确保为三通道if ( img1.channels() != 3 ){cv::cvtColor( img1, img1, cv::COLOR_GRAY2BGR );}if ( img2.channels() != 3 ){cv::cvtColor( img2, img2, cv::COLOR_GRAY2BGR );}// 创建掩码cv::Mat mask1 = cv::Mat::ones( img1.size(), CV_8UC1 ) * 255;cv::Mat mask2 = cv::Mat::ones( img2.size(), CV_8UC1 ) * 255;// 设置ROI(假设两图水平拼接)int roi_width  = img1.cols + img2.cols;int roi_height = std::max( img1.rows, img2.rows );cv::Rect roi( 0, 0, roi_width, roi_height );blender->prepare( roi );// 输入图像到融合器blender->feed( img1, mask1, cv::Point( 0, 0 ) );          // 左图blender->feed( img2, mask2, cv::Point( img1.cols, 0 ) );  // 右图// 融合cv::Mat result, result_mask;blender->blend( result, result_mask );// 处理结果if ( result.empty() ){std::cerr << "Error: Blending failed!" << std::endl;return -1;}if ( result.depth() == CV_32F ){result.convertTo( result, CV_8UC3, 255.0 );  // 转为8位三通道}// 显示和保存cv::imwrite( "panorama2.jpg", result );cv::Mat result_8u;result.convertTo( result_8u, CV_8U );  // 转换为 8 位无符号整型‌:ml-citation{ref="3,8" data="citationList"}cv::imshow( "全景图", result_8u );cv::waitKey( 0 );  // 必须调用!return 0;
}

运行结果

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

王者荣耀服务器突然崩了

就在刚刚王者荣耀服务器突然崩了 #王者荣耀崩了#的话题毫无预兆地冲上热搜&#xff0c;许多玩家发现游戏登录界面反复弹出异常提示&#xff0c;匹配成功后卡在加载界面&#xff0c;甚至出现对局数据丢失的情况。根据官方公告&#xff0c;目前技术团队已在全力抢修服务器 #王者…

【JavaScript】JavaScript Promises实践指南

【JavaScript】JavaScript Promises实践指南 你了解JavaScript中的Promises吗&#xff1f;这是一个很多人一开始就放弃的主题&#xff0c;但我会尽量让它变得尽可能简单。 1. “Promise”到底是什么&#xff1f; “Promise”是异步编程中的一个基本概念&#xff0c;特别是在J…

计算机视觉总结

以下是针对上述问题的详细解答,并结合代码示例进行说明: 1. 改进YOLOv5人脸检测模块,复杂光照场景准确率从98.2%提升至99.5% 优化具体过程: 光照补偿:在数据预处理阶段,采用自适应光照补偿算法,对图像进行实时增强,以减少光照变化对人脸检测的影响。数据增强:在训练…

ExpTimerApcRoutine函数分析之作用是ActiveTimerListHead里面移除定时器_etimer

第一部分&#xff1a; VOID ExpTimerApcRoutine ( IN PKAPC Apc, IN PKNORMAL_ROUTINE *NormalRoutine, IN PVOID *NormalContext, IN PVOID *SystemArgument1, IN PVOID *SystemArgument2 ) /* Routine Description: This function is the special …

算法分析与设计 专题三

目录 一、实验目的 二、实验内容 三、问题分析与求解 四、AC源代码、截图 五、实验小结 一、实验目的 1、了解贪心算法的分析过程&#xff0c;学会用贪心算法解决一些具体的问题。 2、了解广度优先算法和深度优先算法。 二、实验内容 1992 当然&#xff0c;我们的收藏中…

1688商品详情接口:深度解析与应用实践

在电商领域&#xff0c;1688作为中国领先的B2B平台&#xff0c;拥有海量的商品信息。对于开发者、商家和数据分析师来说&#xff0c;获取1688商品的详细信息是实现数据分析、竞品研究、自动化管理和精准营销的重要手段。本文将详细介绍1688商品详情接口的使用方法、技术细节以及…

每日算法-250328

记录今天学习和解决的LeetCode算法题。 92. 反转链表 II 题目 思路 本题要求反转链表中从 left 到 right 位置的节点。我们可以采用 头插法 的思路来反转指定区间的链表。 具体来说&#xff0c;我们首先定位到 left 位置节点的前一个节点 prev。然后&#xff0c;从 left 位置…

C语言中的位域:节省内存的标志位管理技术

位域&#xff08;Bit-field&#xff09; 是 C 语言中的一种特性&#xff0c;允许在结构体&#xff08;struct&#xff09;中定义占用特定位数的成员变量。通过位域&#xff0c;可以更精细地控制内存的使用&#xff0c;尤其是在需要存储多个布尔值或小范围整数时&#xff0c;可以…

【AI编程学习之Python】第一天:Python的介绍

Python介绍 简介 Python是一种解释型、面向对象的语言。由吉多范罗苏姆(Guido van Rossum)于1989年发明,1991年正式公布。官网:www.python.org Python单词是"大蟒蛇”的意思。但是龟叔不是喜欢蟒蛇才起这个名字,而是正在追剧:英国电视喜剧片《蒙提派森的飞行马戏团》(Mo…

【openstack系列】虚拟化技术

OpenStack 是一个开源的云计算管理平台,它本身并不直接提供虚拟化技术,而是通过集成不同的虚拟化解决方案来管理和编排计算、存储和网络资源。OpenStack 的核心优势在于其灵活性和可扩展性,支持多种虚拟化技术(Hypervisor),使企业可以根据需求选择合适的底层虚拟化方案。…

保姆级教程:Vue3 + Django + MySQL 前后端联调(PyCharm+VSCode版)

一、环境准备与验证 这里为减少篇幅&#xff0c;默认大家都安装好了这些软件。不会下载安装的&#xff0c;教程也很多&#xff0c;这里不再做赘述。话不多说&#xff0c;咱们开始&#xff1a; 1. 安装验证 确保已安装以下软件并验证版本&#xff1a; # 验证Node.js node -v…

Spring Data审计利器:@LastModifiedDate详解!!!

&#x1f552; Spring Data审计利器&#xff1a;LastModifiedDate详解&#x1f525; &#x1f31f; 简介 在数据驱动的应用中&#xff0c;记录数据的最后修改时间是常见需求。Spring Data的LastModifiedDate注解让这一过程自动化成为可能&#xff01;本篇带你掌握它的核心用法…

洛谷题单1-P1001 A+B Problem-python-流程图重构

题目描述 输入两个整数 a,b&#xff0c;输出它们的和&#xff08;∣a∣,∣b∣≤109&#xff09;。 输入格式 两个以空格分开的整数。 输出格式 一个整数。 输入输出样例 输入 20 30输出 50方式-print class Solution:staticmethoddef oi_input():"""从…

CCF CSP 第33次(2024.03)(2_相似度计算_C++)(字符串中字母大小写转换+哈希集合)

CCF CSP 第33次&#xff08;2024.03&#xff09;&#xff08;2_相似度计算_C&#xff09; 题目背景&#xff1a;题目描述&#xff1a;输入格式&#xff1a;输出格式&#xff1a;样例1输入&#xff1a;样例1输出&#xff1a;样例1解释&#xff1a;样例2输入&#xff1a;样例2输出…

Windows .gitignore文件不生效的情况排查

概述 今天下班在家里捣腾自己的代码&#xff0c;在配置.gitignore文件忽略部分文件的时候&#xff0c;发现死活不生效 问题根源 经过一通分析和排查才发现&#xff0c;是.gitignore文件的编码错了&#xff0c;刚开始还没注意到&#xff0c;因为是在Windows下开发&#xff0c…

Uniapp自定义TabBar组件全封装实践与疑难问题解决方案

前言 在当前公司小程序项目中&#xff0c;我们遇到了一个具有挑战性的需求&#xff1a;根据不同用户身份动态展示差异化的底部导航栏&#xff08;TabBar&#xff09; 。这种多角色场景下的UI适配需求&#xff0c;在提升用户体验和实现精细化运营方面具有重要意义。 在技术调研…

四川省汽车加气站操作工备考题库及答案分享

1.按压力容器的设计压力分为&#xff08; &#xff09;个压力等级。 A. 三 B. 四 C. 五 D. 六 答案&#xff1a;B。解析&#xff1a;按压力容器的设计压力分为低压、中压、高压、超高压四个压力等级。 2.缓冲罐的安装位置在天然气压缩机&#xff08; &#xff09;。 A. 出口处 …

2025年- G27-Lc101-542. 01 矩阵--java版

1.题目描述 2.思路 总结&#xff1a;用广度优先搜索&#xff0c;首先要确定0的位置&#xff0c;不为0的位置&#xff0c;我们要更新的它的值&#xff0c;只能往上下左右寻找跟它最近的0的位置。 解题思路 我们用 BFS&#xff08;广度优先搜索&#xff09;求解&#xff0c;因为 …

CANopen基本理论

目录 一、CANopen简介 二、OD对象字典 2.1 OD对象字典简介 2.2 CANopen预定义连接集 三、PDO过程数据对象 四、SDO过程数据对象 五、特殊协议 5.1 同步协议 5.2 时间戳协议 5.3 紧急报文协议 六、NMT网络管理 6.1 NMT节点状态 6.2 NMT节点上线报文 6.3 NMT心跳报…

【Zookeeper搭建】Zookeeper分布式集群搭建完整指南

Zookeeper分布式集群搭建 &#xff08;一&#xff09;克隆前准备工作 一、时钟同步 步骤&#xff1a; 1、输入date命令可以查看当前系统时间&#xff0c;可以看到此时系统时间为PDT&#xff08;部分机器或许为EST&#xff09;&#xff0c;并非中国标准时间。我们在中国地区…