使用 emgu.cv 的 Alpha 合成图像

Emi*_*ile 1 c# opencv emgucv

据我所知,Emgu.CV(Nuget 包 2.4.2)没有实现 OpenCV 中可用的 gpu::alphaComp 方法。

因此,当尝试实现这种特定类型的组合时,C# 的速度慢得令人难以置信,以至于它占用了我的应用程序总 CPU 使用量的 80% 左右。

这是我最初的解决方案,但效果非常糟糕。

    static public Image<Bgra, Byte> Overlay( Image<Bgra, Byte> image1, Image<Bgra, Byte> image2 )
    {

        Image<Bgra, Byte> result = image1.Copy();
        Image<Bgra, Byte> src = image2;
        Image<Bgra, Byte> dst = image1;

        int rows = result.Rows;
        int cols = result.Cols;
        for (int y = 0; y < rows; ++y)
        {
            for (int x = 0; x < cols; ++x)
            {
                // http://en.wikipedia.org/wiki/Alpha_compositing
                double  srcA = 1.0/255 * src.Data[y, x, 3];
                double dstA = 1.0/255 * dst.Data[y, x, 3];
                double outA = (srcA + (dstA - dstA * srcA));
                result.Data[y, x, 0] = (Byte)(((src.Data[y, x, 0] * srcA) + (dst.Data[y, x, 0] * (1 - srcA))) / outA);  // Blue
                result.Data[y, x, 1] = (Byte)(((src.Data[y, x, 1] * srcA) + (dst.Data[y, x, 1] * (1 - srcA))) / outA);  // Green
                result.Data[y, x, 2] = (Byte)(((src.Data[y, x, 2] * srcA) + (dst.Data[y, x, 2] * (1 - srcA))) / outA); // Red
                result.Data[y, x, 3] = (Byte)(outA*255);
            }
        }
        return result;
    }
Run Code Online (Sandbox Code Playgroud)

有没有办法在 C# 中优化上述内容?

我还考虑过使用 OpencvSharp,但这似乎也不提供对 gpu::alphaComp 的访问。

有没有可以进行 alpha 合成的 OpenCV C# 包装器库?

AddWeighted 没有做我需要它做的事情。

虽然类似,但这个问题没有提供答案

Emi*_*ile 5

就这么简单。

    public static Image<Bgra, Byte> Overlay(Image<Bgra, Byte> target, Image<Bgra, Byte> overlay)
    {
        Bitmap bmp = target.Bitmap;
        Graphics gra = Graphics.FromImage(bmp);
        gra.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
        gra.DrawImage(overlay.Bitmap, new Point(0, 0));

        return target;
    }
Run Code Online (Sandbox Code Playgroud)