OpenCV中的Alpha通道

时间:2009-09-20 13:29:16

标签: merge opencv rotation alpha

OpenCV支持alpha通道吗?或者有没有办法使用透明的png?我需要合并两个图像,其中第一个是背景,第二个是由cvWarpAffine旋转的图像。我可以通过逐个合并像素并省略具有某些值的像素来实现这一点,我在cvWarpAffine中的cvScalar中设置了这些值。但是,我不认为这是有意的解决方案。 谢谢你的建议

3 个答案:

答案 0 :(得分:8)

OpenCV不支持alpha通道,只支持屏蔽。如果你想用alpha读取PNG,首先使用imagemagick提取alpha通道:

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代码。

答案 1 :(得分:2)

这是一个bash脚本,我将它放在一起,执行ypnos对目录中所有png文件的ImageMagick转换。您可以通过使用find命令替换第三行中的*来使其递归。

#!/bin/bash

for file in *
do
    if [[ $file =~ (.+)-mask\.png ]]; then
        echo "Ignoring mask $file"
    elif [[ $file =~ (.+)\.png ]]; then
        echo "Generating mask for $file"
        basefn=${BASH_REMATCH[1]}
        convert "$basefn.png" -channel Alpha -negate -separate "$basefn-mask.png"
    fi
done

答案 2 :(得分:0)

输入:cam_frame-background,media_frame-foreground,media_frame_alpha-alpha。 输出:由alpha透明混合。 如果media_frame_alpha是IPL_DEPTH_8U则使用“cv :: merge”,因为矩阵必须具有相同的维度,大小和通道。如果用sse或avx构建opencv,请快速工作。如果使用cv:GpuMat更快,必须有nvidia cuda支持并使用cuda构建opencv。

inline cv::Mat frame_mix_alpha(cv::Mat &cam_frame,
 cv::Mat &media_frame,
 cv::Mat &media_frame_alpha)
{
    Mat suba = media_frame_alpha;
    //Mat alpha = cvCreateImage(media_frame_alpha.size(), IPL_DEPTH_8U, 1);
    //cvtColor(media_frame_alpha, alpha, CV_BGR2GRAY);

    //Mat suba;
    //Mat rgba[3] = { alpha, alpha, alpha };
    //merge(rgba, 3, suba);

    Mat subb = ~suba;

    //Mat mincam = min(cam_frame, suba);
    //Mat minmedia = min(media_frame, subb);
    //Mat result = (cam_frame - mincam) + (media_frame - minmedia);
    Mat result = (cam_frame - suba) + (media_frame - subb);

    return result;
}