Alpha channel in OpenCV

后端 未结 3 396
遥遥无期
遥遥无期 2020-12-10 09:19

does OpenCV support alpha-channel? Or is there any way to work with transparent png? I need to merge two images, where the first one is background and the second one is imag

3条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-10 09:37

    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_ 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 marr(3, mask);
    Mat_ > 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.

提交回复
热议问题