【问题标题】:EmguCV show Mat in Image tag C# WPFEmguCV 在图像标签 C# WPF 中显示 Mat
【发布时间】:2020-06-29 23:34:14
【问题描述】:

有没有办法在 c# 中的 WPF 图像标签内显示 Mat 对象?

Mat image= CvInvoke.Imread(op.FileName, Emgu.CV.CvEnum.ImreadModes.AnyColor);

另外,有没有办法在画布/图像标签内的图像上绘制,而不是 Imshow 打开的新窗口?

CvInvoke.Imshow("ponaredek", slika);

最后,对于初学者来说,哪个更好用? EmguCV 还是普通的 openCV?

【问题讨论】:

  • EmguCV 是 openCV ** for ** C# 的包装器(.Net langs 真的)

标签: c# wpf opencv emgucv


【解决方案1】:

如果您想在 WPF 中显示您读取的图像,则可以使用 Xaml 中的图像源。您应该将 Mat 对象转换为位图,然后将位图转换为图像源对象,因为这是显示图像所必需的。此处的stack 表单详细介绍了如何执行此操作。

首先将您的 Mat 对象转换为位图。

//Convert the Mat object to a bitmap
Bitmap img = image.ToBitmap();

//Using the method below, convert the bitmap to an imagesource
imgOutput.Source = ImageSourceFromBitmap(img);

我上面调用的函数可以通过下面的代码实现。

//If you get 'dllimport unknown'-, then add 'using System.Runtime.InteropServices;'
[DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DeleteObject([In] IntPtr hObject);

public ImageSource ImageSourceFromBitmap(Bitmap bmp)
{
    var handle = bmp.GetHbitmap();
    try
    {
        return Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
    }
    finally { DeleteObject(handle); }               
}

您必须为您的项目添加一些引用,但这种方法过去对我有用。至于在图像上绘图,我不确定如何完成,因为每次鼠标移动时您都必须更新您在图像上的绘图,您必须合并一些鼠标事件参数。

【讨论】:

  • 这段代码是否使用默认的opencv?因为 EmguCV Mat 没有 ToBitmap() 方法
  • 应该,你用的是什么版本的EmguCV?此外,您必须包含另一个参考才能在 c# 中使用位图。下面我写的代码只兼容Emgucv和c#,不兼容opencv。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多