opencv 将SoftwareBitmap转换为Mat for C#

gjmwrych  于 2023-08-06  发布在  C#
关注(0)|答案(2)|浏览(175)

我有一个SoftwareBitmap对象,我需要使用openCV处理。我还没有找到C#的代码来将SoftwareBitmap转换为Mat。我尝试使用C版本,但我没有太多的C经验,我有一些问题转换代码。有C#版本吗?

9gm1akwq

9gm1akwq1#

作为一个可能的解决方案-您可以将所需的C++编写的库链接到您的C#项目。

mf98qq94

mf98qq942#

在玩了几个小时这些东西之后。我带来了解决方案。我唯一不喜欢的是它必须在UI线程上执行(如果它在WinUI 3中调用不同,请抱歉)。

public static Mat ToMat(SoftwareBitmap source)
{
    var writable = new WriteableBitmap(source.PixelWidth, source.PixelHeight);
    source.CopyToBuffer(writable.PixelBuffer);

    var buffer = writable.PixelBuffer;
    using var reader = DataReader.FromBuffer(buffer);
    var bytes = new byte[buffer.Length];
    reader.ReadBytes(bytes);

    var mat = new Mat(source.PixelHeight, source.PixelWidth, DepthType.Cv8U, 4);
    mat.SetTo(bytes);

    return mat;
}

字符串
我在行为中执行这段代码,所以我像这样运行它。如果我在线程池中的线程中运行代码,我会得到一个异常。第一个月

this.DispatcherQueue.TryEnqueue(DispatcherQueuePriority.Normal,
() => mat =  ToMat(softwareBitmap));

更新另一种方法是使用Emgu.CV.Bitmap库将Mat转换为Bitmap对象

var mat = mat.ToBitmap();


之后,Bitmap可以转换为SoftwareBitmap或直接在应用程序中使用。Bitmap可以显示在WinUI3 Image控件上。

相关问题