Ответ 1
Вы должны использовать CV_GRAY2BGR
вместо CV_BGR2GRAY
.
Im, использующий openCV С++
Мне нужно преобразовать изображение одного канала в 3-канальное изображение. Поэтому я могу использовать это: cvCvtColor(result,gray,CV_BGR2GRAY);
Я не могу этого сделать, потому что результат img - это одноканальное изображение. Любые идеи?
Вы должны использовать CV_GRAY2BGR
вместо CV_BGR2GRAY
.
Попробуйте следующее:
CvSize dim = cvSize(int width, int height);
IplImage* dst = cvCreateImage( dim, 8, 3 );
IplImage* gray = cvCreateImage(dim, 8, 1);
// Load the gray scale image
cvMerge(gray , NULL, NULL, NULL, dst);
cvShowImage("gray",gray);
cvShowImage("dst",dst);
cvWaitKey(0);
Оба типа dst и gray должны иметь одинаковые типы данных. Вы не можете просто слить float в матрицу uint. Для этого вам нужно будет использовать cvScale.
Я проверил cvtColor в справочнике OpenCV и нашел это:
С++: void cvtColor (InputArray src, OutputArray dst, int code, int dstCn= 0)
dstCn - количество каналов в целевом изображении. Если параметр равен 0, количество каналов выводится автоматически из src и кода.
Я использовал
cvtColor(src,gray,CV_BGR2GRAY,1);
чтобы преобразовать 3-канальный Mat в 1-канал, и он сработал. Поэтому изменение dstCn до 3 может работать для вас:)
Попробуйте слить серый, серый, серый в BGR.
ИМХО:
Если вход серый, тогда выход будет серым. Лучшее, что вы можете получить, - это цветное распределенное изображение на основе данных пикселя, например (110, 110, 110)
для пиксельных данных 110
, а не истинное цветное изображение