OpenCV: как преобразовать мат CV_8UC1 в CV_8UC3

Как конвертировать CV_8UC1 Mat в CV_8UC3 с OpenCV?

Mat dst;
Mat src(height, width, CV_8UC1, (unsigned char*) captureClient->data());
src.convertTo(dst, CV_8UC3);

но dst.channels() = 1

3 ответа

Я обнаружил, что лучший способ сделать это:

cvtColor(src,dst,CV_GRAY2RGB);

Изображение будет выглядеть так же, как когда оно было в оттенках серого CV_8UC1, но это будет 3-канальное изображение типа CV_8UC3.

Соглашение о том, что для типа CV_8UC3, значения пикселей варьируются от 0 в 255и для типа CV_32FC3 от 0.0 в 1.0, Таким образом, вам нужно использовать коэффициент масштабирования 255.0, вместо 1.0:

Mat::convertTo(newImage, CV_32FC1, 255.0);

Из документации по convertTo

void Mat:: convertTo (Mat & m, int rtype, двойная альфа =1, двойная бета = 0) const

rtype - желаемый тип матрицы назначения, а точнее, глубина (так как количество каналов будет таким же, как у исходного). Если rtype отрицателен, матрица назначения будет иметь тот же тип, что и источник.

Вы хотите создать матрицу для каждого из 3 каналов, которые хотите создать, и затем использовать функцию слияния. Смотрите ответы на этот вопрос

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