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