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

у меня есть изображение, которое имеет 4 канала и в .

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

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

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

3 ответов


как сказал @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

функции 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);

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


в формате 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);