2015-09-06 98 views
0

我正在创建一个程序,可以跟踪多个对象并获取它们的质心,最终我将使用这些质心连接到另一个对象的最接近的质心。但是我的问题是,我的程序只跟踪视频中的一个重要对象,而且似乎没有显示此对象的质心。任何人都可以帮助我?Aforge C上的质心跟踪问题#

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

     } 

} 

}

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