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

news/2025/4/1 6:17:36/
  • 操作系统: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.ppmy.cn/news/1583302.html

相关文章

工欲善其事必先利其器————idea插件

文章目录 前言1、CodeGlance&#xff1a;2、Key Promoter X&#xff1a;3、Lombok&#xff1a;4、Maven Helper&#xff1a;5、Save Actions&#xff1a;6、String Manipulation&#xff1a;7、Rainbow Brackets&#xff1a;8、PlantUML Integration&#xff1a;9、Ideolog&…

SQL Server 数据库迁移到 MySQL 的完整指南

文章目录 引言一、迁移前的准备工作 1.1 确定迁移范围1.2 评估兼容性1.3 备份数据 二、迁移工具的选择 2.1 使用 MySQL Workbench2.2 使用第三方工具2.3 手动迁移 三、迁移步骤 3.1 导出 SQL Server 数据库结构3.2 转换数据类型和语法3.3 导入 MySQL 数据库3.4 迁移数据3.5 迁…

YAML是什么?

YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种以数据为中心、高度可读的序列化语言&#xff0c;广泛应用于配置文件、数据交换和自动化工具中。以下从多个维度对其进行全面解析&#xff1a; 1. 定义与历史演变 全称与定位&#xff1a; YAML的全称最初为“Yet…

uv - pip 接口

文章目录 pip 接口Python 环境创建虚拟环境使用虚拟环境关闭环境使用任意的 Python 环境 管理软件包安装一个包可编辑包从文件安装包卸载一个包 检查环境列出已安装的包检查一个包验证环境 声明依赖使用 pyproject.toml使用 requirements.in 锁定环境锁定要求升级要求同步环境添…

记录firefly的3566-sdk的下载及解压更新

文章目录 &#xff08;一&#xff09;下载及解压&#xff08;二&#xff09;还原仓库1. 检查.git 目录的内容&#xff0c;确保包含 objects、refs 等子目录。2. 在.git目录的父目录下&#xff0c;创建一个新的工作目录。该命令将创建一个新的分支&#xff0c;并尝试检出最新的提…

在 Qt 中,不带参数或整形的参选的信号能够从 std::thread 发送成功,而带枚举离线的信号却发送失败

在 Qt 中&#xff0c;不带参数或整形的参选的信号能够从 std::thread 发送成功&#xff0c;而带枚举离线的信号却发送失败 当信号和槽在不同线程时&#xff0c;默认使用 队列连接&#xff08;Qt::QueuedConnection&#xff09;&#xff0c;信号会被放入接收线程的事件队列&…

阿里云平台域名

目录&#xff1a; 1、域名的简介2、域名绑定3、域名备案4、查找域名对应地址 1、域名的简介 2、域名绑定 将域名和你的ip地址进行绑定&#xff0c;这样域名在访问时解析域名才能到对应ip服务器上。 3、域名备案 不进行域名的备案&#xff0c;域名可能会被封禁。 4、查找域名对…

react-activation 实现页面保活记录

这里写目录标题 一、安装插件&#xff08;可选&#xff09;1、react-activation &#xff08;推荐&#xff09;2、umi-plugin-keep-alive 二、AliveScope的两种配置方式1、在src/app.ts 中配置2、在src/layout/index.tsx中配置 三、umi中的配置四、使用问题记录1、drop使用不生…