OpenCV 图形API(75)图像与通道拼接函数-----将 4 个单通道图像矩阵 (GMat) 合并为一个 4 通道的多通道图像矩阵函数merge4()

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

算法描述

由4个单通道矩阵创建一个4通道矩阵。

该函数将多个矩阵合并为一个单一的多通道矩阵。也就是说,输出矩阵的每一个元素都是输入矩阵对应位置元素的拼接组合,其中第i个输入矩阵的元素被视为具有 mvi.channels() 个元素的向量。

输出矩阵的类型必须是 CV_8UC4 类型(即:每个像素由4个无符号8位字节组成)。

函数 split4 执行相反的操作。

注意

该函数的文本标识符(textual ID)是 "org.opencv.core.transform.merge4"。

函数原型

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

参数

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

返回值

返回一个 cv::GMat 对象,表示合并后的 4 通道图像。

代码示例

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

int main()
{
    // 固定图像路径
    std::string imagePath = "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png";  // 建议使用带 alpha 通道的 PNG

    // 加载图像(尝试加载为透明图像)
    cv::Mat src = cv::imread( imagePath, cv::IMREAD_UNCHANGED );
    if ( src.empty() )
    {
        std::cerr << "无法加载图像: " << imagePath << std::endl;
        return -1;
    }

    // 如果不是 4 通道图像,转换成 4 通道(可选)
    if ( src.channels() != 4 )
    {
        cv::cvtColor( src, src, cv::COLOR_BGR2BGRA );
    }

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

    // 定义 G-API 输入节点(4 个单通道图像)
    cv::GMat g1, g2, g3, g4;

    // 定义 G-API 计算图操作:合并为一个 4 通道图像
    cv::GMat merged = cv::gapi::merge4( g1, g2, g3, g4 );

    // 构建 GComputation
    cv::GComputation comp( cv::GIn( g1, g2, g3, g4 ), cv::GOut( merged ) );

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

    // 将输入包装成 vector<Mat>
    std::vector< cv::Mat > inputs  = { channels[ 0 ], channels[ 1 ], channels[ 2 ], channels[ 3 ] };
    std::vector< cv::Mat > outputs = { out };

    // 执行计算图
    comp.apply( inputs, outputs, cv::compile_args() );

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

    // 检查输出是否有效
    if ( out.empty() )
    {
        std::cerr << "错误:合并后的图像为空!" << std::endl;
        return -1;
    }
    if ( out.rows <= 0 || out.cols <= 0 )
    {
        std::cerr << "错误:合并后的图像尺寸无效!" << std::endl;
        return -1;
    }

    // 显示结果
    cv::imshow( "原始图像", src );
    cv::imshow( "合并后图像 (merge4)", out );
    cv::waitKey( 0 );

    return 0;
}

运行结果

相关推荐
FL16238631298 小时前
[cmake]基于C++使用纯opencv部署ppocrv5v6的onnx模型
开发语言·c++·opencv
2401_8856651913 小时前
基于OpenCV的模板匹配OCR实战:银行卡与身份证数字识别完整教程
人工智能·python·opencv·计算机视觉·ocr
winfredzhang1 天前
用 MediaPipe 手势数字识别一键打开下载夹里的图片(Python + OpenCV 实战)
人工智能·python·opencv·google·mediapipe
sali-tec2 天前
C# 基于OpenCv的视觉工作流-章84-包胶有无检测
图像处理·人工智能·opencv·算法·计算机视觉
FL16238631292 天前
基于C#winform使用纯opencv部署ppocrv5和ppocrv6的onnx模型进行OCR文件检测识别
opencv·c#·ocr
江畔柳前堤2 天前
agent面试题
数据库·人工智能·opencv·数据挖掘·语音识别·agent
Java患者·2 天前
《Python 人脸识别入门实践:从人脸检测到人脸比对完整实现》
开发语言·python·opencv·目标检测·计算机视觉·目标跟踪·视觉检测
丨白色风车丨3 天前
OpenCV 实战入门:轮廓检测、模板匹配与命令行参数解析
人工智能·opencv·计算机视觉
Jerryhut3 天前
opencv对齐算法及其应用
人工智能·opencv·算法
盼小辉丶3 天前
OpenCV-Python实战(28)——OpenCV计算摄影从HDR图像融合到全景拼接
python·opencv·计算机视觉