OpenCV(Emgu.CV) - 用alpha合成图像

rou*_*tic 7 opencv alphablending image-processing emgucv

我正在使用Emgu.CV来执行一些基本的图像处理和合成.我的图片被加载为Image<Bgra,Byte>.

问题#1:当我使用该Image<,>.Add()方法时,无论alpha值如何,图像总是混合在一起.相反,我希望它们在另一个上面合成,并使用包含的alpha通道来确定图像应该如何混合.因此,如果我调用image1.Add(image2)image2中的任何完全不透明的像素将完全覆盖来自image1的像素,而半透明像素将基于alpha值进行混合.

这就是我想用视觉形式做的事情.有一个城市形象,一些"透明洞"被切掉,后面有一只青蛙.它应该是这样的:

在此输入图像描述

这就是openCV产生的.

这就是OpenCV(Emgu.CV)在我称之为

如何使用OpenCV获得此效果?它会像打电话一样快Add()吗?

问题2:有没有办法就地执行这个组合,而不是每次调用都创建一个新的图像Add()?(例如image1.AddImageInPlace(image2)修改字节 image1?)

注意:在Emgu.CV中寻找答案,我正在使用它,因为它处理透视变形的程度.

kar*_*lip 6

在OpenCV 2.4之前,没有支持带有alpha通道的PNG.

要验证您当前的版本是否支持它,请在加载您确定为RGBA的图像后打印通道数.如果它支持,应用程序将输出数字4,否则它将输出数字3(RGB).使用C API你会做:

IplImage* t_img = cvLoadImage(argv[1], CV_LOAD_IMAGE_UNCHANGED);
if (!t_img)
{
    printf("!!! Unable to load transparent image.\n");
    return -1;
}
printf("Channels: %d\n", t_img->nChannels);
Run Code Online (Sandbox Code Playgroud)

如果您无法更新OpenCV:

  • 还有 一些帖子围绕试图绕过这个限制,但我还没有测试他们自己;
  • 最简单的解决方案是使用另一个API加载图像并混合它,检查blImageBlending ;
  • 另一种替代方案,不是轻量级,是使用 Qt.

如果您的版本已支持带RGBA的PNG:

编辑:

我最近不得不处理这个问题,并且我已经演示了如何在这个答案上处理它.