Emgu CV 是一套處理影像的跨平台套件,它將 OpenCV 的影像處理函數庫透過 .Net 核心封裝成 Emgu CV。從 2008 年開始 Emgu 開發出 1.2 版本,2009 年推出 2.0,到了 2015 年進展到 3.0 版本,2019 年進到 4.0 版本,目前已經來到 4.7 的版本號了。最新的 Emgu 可以支援 Windows、Linux、iOS、安卓...等各種平台,並且提供 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.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 網站下載開源的版本,版本包裡面會有 x86、x64相關的 DLL 檔案,這是因為從 NuGet 下載安裝的套件並沒有包含執行所需要的 DLL 檔案。
全站熱搜
留言列表