Преобразование 1-канального изображения в 3-канальное

Я пытаюсь преобразовать 1-канальное изображение (16 бит) в 3-канальное изображение в OpenCV 2.3.1. У меня возникли проблемы с использованием функции слияния и получить следующую ошибку:

    Mat temp, tmp2;
    Mat hud;
    tmp2 = cv_ptr->image;
    tmp2.convertTo(temp, CV_16UC1);
    temp = temp.t();
    cv::flip(temp, temp, 1);
    resize(temp, temp, Size(320, 240));
    merge(temp, 3, hud);

ошибка: не найдена соответствующая функция для вызова функции 'merge(cv::Mat&, int, cv::Mat&)'

Кто-нибудь может мне с этим помочь? Заранее спасибо!

3 ответа

Если temp это матрица 1 канала, которую вы хотите преобразовать в 3 канала, тогда будет работать следующее:

cv::Mat out;
cv::Mat in[] = {temp, temp, temp};
cv::merge(in, 3, out);

проверьте документацию для получения дополнительной информации.

Вот решение, которое не требует репликации одноканального изображения перед созданием из него 3-канального изображения. Объем памяти этого решения в 3 раза меньше, чем у решения, использующего слияние (с помощью вольта выше). Смотрите документацию openCV для cv::mixChannels, если вы хотите понять, почему это работает

// copy channel 0 from the first image to all channels of the second image
int from_to[] = { 0,0, 0,1, 0,2}; 
Mat threeChannelImage(singleChannelImage.size(), CV_8UC3);
mixChannels(&singleChannelImage, 1, & threeChannelImage, 1, from_to, 3);

Похоже, вы не совсем используете merge правильно. Вам необходимо указать все каналы, которые должны быть "объединены". Я думаю, что вы хотите трехканальный фрейм со всеми идентичными каналами, в Python я бы написал так:

cv.Merge(temp, temp, temp, None, hud)

Из документации opencv:

cvMerge: состоит из многоканального массива из нескольких одноканальных массивов или вставляет один канал в массив.

Другие вопросы по тегам