此篇文章分享如何使用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.請忽略我超亂的桌面= =