3

我正在使用 Winforms 中的 Emgu Cv 使用 Kinect 进行人脸识别。现在,我想转移到 WPF。但是,EmguCv 库仅支持Bitmap类。

我可以在 WPF 中使用 Bitmap 类(在 Winforms 中使用)吗?如果没有,是否有其他方法可以在 WPF 中使用 Emgu cv 和 kinect?

谢谢。

4

1 回答 1

10

System.Drawing.Bitmap不能直接用作 WPF 的图像源,所以必须将其转换为System.Windows.Media.Imaging.BitmapSource.

最好的方法是使用Imaging.CreateBitmapSourceFromHBitmap.

您可以使用扩展方法:

[DllImport("gdi32")]
private static extern int DeleteObject(IntPtr o);

public static BitmapSource ToBitmapSource(this System.Drawing.Bitmap source)
{
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }

    IntPtr ip = source.GetHbitmap();
    try
    {
        return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(ip,
            IntPtr.Zero, Int32Rect.Empty,
            System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
    }
    finally
    {
        DeleteObject(ip);
    }
}

请注意,您必须调用DeleteObject,因为会Bitmap.GetHbitmap()泄漏 GDI 句柄(请参阅答案)。

拥有BitmapSource后,您可以使用Image控件并通过设置Source属性来显示它。

您可以在本文中阅读有关 WPF 成像的更多信息:成像概述

于 2012-09-11T12:46:13.760 回答