OpenCV: преобразование 3-канального изображения в 4 канала

Я пытаюсь изменить 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 > source; cv::mixChannels ( source, 2, newSrc, 1, from_to, 4 ); } 

Тогда я получил

 too many input arguments in function call 

для линии mixChannels. Кроме того, я не уверен, правильно ли даю аргументы для своей цели. Кто-нибудь может мне помочь? Спасибо.

Вы можете преобразовать 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 }; 

Что должен содержать 4-й канал? Как насчет:

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

Я думаю, это должно быть так:

 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 вы можете использовать списки инициализаторов для предоставления нескольких матриц для пакетного преобразования inline:

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

Мы устанавливаем 3 пары для копирования, поэтому это оставляет 4 канала пустым в newsrc. И 1 во втором и четвертом параметрах означает, что источник указателей и newSrc указывают на один элемент для обработки. Последний параметр дает длину от_to.