Почему функция 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);