在emgucv上寻找运动检测function

我是emgu cv的新手; 我正在尝试找到一个可以进行运动检测的代码。 我试过这个:

CvInvoke.cvAbsDiff(frame, _backgroundImage, BgDifference); 

……但我有照明问题。 我希望得到有运动的像素的白色,然后画一个矩形只有一个矩形,但我采用更多的白色像素区域。

我需要做什么? 我可以尝试另一个function吗?

将单个帧转换为灰度。 将新帧从实时转换为灰度。 从实时开始在第一帧和新帧之间进行抽象。 结果是第三个新框架,由前两个框架​​之间的差异组成。 使用侵蚀和阈值来获得一个框架,白色代表运动部分,黑色代表空间的其余部分。

这是一段代码:

 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 FirstImage = new Image(640, 480); Image RealTimeImage = new Image(640, 480); Image des = new Image(640, 480); Image thres = new Image(640, 480); Image eroded = new Image(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(), RealTimeImage.Convert(), 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); } 

您可以使用MotionHistory类。 EmguCV包含一个运动检测示例(如果它不再存在,您可以在此处看到它)。 使用此类,您可以获得一个motionImage,然后您只需要计算像素以检查最大区域。