- 9 ความคิดเห็น
ตรวจจับวัตถุที่กำลังเคลื่อนไหว
การตรวจจับวัตถุที่กำลังเคลื่อนไหวในวีดีโอ
สามารถทำได้โดยอาศัยหลักการของ background
subtraction ซึ่งเป็นเทคนิคที่ง่ายและให้ผลลัพธ์ที่ยอดเยี่ยม
หลักการ
background
subtraction เป็นเทคนิคที่ใช้ในการหาความต่างของเฟรม
foreground กับเฟรม background โดยประโยชน์ของการทำ
background subtraction
นั้นจะสามารถบอกได้ว่ามีวัตถุอะไรที่กำลังเคลื่อนไหวอยู่ในเฟรม foreground
|foreground(x,y) – background(x,y)|
จากสมการข้างต้น เมื่อเรานำภาพทั้งสองเฟรมมาลบกันแล้ว
ก็ต้องทำ Threshold ต่อเพื่อเป็นการแยกวัตถุที่เคลื่อนไหวในภาพ
กับวัตถุที่ไม่ได้เคลื่อนไหว โดยค่า Threshold นั้นก็แล้วแต่เราจะปรับค่าเอง
ส่วนผลลัพธ์จะขึ้นอยู่กับค่า Threshold ถ้าปรับให้มีค่ามากเกินไปจะทำให้มี
noise เยอะ แต่ถ้าปรับไว้น้อยเกินไป จะทำให้ได้พื้นที่ของวัตถุที่กำลังเคลื่อนไหวมีน้อยเกินไป
Code
ใน emgucv
มีฟังค์ชั่นในการทำ background subtraction
ไว้แล้วคือ CvAbsDiff ซึ่ง CvAbsDiff นั้นสามารถอธิบายได้ดังนี้ dst(I)c = abs(src1(I)c - src2(I)c) โดยที่ dst , src1 และ src2
ต้องเป็นประเภทเดียวกัน(Gray,bgr hsv) และจะต้องมีขนาดเท่ากัน ตัวอย่างโค๊ดข้างล่างผมได้ทำ Lab5 มาเขียนเพิ่มนะครับ
private void process() { cameraImage = capture.QueryFrame(); Image<Gray, float> backgroundImg = new Image<Gray, float>(cameraImage.Width, cameraImage.Height); Image<Gray, float> foregroundImg = new Image<Gray, float>(cameraImage.Width, cameraImage.Height); Image<Gray, float> resultImg = new Image<Gray, float>(cameraImage.Width, cameraImage.Height); foregroundImg = cameraImage.Convert<Gray, float>(); if (cameraImage != null) { if (frameCount == 0) { //Update Background backgroundImg = foregroundImg; CvInvoke.cvRunningAvg(foregroundImg, backgroundImg, 0.009, System.IntPtr.Zero); } else { CvInvoke.cvRunningAvg(foregroundImg, backgroundImg, 0.009, System.IntPtr.Zero); CvInvoke.cvAbsDiff(backgroundImg, foregroundImg, foregroundImg); //Noise reduce CvInvoke.cvSmooth(foregroundImg, foregroundImg, SMOOTH_TYPE.CV_GAUSSIAN, 13, 13, 3, 1); foregroundImg = foregroundImg.ThresholdBinary(new Gray(100), new Gray(255)); } frameCount++; pbShowCamera.Image = cameraImage.ToBitmap(); pbShowCamera2.Image = foregroundImg.ToBitmap(); } }
รูปจากวีดีโอ เมื่อไม่มีวัตถุอะไรเคลื่อนไหวในภาพ ผลลัพธ์จะได้เป็นหน้าจอมืดๆ นะครับ
เมื่อมีมือโผล่เข้ามาในภาพ ก็จะทำให้ผลลัพธ์ตรวจเจอวัตถุที่เคลื่อนไหว
|
9 ความคิดเห็น
ขอดูโค้ดฉบับเต็มได้มั้ยครับ
คือผมลอง copy โค้ดไปใส่ lab5 แล้วแต่มัน error คือ
ไม่รู้จัก cameraImage กับ frameCount
ผมเลยไปประกาศไว้นอกสุดครับ
public partial class Form1 : Form
{
Emgu.CV.Capture capture;
Image cameraImage; //<<--ผมเพิ่มตรงนี้
int frameCount = 0; //<<--ผมเพิ่มตรงนี้
...
...
...
}
ประมาณนี้ครับ ไม่รู้ว่าถูกหรือเปล่า แต่ดูเหมือนจะผิดครับ คือมันทำได้แค่ ตรวจทุกอย่างที่ไม่ใช่สีขาว จะกลายเป็นเงาดำทั้งหมดแค่นั้นเองครับ
ก็เลยอยากเห็นตัวโค้ดฉบับเต็ม
รบกวนด้วยครับ...
@Famez ZyrenZe' คุณประกาศ cameraImage และ frameCount ไว้ในส่วนนั้นก็ถูกแล้วครับ แต่วัตถุประสงค์ของ Lab8 นี้คือ เราจะตรวจหาวัตถุที่กำลังเคลื่อนไหว ถ้าวัตถุไหนกำลังเคลื่อนไหวจะเป็นสีขาวนะครับ
ส่วนลิ้งดาวโหลดอยู่นี้นะครับ : http://www.mediafire.com/?omr7vy15p35nong
ขอบคุณครับ :)
ขอบคุณครับ
ผมก็เป้นเหมือน Famez ZyrenZe' ว่าครับเหมือนมันแค่แปลงเป้นไบนารี่
ลองนำของคุณไปใช้ add reference and path ก็ยัง The type initializer for 'Emgu.CV.CvInvoke' threw an exception.
จะสร้างกรอบสี่เหลี่ยมมา Detect วัตถุที่กำลังเคลื่อนไหวนี่ ต้องทำยังไงหรอครับ
ขอโค้ดเต็มๆหน่อยค่ะ มันไม่ขึ้นเว็บที่ให้มาโหลดไม่ได้ค่ะ
Post a Comment