[筆記] EmguCV 封裝 OpenCV 函數庫的跨平台套件

Emgu CV 是一套跨平台的影像處理套件,它使用 .Net 核心將 OpenCV 的影像處理函數庫封裝成 Emgu CV。從 2008 年的 1.2 版本開始,Emgu不斷進化發展,於 2009 年推出 2.0 版本,並於 2015 年推出 3.0 版本,之後於 2019 年發佈 4.0 版本,目前已經更新至 4.7 版本。最新版本的 Emgu 支援多個平台,包括 Windows、Linux、iOS、安卓...等。此外,Emgu 還提供了 C#、C++、VB.NET 等語法的範例程式碼供開發人員參考。要使用 Emgu,開發環境需要使用微軟的 Visual Studio 2017 或更高版本。

        在實作一個 IP Cam 網路擷取影像的案例之前,讓我們先討論一下 Emgu 的一些缺點。在我的開發過程中,我發現 Emgu 存在一個重要問題,就是版本間的程式碼無法相容。例如,在使用 3.1 版本進行開發後,當升級到 4.2 版本時,許多函數的介面會有所變動,有些類別的命名也會發生改變,這導致程式碼無法在不同版本之間相容。這個問題是 Emgu 的一個重大缺點。

        開啟微軟的 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 檔案。

留言

此網誌的熱門文章

[筆記] Raspberry Pi 樹莓派的軟體開發

[應用] 在 ESP32 Audio 開發板的 VoIP 範例

[筆記] ESP32 在 VS Code 開發環境的編譯與除錯

[筆記] Visual Studio 遠端偵錯的設定步驟

[筆記] Android APP 藍芽範例說明 -- BluetoothChat

[應用] 藍芽 BLE client/server 架構:BLE remote controller

[模組] LD3320 離線語音辨識晶片與 ESP32 無線傳輸