OpenCV是否支持alpha通道?或者有没有办法处理透明的png图像?我需要合并两张图片,其中第一张是背景图片,第二张是通过cvWarpAffine旋转后的图片。我可以逐个像素地合并这两张图片,并忽略一些值,在cvScalar中设置cvWarpAffine。然而,我认为这不是一个理想的解决方案。 感谢建议。
CV_LOAD_IMAGE_UNCHANGED
标志从图像中加载所有四个通道(包括Alpha)。然后,使用mixChannels()
和/或split()
将alpha通道与其他通道分离,并对其进行阈值处理,如下所述。
非常旧的回答:
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的代码。
这里有一个bash脚本,可以对目录中的所有png文件执行ypnos给出的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