mixChannels 主要就是把输入的图像(或图像集)的某些通道拆分复制给对应的输出图像(或图像集)的某些通道中,其中的对应关系由 fromTo 参数制定。
通道复制:mixChannels 函数
void mixChannels(const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, const int* fromTo, size_to npairs);
- src,输入的图像或图像集,需要有相同的尺寸和深度。
- nsrcs,输入图像个数。
- dst,输出图像,所有图像必须被初始化,且大小和深度必须与 src[0] 相同。
- ndsts,输出图像个数。
- fromTo,输入图像通道与输出图像通道的对应关系。对于输入图像,第一幅图的通道索引可选范围 [0, src[0].channels() - 1],第二幅图的通道索引可选范围 [src[0].channels(), src[0].channels() + src[1].channels() - 1] 。输出图像亦满足这个规律。举个例子,假设输入和输出图像均为三通道图像,想要将输入图像中第 3 幅图的第 1 个通道放入到输出图像第 2 幅图的第三个通道,则对应关系为 src[2][0] -> dst[1][2] ,在 fromTo 中形式为 6 -> 5。
- npairs,fromTo 的索引数,即有几个 fromTo。
代码示例:
#include<opencv.hpp> #include<iostream> using namespace std; using namespace cv; Mat src, hsvImg; int main() { src = imread("C:/Users/齐明洋/Desktop/证件照/1.jpg"); imshow("src", src); //转换为 HSV 通道图像 cvtColor(src, hsvImg, COLOR_BGR2HSV); imshow("hsvImg", hsvImg); Mat hImg = Mat(src.size(), CV_8UC1); Mat sImg = Mat(src.size(), CV_8UC1); Mat vImg = Mat(src.size(), CV_8UC1); Mat dst[] = { hImg,sImg,vImg }; //hsvImg[0]->hImg[0] hImg 在 dst 中的通道索引为:0 //hsvImg[1]->sImg[0] sImg 在 dst 中的通道索引为:1 //hsvImg[2]->vImg[0] vImg 在 dst 中的通道索引为:2 int fromTo[] = { 0,0,1,1,2,2 }; mixChannels(&hsvImg, 1, dst, 3, fromTo, 3); imshow("hImg", hImg); imshow("sImg", sImg); imshow("vImg", vImg); waitKey(0); }
效果演示:
借鉴博客:https://www.cnblogs.com/ruic/archive/2015/10/31/4926254.html
来源:https://www.cnblogs.com/bjxqmy/p/12453861.html