04 March 2012
這篇似乎是我歷年來第一篇有關M$的筆記.........
真是寫得有點心不甘情不願XD
畢竟本人真的是沒有很喜歡M$的東西,
當然不是因為M$不好,M$也有它好的一面,
只能說或許是習慣問題....

OK,進入正題,
這篇主要是去說明如何利用C#去控制你的網路攝影機,
且是使用Emgu這套dll,
甚麼是Emgu呢?
他和OpenCV有點關聯,
OpenCV相信不管是Java, C, C++等language的開發者,都了解OpenCV是甚麼!?
簡單說,OpenCV是一套強大的影像處理library,由INTEL開發,
非常強大,甚至你可以利用OpenCV去做到OCR,很方便。
也由於OpenCV沒有支援C#,那C#要怎麼使用OpenCV呢?
就是靠EmguEmgu是一套允許OpenCV的function在C#等語言中被使用。

但我們這邊並不會使用到OpenCV的功能,
就是簡單的介紹Emgu很基本的功能,
就是存取攝影機,
首先先去下載Emgu,並且安裝
安裝完成以後就可以開始寫程式....

看你是要開啟一個WPF專案,還是一個Window Form專案,
建議你開啟Window Form,因為到時Webcam回傳回來的image型態,
可以直接在 Window Form中的pictureBox裡面使用。

開啟以後,就在你的專案中加入reference,
加入以下四個dll,dll的位置就是在你安裝Emgu位置的bin底下:

  1. Emgu.CV.dll
  2. Emgu.CV.ML.dll
  3. Emgu.CV.UI.dll
  4. Emgu.Util.dll

加入以後,請先儲存你的專案,
儲存以後請在你安裝Emgu位置的bin底下找到兩個dll,

  1. opencv_core231.dll
  2. opencv_highgui231.dll

把這兩個dll放置到你的專案的/bin/Debug/底下。
因為Emgu.CV.dll會使用到上述兩個dll。


完成上述動作以後就開始寫code,
先import會使用到的lib,如下:
using Emgu.CV;
using Emgu.CV.Structure;


先宣告一個Capture物件,如下:
private Capture cap = null;                 // Webcam物件
這個物件就是用來連結到你的webcam。


接著在Form1_Load event中,
連結到攝影機以及建立一個event用來抓取畫面,如下:
private void Form1_Load(object sender, EventArgs e)
{
cap = new Capture(0); // 連結到攝影機0,如果你有兩台攝影機,第二台就是1
Application.Idle += new EventHandler(Application_Idle); // 在Idle的event下,把畫面設定到pictureBox上(當然你也可以用timer事件)
}


接下來要寫抓取畫面event的code,
        void Application_Idle(object sender, EventArgs e)
{
Image<Bgr, Byte> frame = cap.QueryFrame(); // 去query該畫面
pictureBox1.Image = frame.ToBitmap(); // 把畫面轉換成bitmap型態,在餵給pictureBox元件
}


完成以後按下F5執行,應該就可以順利取得攝影機畫面瞜!





blog comments powered by Disqus