Ответ 1
Я обнаружил, что лучший способ сделать это:
cvtColor(src, dst, COLOR_GRAY2RGB);
Изображение будет выглядеть так же, как когда оно было в оттенках серого CV_8UC1, но это будет 3-канальное изображение типа 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
Я обнаружил, что лучший способ сделать это:
cvtColor(src, dst, COLOR_GRAY2RGB);
Изображение будет выглядеть так же, как когда оно было в оттенках серого CV_8UC1, но это будет 3-канальное изображение типа CV_8UC3.
Из documentation на convertTo
void Mat:: convertTo (Mat & m, int rtype, double alpha = 1, double beta = 0) const
rtype - желаемый тип матрицы назначения или, вернее, глубина (так как количество каналов будет одинаковым с исходным). Если rtype отрицательный, матрица адресата будет иметь тот же тип, что и источник.
Вы хотите создать матрицу для каждого из 3 каналов, которые вы хотите создать, а затем использовать функцию слияния. См. Ответы на этот вопрос
Соглашение заключается в том, что для типа CV_8UC3
значения пикселей варьируются от 0
до 255
, а для типа CV_32FC3
от 0.0
до 1.0
. Таким образом, вам нужно использовать коэффициент масштабирования 255.0
вместо 1.0
:
Mat::convertTo(newImage, CV_32FC1, 255.0);