- 操作系统: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;
}
运行结果
