ตรวจจับวัตถุที่กำลังเคลื่อนไหว

                การตรวจจับวัตถุที่กำลังเคลื่อนไหวในวีดีโอ สามารถทำได้โดยอาศัยหลักการของ 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 ความคิดเห็น

March 13, 2013 at 7:49 AM
This comment has been removed by the author.
Reply
March 13, 2013 at 7:51 AM

ขอดูโค้ดฉบับเต็มได้มั้ยครับ
คือผมลอง copy โค้ดไปใส่ lab5 แล้วแต่มัน error คือ

ไม่รู้จัก cameraImage กับ frameCount

ผมเลยไปประกาศไว้นอกสุดครับ

public partial class Form1 : Form
{
Emgu.CV.Capture capture;
Image cameraImage; //<<--ผมเพิ่มตรงนี้
int frameCount = 0; //<<--ผมเพิ่มตรงนี้
...
...
...
}

ประมาณนี้ครับ ไม่รู้ว่าถูกหรือเปล่า แต่ดูเหมือนจะผิดครับ คือมันทำได้แค่ ตรวจทุกอย่างที่ไม่ใช่สีขาว จะกลายเป็นเงาดำทั้งหมดแค่นั้นเองครับ
ก็เลยอยากเห็นตัวโค้ดฉบับเต็ม
รบกวนด้วยครับ...

Reply
March 13, 2013 at 3:13 PM

@Famez ZyrenZe' คุณประกาศ cameraImage และ frameCount ไว้ในส่วนนั้นก็ถูกแล้วครับ แต่วัตถุประสงค์ของ Lab8 นี้คือ เราจะตรวจหาวัตถุที่กำลังเคลื่อนไหว ถ้าวัตถุไหนกำลังเคลื่อนไหวจะเป็นสีขาวนะครับ

ส่วนลิ้งดาวโหลดอยู่นี้นะครับ : http://www.mediafire.com/?omr7vy15p35nong

Reply
March 14, 2013 at 4:52 AM

ขอบคุณครับ :)

Reply
March 28, 2013 at 6:13 PM

ขอบคุณครับ

Reply
July 27, 2013 at 7:54 PM

ผมก็เป้นเหมือน Famez ZyrenZe' ว่าครับเหมือนมันแค่แปลงเป้นไบนารี่

Reply
September 16, 2013 at 3:00 PM

ลองนำของคุณไปใช้ add reference and path ก็ยัง The type initializer for 'Emgu.CV.CvInvoke' threw an exception.


Reply
Anonymous
October 15, 2013 at 4:55 PM

จะสร้างกรอบสี่เหลี่ยมมา Detect วัตถุที่กำลังเคลื่อนไหวนี่ ต้องทำยังไงหรอครับ

Reply
February 12, 2018 at 10:14 AM

ขอโค้ดเต็มๆหน่อยค่ะ มันไม่ขึ้นเว็บที่ให้มาโหลดไม่ได้ค่ะ

Reply

Post a Comment

Templated by Blogger Items