OpenCV:将 3 通道图像转换为 4 通道

Posted

技术标签:

【中文标题】OpenCV:将 3 通道图像转换为 4 通道【英文标题】:OpenCV: transforming 3 channel image into 4 channel 【发布时间】:2012-11-19 10:30:05 【问题描述】:

我正在尝试将 3 通道图像更改为 4 通道,如下所示:

cv::VideoCapture video;
video.open("sample.avi");
cv::Mat source;
cv::Mat newSrc;
int from_to =  0,0, 1,1, 2,2, 3,3 ;
for ( int i = 0; i < 1000; i ++ )

   video >> source;
   cv::mixChannels ( source, 2, newSrc, 1, from_to, 4 );

然后我得到了

too many input arguments in function call

对于“mixChannels”行。此外,我不确定我是否为我的目标正确地给出了论据。有人能帮我吗?谢谢你。

【问题讨论】:

【参考方案1】:

您可以将 3 通道图像转换为 4 通道,如下所示:

cv::Mat source = cv::imread(path);

cv::Mat newSrc(source.size(), CV_MAKE_TYPE(source.depth(), 4));

int from_to[] =  0,0, 1,1, 2,2, 2,3 ;

cv::mixChannels(&source,1,&newSrc,1,from_to,4);

这样,通道 4 将成为通道 3 的副本。通过在from_to 列表中使用负数,输出通道将被零填充。例如:

int from_to[] =  0,0, 1,1, 2,2, -1,3 ;

【讨论】:

在 C++11 中,您还可以使用更方便的形式 cv::mixChannels(src, ..., dst1, ..., 2,0, 1,1, 0,2, 3,3 ) @sgarizvi 虽然我自己是 OpenCV 的新手。 mixChannels(...)cvtColor(motion,newmotion,CV_BGR2BGRA); 有何不同【参考方案2】:

第四个频道应该包含什么? 怎么样:

VideoCapture cap(0);
Mat frame;
cap >> frame;

Mat RGBA(frame.size(), CV_8UC4, camData);
cv::cvtColor(frame, RGBA, CV_BGR2RGBA, 4);

【讨论】:

感谢您的回答。其实我不知道第 4 通道应该包含什么,实际上我的主要目标是使用“meanShiftFiltering”,但它只接受 4 通道图像。所以这就是我需要改变的原因。您的代码中的“camData”是什么?您是说“frame.data”吗? 它应该包含 alpha(透明度)?【参考方案3】:

我觉得应该是这样的:

cv::Mat source = cv::imread(path);
cv::Mat newSrc = cv::Mat(source.rows,source.cols,CV_8UC4);

int from_to[] =  0,0, 1,1, 2,2, 3,3 ;
cv::mixChannels(&source,1,&newSrc,1,from_to, source.channels());

在 C++11 中,您可以使用初始值设定项列表来提供多个矩阵用于内联批量转换:

cv::mixChannels(source, newSrc, from_to, source.channels());

我们设置了 3 对要复制,所以这使得 newsrc 中的 4 通道为空。第二个和第四个参数中的 1 表示指针 source 和 newSrc 指向一个要处理的元素。最后一个参数给出 from_to 的长度。

【讨论】:

恕我直言,这应该是公认的答案。 @sgarizvi 的回答有一些问题(至少对于 OpenCV 3.2.0+),如果输入图像尚未包含 4 个通道,则会导致断言失败:from_to 数组需要为输入数组中的每个通道进行映射(可以通过将source.channels() 传递给npairs 来解决这个问题。此外,接受的答案对于nscrs 的值也无效,应该是1

以上是关于OpenCV:将 3 通道图像转换为 4 通道的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PIL 将 1 通道图像转换为 3 通道?

OpenCV 错误:通道数错误(源图像必须有 1、3 或 4 个通道)

请问opencv中怎样将单通道图像转化为3通道图像,谢谢!

opencv 提取单通道 ,转化灰度图像。

Mat的单通道作为矩阵Opencv

计算机视觉OpenCV 4高级编程与项目实战(Python版):通道详解