- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
由4个单通道矩阵创建一个4通道矩阵。
该函数将多个矩阵合并为一个单一的多通道矩阵。也就是说,输出矩阵的每一个元素都是输入矩阵对应位置元素的拼接组合,其中第i个输入矩阵的元素被视为具有 mv[i].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;
}
运行结果
