Обновленный ответ: Используйте флаг CV_LOAD_IMAGE_UNCHANGED
для загрузки всех четырех каналов (включая альфа-канал) из изображения. Затем используйте mixChannels()
и / или split()
, чтобы отделить альфа-канал от других, и установите для него пороговое значение, как описано ниже.
Очень старый ответ:
OpenCV не поддерживает альфа-канал, только маскирование. Если вы хотите читать в формате PNG с альфа-каналом, сначала используйте imagemagick для извлечения альфа-канала:
convert input.png -channel Alpha -negate -separate input-mask.png
Тогда в OpenCV вы можете сделать следующее:
Mat_<float> mask = imread("input-mask.png", 0);
threshold(mask, mask, 254., 1., THRESH_BINARY);
... чтобы получить настоящую маску (может использоваться как матрица масок в операциях OpenCV). Или вы можете использовать его в своих собственных операциях без порога. Чтобы применить маску, было бы неплохо расширить ее до трех каналов:
std::vector<Mat> marr(3, mask);
Mat_<Vec<float, 3> > maskRGB;
merge(marr, maskRGB);
После этого вы можете проверить это так:
imshow("Target", target);
imshow("Mask", mask*255);
imshow("Applied", target.mul(maskRGB));
waitKey();
Примечание: Это код OpenCV 2.0.