OpenCV 图形API(74)图像与通道拼接函数-----合并三个单通道图像(GMat)为一个多通道图像的函数merge3()

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

算法描述

从3个单通道矩阵创建一个3通道矩阵。

此函数将多个矩阵合并以生成一个单一的多通道矩阵。即,输出矩阵的每个元素将是输入矩阵元素的串联,其中第i个输入矩阵的元素被视为mv[i].channels()元素向量。输出矩阵必须是CV_8UC3类型。

split3函数执行相反的操作。

注意:

函数的文字ID是"org.opencv.core.transform.merge3"

函数原型

cpp 复制代码
GMat cv::gapi::merge3 	
(
 	const GMat &  	src1,
	const GMat &  	src2,
	const GMat &  	src3 
) 		

参数

  • 参数 src1:第一个输入的CV_8UC1类型的矩阵,需要被合并。
  • 参数 src2:第二个输入的CV_8UC1类型的矩阵,需要被合并。
  • 参数 src3:第三个输入的CV_8UC1类型的矩阵,需要被合并。

代码示例

cpp 复制代码
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/opencv.hpp>

int main()
{
    // 设置图像路径
    std::string imagePath = "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png";

    // 加载图像
    cv::Mat src = cv::imread( imagePath, cv::IMREAD_COLOR );
    if ( src.empty() )
    {
        std::cerr << "Failed to load image!" << std::endl;
        return -1;
    }

    // 分离三个通道
    std::vector< cv::Mat > channels;
    cv::split( src, channels );

    // 检查分离出的通道数量是否正确
    if ( channels.size() != 3 )
    {
        std::cerr << "Expected 3 channels, but got " << channels.size() << std::endl;
        return -1;
    }

    // 定义输入节点(三个单通道图像)
    cv::GMat g_b, g_g, g_r;

    // 定义 G-API 图操作:合并三个通道为一个三通道图像
    cv::GMat g_merged = cv::gapi::merge3( g_b, g_g, g_r );

    // 构建 GComputation(定义整个计算图)
    cv::GComputation comp( cv::GIn( g_b, g_g, g_r ), cv::GOut( g_merged ) );

    // 输出图像容器
    cv::Mat out;

    // 正确调用 apply:将输入输出包装为 vector
    std::vector< cv::Mat > inputs  = { channels[ 0 ], channels[ 1 ], channels[ 2 ] };
    std::vector< cv::Mat > outputs = { out };

    // 执行 GComputation
    comp.apply( inputs, outputs, cv::compile_args() );

    // 获取真正的输出图像
    out = outputs[ 0 ];

    // 检查输出是否为空或者无效大小
    if ( out.empty() )
    {
        std::cerr << "Error: Merged output image is empty!" << std::endl;
        return -1;
    }
    if ( out.rows <= 0 || out.cols <= 0 )
    {
        std::cerr << "Error: Merged output image has invalid size: " << out.cols << "x" << out.rows << std::endl;
        return -1;
    }

    // 显示原图和合并后的图像
    cv::imshow( "Original Image", src );
    cv::imshow( "Merged Image (G-API)", out );
    cv::waitKey( 0 );

    return 0;
}

运行结果

相关推荐
YuSun_WK2 小时前
torch.matmul() VS torch.einsum()
人工智能·pytorch·深度学习
数据小吏2 小时前
第十五章:数据治理之数据目录:摸清家底,建立三大数据目录
大数据·数据库·人工智能
许泽宇的技术分享3 小时前
【AI实战】从“苦AI”到“爽AI”:Magentic-UI 把“人类-多智能体协作”玩明白了!
人工智能·ui
马拉AI5 小时前
创新点!贝叶斯优化、CNN与LSTM结合,实现更准预测、更快效率、更高性能!
人工智能·深度学习·机器学习
kovlistudio6 小时前
机器学习第二十七讲:Kaggle → 参加机器学习界的奥林匹克
人工智能·机器学习
bennybi6 小时前
AI方案调研与实践二:模型训练
人工智能·ai·sft·rag
MarkHD6 小时前
第十天 高精地图与定位(SLAM、RTK技术) 多传感器融合(Kalman滤波、深度学习)
人工智能·深度学习
是麟渊6 小时前
【大模型面试每日一题】Day 27:自注意力机制中Q/K/V矩阵的作用与缩放因子原理
人工智能·线性代数·自然语言处理·面试·职场和发展·架构
mozun20206 小时前
弱小目标检测任务中的YOLO、LSTM和Transformer三种模型对比2025.5.24
人工智能·yolo·目标检测·计算机视觉
riri19196 小时前
数字图像处理:基于 hough 变换的图像边缘提取
人工智能·计算机视觉