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 < 1000; i ++ )
{
video >> source;
cv::mixChannels ( source, 2, newSrc, 1, from_to, 4 );
}

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

too many input arguments in function call

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

12

Решение

Вы можете конвертировать 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 };
16

Другие решения

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

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

Mat RGBA(frame.size(), CV_8UC4, camData);
cv::cvtColor(frame, RGBA, CV_BGR2RGBA, 4);
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());

В C ++ 11 вы можете использовать списки инициализаторов для предоставления нескольких матриц для встроенного пакетного преобразования:

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

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

6
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector