Search for motion detection on emgucv

I am new to emgu cv; I am trying to find a code that does motion detection. I tried this:

CvInvoke.cvAbsDiff(frame, _backgroundImage, BgDifference); 

... but I have lighting problems. I want to get white pixels where there was movement, and then draw a rectangle there is only one rectangle, but I take more areas with white pixels.

What do I need to do? Can I try another function?

+1
c # motion-detection emgucv
source share
2 answers

Convert one frame to grayscale. Convert new frames from real time to shades of gray. Make abstractions between the first frame and the new frame in real time. The result of this is a third, new frame consisting of the differences between the first two. Use erosion and thresholding to do this to get a frame with white representing the moving section and black representing the rest of the space.

Here is the code snippet:

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Emgu.CV; using Emgu.CV.UI; using Emgu.CV.CvEnum; using Emgu.CV.Structure; using System.Diagnostics; using System.IO; using System.Data.SqlClient; using System.Data.SqlServerCe; using System.Drawing.Imaging; namespace ptuxiakh___ { public partial class Form1 : Form { Capture _capture = new Capture(); Capture capture2 = new Capture(); Image<Bgr, Byte> FirstImage = new Image<Bgr, Byte>(640, 480); Image<Bgr, Byte> RealTimeImage = new Image<Bgr, Byte>(640, 480); Image<Gray, Byte> des = new Image<Gray, Byte>(640, 480); Image<Gray, Byte> thres = new Image<Gray, Byte>(640, 480); Image<Gray, Byte> eroded = new Image<Gray, Byte>(640, 480); bool baground = false; private void Background() { try { FirstImage = _capture.QueryFrame(); background = true; } catch(Exception e) { baground = false; } } private void Tracking(object sender, EventArgs e) { if (baground == true) { RealTimeImage = capture2.QueryFrame(); CvInvoke.cvAbsDiff(FirstImage.Convert<Gray, Byte>(), RealTimeImage.Convert<Gray, Byte>(), des); CvInvoke.cvThreshold(des, thres, 20, 255, THRESH.CV_THRESH_BINARY); CvInvoke.cvErode(thres, eroded, IntPtr.Zero, 2); } else { Background(); // At first trying to get a static frame for // abstraction with real time frame } } private void StartButton_Click(object sender, EventArgs e) { Application.Idle += new EventHandler(Tracking); } private void Stopbutton_Click(object sender, EventArgs e) { Application.Idle -= new EventHandler(Tracking); } 
+1
source share

You can use the MotionHistory class. EmguCV includes an example of motion detection (if it is no longer displayed, you can see it here ). With this class, you can get motionImage, and then you only need to count the pixels to check the largest area.

+1
source share

All Articles