opencv EmguCV show Mat in Image tag C# WPF

5jdjgkvh  于 2023-06-06  发布在  C#
关注(0)|答案(1)|浏览(211)

有没有办法在C#中的WPF图像标记中显示Mat对象?

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

还有,有没有办法在canvas/image标签内的图像上绘制,而不是在Imshow打开的新窗口上绘制?

CvInvoke.Imshow("ponaredek", slika);

最后,对于一个乞丐来说,哪个更好?EmguCV还是常规openCV?

dffbzjpn

dffbzjpn1#

如果你想显示你在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); }               
}

你将不得不在你的项目中添加一些引用,但这种方法在过去对我很有效。至于在图像上绘图,我不确定如何实现这一点,因为你必须在每次鼠标移动时更新你在图像上的绘图,你必须包含一些鼠标事件参数。

相关问题