使用C# EmguCV來擷取D-Link DCS-930 IP Cam的影像範例

此篇文章分享如何使用C# EmguCV來擷取D-Link DCS-930 IP Cam的影像,其實把影像抓回來之後我還想要再做更多的處理以及判斷辨識,以便達到某些目的。

但其實因為各家IP CAM支援的串流方式不太一樣,所以開發前最好要看一下你買的IP CAM有沒有支援。

 

此篇文章分享如何使用.net EmguCV來擷取D-Link DCS-930 IP Cam的影像,其實把影像抓回來之後我還想要再做更多的處理以及判斷辨識,以便達到某些目的。

但其實因為各家IP CAM支援的串流方式不太一樣,所以開發前最好要看一下你買的IP CAM有沒有支援。至於為什麼買這款呢? 痾...因為便宜...對! 這款只要台票$800多而已,當然我相信還有更好的CP值選擇,但因為小編我懶得再去找了,所以就直接選擇D-Link DCS-930L這款IP CAM。

在寫這個範例和文章的時候,我突然想起我一個大學同學叫CCN https://twitter.com/ccn ,這東西在大學的時候他已經有實作過範例了,那個OpenCV不盛行(甚至有沒有都不知道)的年代他應該是透過Web Request截圖回來變成影像,並且還能控制IP CAM的上下左右旋轉機構。

首先你必須照著說明書把DLink-DC930L初始化設定搞定,讓他處於可以工作的狀態,並使用瀏覽器測試可正確連到該IP CAM。

然後就準備開專案下載EmguCV,EmguCV 是從 OpenCV裡包成專給 C#用的專門用來處理影像相關的一個函式庫,我是透過NuGet 直接下載,並解在工具->選擇工具箱項目瀏覽加入Emgu.CV.UI.dll,Visual Studio就會自動幫你加入PictureBox等等的Emgu元件,你就可以在工具箱使用它們了。

程式碼的關鍵其實就是在於 可以使用Capture 這個類別來存放影像,並Show在PictureBox上。

程式碼如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


using System.Threading;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;

namespace EmguCV_10130206
{
    public partial class Form1 : Form
    {
        private Capture _capture = null;
        private bool _captureInProgress;

        public Form1()
        {
            InitializeComponent();
            CvInvoke.UseOpenCL = false;
            try
            {
                //"http://帳號:密碼@你的IP/video.cgi?.mjpg"
                _capture = new Capture("http://admin:MyPW999@192.168.1.110/video.cgi?.mjpg");//
                _capture.ImageGrabbed += ProcessFrame;
            }
            catch (NullReferenceException excpt)
            {
                MessageBox.Show(excpt.Message);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private void ProcessFrame(object sender, EventArgs arg)
        {
            Mat frame = new Mat();
            _capture.Retrieve(frame, 0);

            captureImageBox.Image = frame;



        }
        private void captureButton_Click(object sender, EventArgs e)
        {
            if (_capture != null)
            {
                if (_captureInProgress)
                {  //stop the capture
                    captureButton.Text = "Start Capture";
                    _capture.Pause();
                }
                else
                {
                    //start the capture
                    captureButton.Text = "Stop";
                    _capture.Start();
                }

                _captureInProgress = !_captureInProgress;
            }
        }
    }
}

PS.請忽略我超亂的桌面= =