【发布时间】:2014-07-10 16:36:14
【问题描述】:
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;
}
有没有办法在 C# 中优化上述内容?
我还研究过使用 OpencvSharp,但这似乎也不能提供对 gpu::alphaComp 的访问。
是否有任何可以进行 alpha 合成的 OpenCV C# 包装库?
AddWeighted 没有做我需要做的事情。
虽然类似,但question 没有提供答案
【问题讨论】: