原文: OpencvSharp 在WPF的Image控件中顯示圖像
1、安裝OpencvSharp
我使用的是VS2013 社群版,安裝OpencvSharp3.0
線上安裝方法:進入Tools,打開NuGet的包管理器
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuYGZyADMwgTZ2ETM4EWO2YjZ2UDZ1E2MiVWNkNWN4Q2MfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
安裝之後就可以使用,無需再做其他配置。
但是有個問題就是每建立一個解決方案就得重新下載下傳安裝,對網速慢的小夥伴很不友好。
離線安裝方法:
打開一個已經安裝過OpencvSharp3的解決方案的目錄,在Package目錄下有OpencvSharp的安裝包,
字尾為nupkg。
2、建立WPF工程
建立WPF工程,拖入兩個button,一個Image控件。
using OpenCvSharp;
之後在button1的響應函數下添加圖檔顯示的代碼:
Mat image = new Mat(@"girl.png", ImreadModes.Color);
Cv2.ImShow("Demo", image);
Cv2.WaitKey(0);
這樣就實作了圖檔顯示的功能,但是圖檔會顯示在一個彈出的視窗上,而不會顯示在Image控件上。
3、Bitmap 轉 BitmapImage
将圖檔顯示在Image控件上很簡單,隻需要設定Image控件的source屬性,可參考:WPF中使用Image控件顯示圖檔 - CSDN部落格
https://blog.csdn.net/chuangand/article/details/48031271WPFImge.Source = BitmapImage;
是以需要把Mat類型轉化為BitmapImage類型。
先把Mat轉化為Bitmap類型:
public Bitmap MatToBitmap(Mat image)
{
return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image);
}
再轉化為BitmapImage類型。
public BitmapImage MatToBitmapImage(Mat image)
{
Bitmap bitmap = MatToBitmap(image);
using (MemoryStream stream = new MemoryStream())
{
bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png); // 坑點:格式選Bmp時,不帶透明度
stream.Position = 0;
BitmapImage result = new BitmapImage();
result.BeginInit();
// According to MSDN, "The default OnDemand cache option retains access to the stream until the image is needed."
// Force the bitmap to load right now so we can dispose the stream.
result.CacheOption = BitmapCacheOption.OnLoad;
result.StreamSource = stream;
result.EndInit();
result.Freeze();
return result;
}
}
最後在button2的響應函數中添加顯示圖像的代碼:
private void button2_Click(object sender, RoutedEventArgs e)
{
try
{
Mat image = new Mat(@"girl.png", ImreadModes.Color);
WPFImge.Source = MatToBitmapImage(image);
}
catch(Exception exp)
{
MessageBox.Show(exp.ToString());
return;
}
}
參考文獻:
c# 4.0 - How can I convert Mat to Bitmap using OpenCVSharp? - Stack Overflow
https://stackoverflow.com/questions/37540750/how-can-i-convert-mat-to-bitmap-using-opencvsharp【C#/WPF】Bitmap、BitmapImage、ImageSource 、byte[]轉換問題 - CSDN部落格
https://blog.csdn.net/qq_18995513/article/details/536935544、添加引用:using和reference
上一節中用到的變量類型對應的命名空間如下:
using System.Windows.Media.Imaging; //使用BitMapImage類型
using OpenCvSharp; //OpencvSharp
using System.Drawing; //使用Bitmap類型
using System.IO; //使用MemoryStream類型
如果代碼中添加了命名空間還是報錯,就需要手動添加reference。
首先看看用到的命名空間是否在現有的reference中:
如果沒有,就要手動Add Reference…比如我建立的項目中就沒有自動添加Drawing這個命名空間: