C# 执行并触发检测到的运动

C# 执行并触发检测到的运动,c#,emgucv,C#,Emgucv,如何使用EMGUCV实现简单的运动检测方法?我已经搜索了一些适用的例子,但我发现的唯一解决方案太复杂,无法实现 是否有一种方法可以实现一种简单的方法来检测运动,以便在我的应用程序中触发某些东西 将单个帧转换为灰度 将新帧从实时转换为灰度 在第一帧和新帧之间进行实时提取 其结果是第三个新框架,由前两个框架之间的差异组成。使用腐蚀和阈值来获得一个框架,白色代表运动部分,黑色代表空间的其余部分 下面是一段代码: using System; using System.Collectio

如何使用EMGUCV实现简单的运动检测方法?我已经搜索了一些适用的例子,但我发现的唯一解决方案太复杂,无法实现

是否有一种方法可以实现一种简单的方法来检测运动,以便在我的应用程序中触发某些东西

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

    下面是一段代码:

        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);
            }
    
    使用系统;
    使用System.Collections.Generic;
    使用系统组件模型;
    使用系统数据;
    使用系统图;
    使用System.Linq;
    使用系统文本;
    使用System.Windows.Forms;
    使用Emgu.CV;
    使用Emgu.CV.UI;
    使用Emgu.CV.CvEnum;
    使用Emgu.CV.Structure;
    使用系统诊断;
    使用System.IO;
    使用System.Data.SqlClient;
    使用System.Data.SqlServerCe;
    使用系统、绘图、成像;
    名称空间ptuxiakh___
    {
    公共部分类Form1:Form
    {
    捕获_Capture=新捕获();
    Capture capture2=新捕获();
    Image FirstImage=新图像(640480);
    图像实时图像=新图像(640480);
    图像des=新图像(640480);
    图像分辨率=新图像(640480);
    图像腐蚀=新图像(640480);
    bool-baground=false;
    私有无效背景()
    {
    试一试{
    FirstImage=_capture.QueryFrame();
    背景=真;
    }
    捕获(例外e)
    {
    baground=假;
    }
    }
    私有无效跟踪(对象发送方、事件参数)
    {
    如果(baground==true)
    {
    RealTimeImage=capture2.QueryFrame();
    CvInvoke.cvAbsDiff(FirstImage.Convert(),RealTimeImage.Convert(),des);
    CvInvoke.cvThreshold(des,thres,20255,THRESH.CV_THRESH_BINARY);
    CVR.CVE侵蚀(thres,侵蚀,IntPtr.Zero,2);
    }
    其他的
    {
    Background();//首先尝试获取
    //具有实时帧的抽象
    }
    }
    私有无效开始按钮单击(对象发送者,事件参数e)
    {
    Application.Idle+=新的EventHandler(跟踪);
    }
    私有无效停止按钮\u单击(对象发送者,事件参数e)
    {
    Application.Idle-=新事件处理程序(跟踪);
    }
    
    //你的不信任将被侵蚀

  • 将单个帧转换为灰度
  • 将新帧从实时转换为灰度
  • 在第一帧和新帧之间进行实时提取
  • 其结果是第三个新的帧,由前两个帧之间的差异组成。使用腐蚀和阈值来获得一个帧,其中白色表示运动部分,黑色表示空间的其余部分

    下面是一段代码:

        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);
            }
    
    使用系统;
    使用System.Collections.Generic;
    使用系统组件模型;
    使用系统数据;
    使用系统图;
    使用System.Linq;
    使用系统文本;
    使用System.Windows.Forms;
    使用Emgu.CV;
    使用Emgu.CV.UI;
    使用Emgu.CV.CvEnum;
    使用Emgu.CV.Structure;
    使用系统诊断;
    使用System.IO;
    使用System.Data.SqlClient;
    使用System.Data.SqlServerCe;
    使用系统、绘图、成像;
    名称空间ptuxiakh___
    {
    公共部分类Form1:Form
    {
    捕获_Capture=新捕获();
    Capture capture2=新捕获();
    Image FirstImage=新图像(640480);
    图像实时图像=新图像(640480);
    图像des=新图像(640480);
    图像分辨率=新图像(640480);
    图像腐蚀=新图像(640480);
    bool-baground=false;
    私有无效背景()
    {
    试一试{
    FirstImage=_capture.QueryFrame();
    背景=真;
    }
    捕获(例外e)
    {
    baground=假;
    }
    }
    私有无效跟踪(对象发送方、事件参数)
    {
    如果(baground==true)
    {
    RealTimeImage=capture2.QueryFrame();
    CvInvoke.cvAbsDiff(FirstImage.Convert(),RealTimeImage.Convert(),des);
    CvInvoke.cvThreshold(des,thres,20255,THRESH.CV_THRESH_BINARY);
    CVR.CVE侵蚀(thres,侵蚀,IntPtr.Zero,2);
    }
    其他的
    {
    Background();//首先尝试获取
    //具有实时帧的抽象
    }
    }
    私有无效开始按钮单击(对象发送者,事件参数e)
    {
    Application.Idle+=新的EventHandler(跟踪);
    }
    私有无效停止按钮\u单击(对象发送者,事件参数e)
    {
    Application.Idle-=新事件处理程序(跟踪);
    }
    
    //你的不信任将被侵蚀

  • 将单个帧转换为灰度
  • 将新帧从实时转换为灰度
  • 在第一帧和新帧之间进行实时提取
  • 其结果是第三个新的帧,由前两个帧之间的差异组成。使用腐蚀和阈值来获得一个帧,其中白色表示运动部分,黑色表示空间的其余部分

    下面是一段代码:

        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);
            }