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