- 操作系統: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”。
函數原型
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 通道圖像。
代碼示例
#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 );// 構建 GComputationcv::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;
}