天天看點

OpencvSharp 在WPF的Image控件中顯示圖像

原文: OpencvSharp 在WPF的Image控件中顯示圖像

1、安裝OpencvSharp

我使用的是VS2013 社群版,安裝OpencvSharp3.0

線上安裝方法:進入Tools,打開NuGet的包管理器

OpencvSharp 在WPF的Image控件中顯示圖像
搜尋Opencv
OpencvSharp 在WPF的Image控件中顯示圖像

安裝之後就可以使用,無需再做其他配置。

但是有個問題就是每建立一個解決方案就得重新下載下傳安裝,對網速慢的小夥伴很不友好。

離線安裝方法:

打開一個已經安裝過OpencvSharp3的解決方案的目錄,在Package目錄下有OpencvSharp的安裝包,

字尾為nupkg。

OpencvSharp 在WPF的Image控件中顯示圖像
打開建立的未安裝OpencvSharp的解決方案,進到Tools,NuGet管理器,選擇左下角的Setting。
OpencvSharp 在WPF的Image控件中顯示圖像
添加一個package source,并将其source設定為剛才OpencvSharp安裝包所在的目錄即可,然後取一個好記得名字。
OpencvSharp 在WPF的Image控件中顯示圖像
回到NuGet包管理界面,會發現Online裡多了一個Package Source 選項,這個選項裡可以看到剛才目錄下的安裝包,點選安裝即可。
OpencvSharp 在WPF的Image控件中顯示圖像

2、建立WPF工程

建立WPF工程,拖入兩個button,一個Image控件。

OpencvSharp 在WPF的Image控件中顯示圖像
為了使用OpencvSharp,需要在檔案開頭添加:

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/48031271
WPFImge.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/53693554

4、添加引用:using和reference

上一節中用到的變量類型對應的命名空間如下:

using System.Windows.Media.Imaging; //使用BitMapImage類型
using OpenCvSharp;    //OpencvSharp
using System.Drawing; //使用Bitmap類型
using System.IO; //使用MemoryStream類型      

如果代碼中添加了命名空間還是報錯,就需要手動添加reference。

首先看看用到的命名空間是否在現有的reference中:

OpencvSharp 在WPF的Image控件中顯示圖像
OpencvSharp 在WPF的Image控件中顯示圖像

如果沒有,就要手動Add Reference…比如我建立的項目中就沒有自動添加Drawing這個命名空間:

OpencvSharp 在WPF的Image控件中顯示圖像

繼續閱讀