1

私はemgucvを初めて使用します。動きを検出するコードを見つけようとしています。私はこれを試しました:

CvInvoke.cvAbsDiff(frame, _backgroundImage, BgDifference);

...しかし、照明に問題があります。動きのあるピクセルを白くして、そこに長方形を1つだけ描きたいのですが、白いピクセルの領域を増やします。

私は何をする必要がありますか?別の機能を試してみませんか?

4

2 に答える 2

1

MotionHistoryクラスを使用できます。EmguCVには、モーション検出の例が含まれています(含まれていない場合は、ここで確認できます)。このクラスを使用すると、motionImageを取得でき、ピクセルを数えるだけで最大の領域を確認できます。

于 2013-08-23T13:03:35.887 に答える
1

単一のフレームをグレースケールに変換します。新しいフレームをリアルタイムからグレースケールに変換します。リアルタイムから最初のフレームと新しいフレームの間で抽象化を行います。この結果、最初の2つの違いで構成される3番目の新しいフレームが作成されます。そのために侵食としきい値を使用して、白がモーションセクションを表し、黒が残りのスペースを表すフレームを取得します。

これがコードの一部です:

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);
       }
于 2014-07-03T09:19:52.033 に答える