Почему функция convertto в openCV не работает?

У меня есть изображение, которое имеет 4 канала и находится в 4 * UINT8 формат.

Я пытаюсь преобразовать его в 3-х канальный float, и я использую этот код:

images.convertTo(images,CV_32FC3,1/255.0);

После преобразования изображение находится в формате с плавающей точкой, но все еще имеет 4 канала. Как мне избавиться от 4-го (альфа) канала в OpenCV?

8

Решение

Как сказал @AldurDisciple, Mat::convertTo() предназначен для использования для изменения типа данных Mat, не для изменения количества каналов.

Чтобы выработать, вы должны разделить его на два этапа:

cvtColor(image, image, CV_BGRA2BGR);       // 1. change the number of channels
image.convertTo(image, CV_32FC3, 1/255.0); // 2. change type to float and scale
11

Другие решения

Функция convertTo предназначен для использования для изменения типа данных Matисключительно. Как указано в документации (ссылка на сайт), количество каналов выходного изображения всегда совпадает с входным изображением.

Если вы хотите изменить тип данных а также Для уменьшения количества каналов следует использовать комбинацию split, merge, а также convertTo:

cv::Mat img_8UC4;

cv::Mat chans[4];
cv::split(img_8UC4,chans);

cv::Mat img_8UC3;
cv::merge(chans,3,img_8UC3);

cv::Mat img_32FC3;
img_8UC3.convertTo(img_32FC3);

Другой подход может заключаться в том, чтобы самостоятельно перекодировать алгоритм, что довольно просто и, вероятно, более эффективно.

2

OpenCV-х функция cvtColor позволяет конвертировать тип и количество каналов мата.

void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )

Таким образом, что-то вроде этого преобразовало бы цветной 4 канал в цветной 3 канал:

cvtColor(image, image, CV_BGRA2BGR, 3);

Или, возможно, более эффективно использовать функция mixChannels, если вы посмотрите документацию, то в ее примере показано, как разделить канал.

Тогда, если вы действительно хотите изменить его на определенный тип:

image.convertTo(image,CV_32F);
0