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

Ответ 1

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

cvtColor(src, dst, COLOR_GRAY2RGB);

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

Ответ 2

Из documentation на convertTo

void Mat:: convertTo (Mat & m, int rtype, double alpha = 1, double beta = 0) const

     

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

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

Ответ 3

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

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