方式一
#include<opencv2/opencv.hpp>
#include<iostream>
#include <vector>
int main(int argc, char** argv) {
cv::Mat src = cv::imread("D:/bb/tu/3.png");
std::cerr << src.channels() << std::endl;
cv::imshow("src", src);
cv::Mat dst(src.rows, src.cols, CV_8UC3);
std::vector<int> fromTo = { 0,2,1,1,2,0 };//通道对应信息
//src的0通道复制到dst的2通道,src的1通道复制到dst的1通道,src的2通道复制到dst的0通道
cv::mixChannels(src, dst, fromTo);//通道复制
cv::imshow("dst", dst);
cv::waitKey(0);
return 0;
}
方式二
#include<opencv2/opencv.hpp>
#include<iostream>
#include <vector>
int main(int argc, char** argv) {
//把一个四通道矩阵,使用mixChannels()函数分割成了一个三通道矩阵和一个单通道矩阵,并且具有对应关系
cv::Mat bgra(5, 4, CV_8UC4, cv::Scalar(10, 20, 30, 255));
cv::Mat bgr(bgra.rows, bgra.cols, CV_8UC3);
cv::Mat alpha(bgra.rows, bgra.cols, CV_8UC1);
cv::Mat out[] = { bgr,alpha }; //通道组合
int fromTo[] = { 0, 2, 1, 1, 2, 0, 3, 3 };//通道对应信息,从0开始
cv::mixChannels(&bgra, 1, out, 2, fromTo, 4); //通道复制
/*
第一个参数:输入矩阵 const Mat *
第二个参数:输入矩阵的数量 size_t
第三个参数:输出矩阵 Mat *
第四个参数:输出矩阵的数量 size_t
第五个参数:通道对应信息 const int *
第六个参数:复制通道数量
说明:在这个函数原型中,如果输入矩阵和输出矩阵都写1,那么就跟第一种函数原型是一致的了。
如果不为1,就可以实现多个矩阵组合并或者一个矩阵拆分为多个复杂矩阵等功能
*/
std::cerr << bgra << std::endl<< std::endl;
std::cerr << bgr << std::endl << std::endl;
std::cerr << alpha << std::endl << std::endl;
cv::waitKey(0);
return 0;
}