Opencv多通道分离函数split()和多通道合并函数merge的使用
多通道分離函數(shù)split()
功能:把一個多通道隊列分離成幾個單通道的隊列。
如果你需要提取一個單通道或者做一些其他的復(fù)雜的通道排列組合,使用mixChannels。
?
函數(shù)原型1:
CV_EXPORTS void split(const Mat& src, Mat* mvbegin);參數(shù)說明:
-
參數(shù)1 src 輸入多通道數(shù)組
-
參數(shù)2 mvbegin 輸出數(shù)組,數(shù)組的大小必須與src.channels()匹配,如果需要的話,數(shù)組自身重新分配。
參考: merge, mixChannels, cvtColor
函數(shù)原型2:
CV_EXPORTS_W void split(InputArray m, OutputArrayOfArrays mv);參數(shù)說明:
-
參數(shù)1 m 輸入多通道數(shù)組
-
參數(shù)2 mv 輸出數(shù)組,如果需要的話,數(shù)組自身重新分配。
代碼示例:
#include "pch.h" #include <iostream> #include <opencv2\opencv.hpp> ? int main() {cv::Mat img;img = cv::imread("F:/openCV/images/juice.jpg"); ? ? // 讀取圖像 ?if (img.empty()) ? ?// 判斷是否讀取成功{std::cout << "導(dǎo)入圖像失敗!";std::cin.get(); ? ? // 讀取錯誤時,為了能在控制臺dos窗口看到輸出的信息,而不是一閃而過return -1;}else{std::cout << "導(dǎo)入圖像成功!";} ?cv::Mat imgSplit[3];cv::split(img, imgSplit); ?cv::imshow("RGB-B通道像素值", imgSplit[0]); ? ?// B通道像素值cv::imshow("RGB-G通道像素值", imgSplit[1]); ? ?// G通道像素值cv::imshow("RGB-R通道像素值", imgSplit[2]); ? ?// R通道像素值 ?cv::waitKey(0); ? ?// 一直顯示圖像直到摁下任意鍵 }運行結(jié)果如下圖:
?
多通道合并函數(shù)merge()
功能:從幾個單通道數(shù)組里合并成一個多通道的數(shù)組
函數(shù) cv::merge合并幾個數(shù)組到一個包含多通道的數(shù)組. 也就是說,每個輸出數(shù)組的元素將會是輸入數(shù)組元素的結(jié)合,其中的第i個輸入數(shù)組的元素被當(dāng)做mv[i].channels()元素的向量,合并后生成的新矩陣行數(shù)和列數(shù)與輸入矩陣的相同。
函數(shù)cv::split 是做的相反的操作. 如果你需要使用其他先進(jìn)的方式打亂通道,使用cv::mixChannels.
函數(shù)原型1
CV_EXPORTS void merge(const Mat* mv, size_t count, OutputArray dst);參數(shù)說明
-
參數(shù)1 mv 將要合并的輸入矩陣數(shù)組,mv里的所有矩陣必須大小和深度一致。
-
參數(shù)2 count ,當(dāng)mv是一個空白的C數(shù)組時代表的是輸入矩陣的個數(shù);他的值必須大于零。
-
參數(shù)3 dst 和mv[0]一樣大小和深度的輸出數(shù)組;通道個數(shù)和參數(shù)個數(shù)相等。
@參考 mixChannels, split, Mat::reshape
函數(shù)原型2
CV_EXPORTS_W void merge(InputArrayOfArrays mv, OutputArray dst);參數(shù)說明
-
參數(shù)1 mv 將要合并的輸入矩陣數(shù)組,mv里的所有矩陣必須大小和深度一致。
-
參數(shù)12 dst 和mv[0]一樣大小和深度的輸出數(shù)組; 通道個數(shù)是矩陣數(shù)組里的通道數(shù)的總和.
代碼示例
以下代碼實現(xiàn)了把RGB圖像分離后又合并,把HSV分離后又合并,把HSV中的H和RGB中的G、R合并。
#include "pch.h" #include <iostream> #include <opencv2\opencv.hpp> ? int main() {cv::Mat img;img = cv::imread("F:/openCV/images/juice.jpg"); ? ? // 讀取圖像 ?if (img.empty()) ? ?// 判斷是否讀取成功{std::cout << "導(dǎo)入圖像失敗!";std::cin.get(); ? ? // 讀取錯誤時,為了能在控制臺dos窗口看到輸出的信息,而不是一閃而過return -1;}else{std::cout << "導(dǎo)入圖像成功!";} ?cv::Mat imgSplit[3];cv::Mat imgMerge;cv::Mat imgMergeHsv;cv::Mat hsv;cv::Mat hsvSplit[3]; ?cv::Mat mergeHsvRgb[3];cv::Mat mergeResult;; ?cv::cvtColor(img, hsv, cv::COLOR_BGR2HSV); ?cv::split(img, imgSplit);cv::split(hsv, hsvSplit); ? ?mergeHsvRgb[0] = hsvSplit[0];mergeHsvRgb[1] = imgSplit[1];mergeHsvRgb[2] = imgSplit[2]; ?cv::merge(imgSplit, 3, imgMerge);cv::merge(hsvSplit, 3, imgMergeHsv);cv::merge(mergeHsvRgb, 3, mergeResult); ?cv::imshow("HSV", hsv); ? ? ? ? ? ? ? // hsv像素值cv::imshow("Merge RGB", imgMerge); ? ?// RGB合并像素值cv::imshow("Merge HSV", imgMergeHsv); ? ?// HSV合并像素值cv::imshow("Merge HSV RGB", mergeResult); ? ?// HSV中的H和RGB中的G、R合并 ?cv::waitKey(0); ? ?// 一直顯示圖像直到摁下任意鍵 }運行結(jié)果如下圖:
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Opencv多通道分离函数split()和多通道合并函数merge的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV图像颜色模型转换:cvtCo
- 下一篇: ubuntu18.04下安装中文输入法