2014-07-10 46 views
0

Emgu.CV(Nuget包2.4.2)並不像我可以告訴實現OpenCV中可用的gpu :: alphaComp方法。使用emgu.cv的Alpha複合圖像

因此,當試圖實現這種特定類型的組合時,它在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; 
    } 

有沒有辦法在C#中優化以上內容?

我另外看過使用OpencvSharp,但似乎並沒有提供對gpu :: alphaComp的訪問。

是否有任何OpenCV C#包裝庫可以做alpha合成?

AddWeighted不會做我需要做的事情。

雖然相似,這question沒有提供答案

回答

2

所以這麼簡單。

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; 
    }