有這兩個基礎的功能,我們很容易就可以把WebCam 變成 QRCode Reader
一開始先做畫面
先拉一個button,label,pictureBox
在button的處裡事件裡面寫
開啟攝影機和Timer
這是WebCam錄影拍照 的一些方法
private void button1_Click(object sender, EventArgs e)
{
openWebCam();
_timer.Start();
}
觸發Tiemr之後就每0.1秒擷取畫面一次
將畫面顯示在 pictureBox 中
並且將擷取的畫面丟給QRCode Reader去解碼
當成功讀到QRCode時,將當時的影像儲存下來
private void TimerEventProcessor(object sender, EventArgs e)
{
Image<Bgr, Byte> frame = cap.QueryFrame(); // Query 攝影機的畫面
pictureBox1.Image = frame.ToBitmap(); // 把畫面轉換成bitmap型態,在丟給pictureBox元件
//宣告 QRCode Reader 物件
ZXing.IBarcodeReader reader = new ZXing.BarcodeReader();
// bitmap = (System.Drawing.Bitmap)System.Drawing.Bitmap.FromFile(@"D:\Test\QRCode\temp.png");
//將攝影影擷取的畫面直接丟進Reader 進行解碼
ZXing.Result result = reader.Decode(frame.ToBitmap());
if (result != null)
{ //如果有成功解讀,則顯示文字
//在Thread裡面不能直接跟控制項(Text)互動,所以使用委派(Delegate)的方式
this.Invoke(new InvokeFunction(this.TrueFunction), new object[] { result.Text });
//將解讀成功的影像存下來
//儲存路徑
_fileName = string.Format("{0}{1}{2}", _phtoDirectory, DateTime.Now.ToString("yyyyMMddHmmss"), ".PNG");
//儲存影像
frame.Save(_fileName);
}
}
當成功讀到QRCode的同時也顯示在畫面上
這邊就要使用委派(Delegate)的方式
private delegate void InvokeFunction(string msg);
private void TrueFunction(string msg)
{
//顯示QRCode訊息
this.label1.Text = msg;
}
之後到 D:\Test\QRCode
就可以發現成功讀取時的影像了
討論:
我使用的攝影機是只有500萬畫素沒有自動對焦的WebCam
一開始在測試時都讀不到QRCode,後來慢慢測試各種距離才發現
只有大概在距離60公分左右才讀的到...
當然每一款攝影機的焦距都不一樣,所以就要多試幾次吧
但是如果有自動對焦的WebCam效果應該很好吧
DEMO
沒有留言:
張貼留言