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


1、安裝OpencvSharp

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

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

image

搜索Opencv

image

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

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

離線安裝方法:

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

后綴為nupkg。

image

打開新建的未安裝OpencvSharp的解決方案,進到Tools,NuGet管理器,選擇左下角的Setting。

image

添加一個package source,並將其source設置為剛才OpencvSharp安裝包所在的目錄即可,然后取一個好記得名字。

image

回到NuGet包管理界面,會發現Online里多了一個Package Source 選項,這個選項里可以看到剛才目錄下的安裝包,點擊安裝即可。

image

2、建立WPF工程

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

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中:

imageimage

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

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM