У меня есть изображение, которое имеет 4 канала и находится в 4 * UINT8
формат.
Я пытаюсь преобразовать его в 3-х канальный float, и я использую этот код:
images.convertTo(images,CV_32FC3,1/255.0);
После преобразования изображение находится в формате с плавающей точкой, но все еще имеет 4 канала. Как мне избавиться от 4-го (альфа) канала в OpenCV?
Как сказал @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);