Emgu CV 是一套處理影像的跨平台套件,它將 OpenCV 的影像處理函數庫透過 .Net 核心封裝成 Emgu CV。從 2008 年開始 Emgu 開發出 1.2 版本,2009 年推出 2.0,到了 2015 年進展到 3.0 版本,2019 年進到 4.0 版本,目前已經來到 4.7 的版本號了。最新的 Emgu 可以支援 WindowsLinuxiOS安卓...等各種平台,並且提供 C#C++VB.NET 等語言的範例程式碼,開發編譯的環境則需要 Visual Studio 2017 以上的版本。
 
        底下來實作一個 IP Cam 網路擷取影像的案例,實作過程前,先說說這套 Emgu 的缺點。我在開發的過程中發現版本間的程式碼無法相容,比如:開發用 3.1 版本,當升級到 4.2 版本後,很多函數的 interface 改了,有的類別名稱也改了,造成程式碼無法上下版本相容,這點是它的一大問題。
 
        開啟微軟的 Visual Studio 2017 / 2019 開發工具,創建一個專案,接著在專案裡載入 Emgu.CV 軟體套件。點擊 “管理 NuGet 套件” 後,出現如下圖所示的頁面,我們搜尋 Emgu,NuGet 會找到相關的套件,點擊安裝後,便會加載到我們的專案裡頭了。由於我們實作過程會用到 Windows Form,所以還需要安裝 Emgu.CV.UI,它會將 Windows Form 封裝起來並與 Emgu.CV 的影像函數整合,這樣我們就不需要為了 Image 格式的轉換傷腦筋。
圖一:搜尋 Emgu 相關的套件
 
圖二:安裝所需要的 Emgu.CV
 
        當我們安裝好 Emgu.CV 套件後,點擊 VS 2019 的工具箱,發現多出了一個 Emgu.CV 欄位,如下圖三紅色框所示。拖拉 ImageBox 這個元件,建立一個小螢幕用來顯示 IP Cam 的畫面,同時再拉一個小按鈕,用來切換建立或中斷 RTSP 影像連線。切記別用 Windows Form 工具裡的 PictureBox,它與 Emgu.CV 之間還需要進行 Image 格式的轉換,不是那麼容易處理,因此我還是建議用 Emgu.CV.UI 提供的工具來實現。
圖三:Emgu.CV 的工具箱

 

        下圖四是我用 C# 開發一個簡單的網路影像擷取程式,Emgu.CV 提供一個類別 VideoCapture 負責擷取影像,宣告如下。這兒有一點要提出,在 3.1 版本用的類別名稱是 Capture,到了 4.0 之後改成了 VideoCapture,所以程式碼不相容,介面也不太相容。
_capture = new VideoCapture("rtsp://admin:123abc@192.168.0.201:554");
 
圖四:網路擷取 IP Cam 的影像

 

if (_capture.IsOpened)  // 成功建立連線
{
     _capture.ImageGrabbed += ProcessFrame;  // 擷取影像的 event:ProcessFrame函數
     rtspBox.Size = new Size(_capture.Width, _capture.Height);
     Text = "RTSP 串流: " + _capture.Width.ToString() + " x " + _capture.Height.ToString();
}
在除錯或執行階段,如果彈出 "找不到 DLL" 的異常,這時需要到 Emgu 網站下載開源的版本,版本包裡面會有 x86x64相關的 DLL 檔案,這是因為從 NuGet 下載安裝的套件並沒有包含執行所需要的 DLL 檔案。
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 漢亞科技 Han-Ya 的頭像
    漢亞科技 Han-Ya

    漢亞科技 Han-Ya

    漢亞科技 Han-Ya 發表在 痞客邦 留言(0) 人氣()