【发布时间】:2012-05-13 22:17:38
【问题描述】:
我正在使用 openCV,我需要将两个三通道 RGB 图像组合成一个 6 通道图像。我不确定我将如何组合它们。有什么想法吗?
【问题讨论】:
我正在使用 openCV,我需要将两个三通道 RGB 图像组合成一个 6 通道图像。我不确定我将如何组合它们。有什么想法吗?
【问题讨论】:
首先,您必须创建一个目标矩阵。cv::Mat 允许创建多达 CV_CN_MAX (512) 个通道的图像。
例如cv::Mat(cv::Size(640,480),CV_8UC(6)) 是具有六个 8 位通道的 640x480 图像。更一般地说,给定s
输入,就可以得到一个自适应的目的矩阵:
cv::Mat(s.size(), CV_MAKETYPE(s.depth(), 6))
请参阅 Data types 和 cv::Mat constructor。
您可能希望使用Mat::convertTo 来确保您的两个输入图像具有相同的格式,然后使用mixChannels:
mixChannels(const Mat * src,
size_t nsrcs,
Mat * dst,
size_t ndsts,
const int * fromTo,
size_t npairs
)
需要将 2 个源图像放入一个容器中(请记住,分配矩阵只会创建一个新标头,除非明确要求,否则不会复制图像缓冲区)。
最后要做的是使用通道映射创建一个from_to 向量。给定 s0 和 s1 输入图像,目标是如下映射:
s0 red -> 1st output channel
s0 green -> 2nd
s0 blue -> 3rd
s1 red -> 4th
s1 green -> 5th
s1 blue -> 6th
最终代码为:
std::vector<cv::Mat> s;
s.resize(2); //Or `push_back` your 2 input images
s[0] = ... //1st input image
s[1] = ... //2nd input image
auto d = cv::Mat(s[0].size(), CV_MAKETYPE(s[0].depth(), 6));
int from_to[] = { 0,0, 1,1, 2,2, 3,3, 4,4, 5,5 };
cv::mixChannels(s.data(), s.size(), &d, 1, from_to, 6);
【讨论】:
from_to 中应该有 0,3 而不是 0,1
int from_to[] = { 0,0, 1,1, 2,2, 3,3, 4,4, 5,5 };,因为索引是通过数组递增计数的。