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

E_l*_*ner 13 c++ opencv image-processing

我正在尝试将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 );
}
Run Code Online (Sandbox Code Playgroud)

然后我得到了

too many input arguments in function call
Run Code Online (Sandbox Code Playgroud)

对于'mixChannels'系列.此外,我不确定我是否正确地为我的目标提供论据.有人能帮我吗?谢谢.

sga*_*zvi 16

您可以将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);
Run Code Online (Sandbox Code Playgroud)

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

int from_to[] = { 0,0, 1,1, 2,2, -1,3 };
Run Code Online (Sandbox Code Playgroud)

  • 在C++ 11中你也可以使用更方便的形式`cv :: mixChannels({{src,...}},{{dst1,...}},{2,0,1,1,0, 2,3,3}}`. (2认同)

Her*_*rst 7

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

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

Mat RGBA(frame.size(), CV_8UC4, camData);
cv::cvtColor(frame, RGBA, CV_BGR2RGBA, 4);
Run Code Online (Sandbox Code Playgroud)


Ant*_*eev 6

我想它应该是这样的:

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());
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,您可以使用初始化列表为内联批量转换提供多个矩阵:

cv::mixChannels({{source}}, {{newSrc}}, from_to, source.channels());
Run Code Online (Sandbox Code Playgroud)

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