我是emgu cv的新手;我正在尝试找到一个可以进行运动检测的代码。我试过这个:
CvInvoke.cvAbsDiff(frame, _backgroundImage, BgDifference);
......但我有照明问题。我想让那些有运动的像素变白,然后画一个矩形,那里只有一个矩形,但是我用更多的白色像素区域。
我需要做什么?我可以尝试另一种功能吗?
答案 0 :(得分:1)
您可以使用MotionHistory课程。 EmguCV包含一个运动检测示例(如果它不再存在,您可以看到它here)。使用这个类,你可以获得一个motionImage,然后你只需要计算像素来检查最大的区域。
答案 1 :(得分:1)
将单帧转换为灰度。 将新帧从实时转换为灰度。 从实时开始在第一帧和新帧之间进行抽象。 结果是第三个新框架,由前两个框架之间的差异组成。使用侵蚀和阈值来获得一个框架,白色代表运动部分,黑色代表空间的其余部分。
这是一段代码:
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);
}