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 通道的主要内容,如果未能解决你的问题,请参考以下文章