Updated answer: Use CV_LOAD_IMAGE_UNCHANGED
flag to load all four channels (including Alpha) from the image. Then, use mixChannels()
and/or split()
to separate the alpha channel from others, and threshold on it, as explained below.
Very old answer:
OpenCV does not support alpha channel, only masking. If you want to read in PNG with alpha, use imagemagick first to extract alpha channel:
convert input.png -channel Alpha -negate -separate input-mask.png
Then in OpenCV you can do sth like this:
Mat_<float> mask = imread("input-mask.png", 0);
threshold(mask, mask, 254., 1., THRESH_BINARY);
... to get a real mask (usable as mask matrix in OpenCV operations). Or you can use it in your own operations without the thresholding. To apply the mask it may also be a good idea to extend it to three channels:
std::vector<Mat> marr(3, mask);
Mat_<Vec<float, 3> > maskRGB;
merge(marr, maskRGB);
After that you can test it like this:
imshow("Target", target);
imshow("Mask", mask*255);
imshow("Applied", target.mul(maskRGB));
waitKey();
Note: This is OpenCV 2.0 code.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…