Aforge C#的质心跟踪问题

时间:2015-09-06 10:02:52

标签: c# tracking aforge centroid

我正在创建一个程序,可以跟踪多个对象并获得它们的质心,最终我会使用这些质心连接到另一个对象的最近的质心。但我的问题是,我的程序只跟踪视频中的一个重要对象,它似乎没有显示该对象的质心。有人可以帮帮我吗?

namespace Video_Processing_fixed_
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Bitmap video;
        Graphics g;
        bool OnOff;
        int mode;
        int thoigiandemnguoc = 5;
        private FilterInfoCollection CaptureDevice;
        private VideoCaptureDevice FinalFrame;

    private void Form1_Load(object sender, EventArgs e)
    {
        CaptureDevice = new FilterInfoCollection(FilterCategory.VideoInputDevice);
        foreach (FilterInfo Device in CaptureDevice)
        {
            comboBox1.Items.Add(Device.Name);
        }
        comboBox1.SelectedIndex = 0;
        FinalFrame = new VideoCaptureDevice();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        FinalFrame = new VideoCaptureDevice(CaptureDevice[comboBox1.SelectedIndex].MonikerString);
        FinalFrame.NewFrame+=new NewFrameEventHandler(FinalFrame_NewFrame);
        FinalFrame.Start();
    }

        void FinalFrame_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            video = (Bitmap)eventArgs.Frame.Clone();
            Bitmap video2 = (Bitmap)eventArgs.Frame.Clone();
            g = Graphics.FromImage(video2);
            g.DrawString("Test", new Font("Arial", 20), new SolidBrush(Color.White), new PointF(2, 2));
            g.Dispose();
            if (mode == 1)
            {
                // create filter
                EuclideanColorFiltering filter = new EuclideanColorFiltering();
                // set center colol and radius
                filter.CenterColor = Color.FromArgb(215, 30, 30);
                filter.Radius = 100;
                // apply the filter
                filter.ApplyInPlace(video2);


                BlobCounter blobcounter = new BlobCounter();
                blobcounter.MinWidth = 5;
                blobcounter.MinHeight = 5;
                blobcounter.FilterBlobs = true;
                blobcounter.ObjectsOrder = ObjectsOrder.Area;
                blobcounter.ProcessImage(video2);
                Blob[] blobs = blobcounter.GetObjectsInformation();
                AForge.Point Center = new AForge.Point();

                   if (blobs.Length > 0)
                     {
                        Center.X = blobs.Average(c => c.CenterOfGravity.X);
                        Center.Y = blobs.Average(c => c.CenterOfGravity.Y);
                     }

               Rectangle[] rects = blobcounter.GetObjectsRectangles();
                foreach(Rectangle recs in rects)
                if (rects.Length > 0)
                {
                    foreach (Rectangle objectRect in rects)
                    {
                        Graphics graphic = Graphics.FromImage(video2);
                        using (Pen pen = new Pen(Color.FromArgb(160, 255, 160), 5))
                        {
                            graphic.DrawRectangle(pen, objectRect);
                        }

                        graphic.Dispose();
                        }
                    }
               ( Pen pen = new Pen(Color.White,3))

            pictureBox2.Image = video2;
            pictureBox1.Image = video;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (FinalFrame.IsRunning==true)
            {

                FinalFrame.SignalToStop();
                FinalFrame.WaitForStop();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            pictureBox2.Image = (Bitmap)pictureBox1.Image.Clone();
        }

        private void ButObjTrack_Click(object sender, EventArgs e)
        {
            mode = 1;
        }

        private void StopButt_Click(object sender, EventArgs e)
        {
            FinalFrame.SignalToStop();

        }

}

}

1 个答案:

答案 0 :(得分:0)

您不显示平均中心值。改变这些行:

Rectangle[] rects = blobcounter.GetObjectsRectangles();
foreach(Rectangle recs in rects)
    if (rects.Length > 0)
    {
        foreach (Rectangle objectRect in rects)
        {
            Graphics graphic = Graphics.FromImage(video2);
            using (Pen pen = new Pen(Color.FromArgb(160, 255, 160), 5))
            {
                graphic.DrawRectangle(pen, objectRect);
            }
            graphic.Dispose();
        }
    }

对于这些:

Rectangle[] rects = blobcounter.GetObjectsRectangles();
foreach (Rectangle recs in rects)
{
    if (rects.Length > 0)
    {
        Graphics graphic = Graphics.FromImage(video2);
        foreach (Rectangle objectRect in rects)
        {
            graphic.DrawRectangle(Pens.LightGreen, objectRect);

        }
        graphic.DrawRectangle(Pens.Red, Center.X - 4, Center.Y - 4, 8, 8);
        graphic.Dispose();
    }
}