使用OpenCV跟踪blob

时间:2011-02-04 21:13:58

标签: image-processing opencv computer-vision emgucv


我有一个EMGU(openCV包装器)程序,它从中减去背景 相机送入并提取漂亮干净的斑点 现在我需要能够跟踪这些blob并为其分配ID的东西 有什么建议/图书馆吗?

谢谢,
SW

2 个答案:

答案 0 :(得分:3)

如果您想要跟踪多个对象,可以尝试Particle Filter

粒子滤镜基本上“处理”图像上的每个具有一定重量的粒子。在每个时间步骤中,然后通过将它们与当时对象的实际测量值进行比较来更新这些权重。然后,具有高重量的颗粒将在其方向上布置更多的颗粒(在该方向上添加轻微的随机部分)用于下一时间步骤。 经过几个步骤后,颗粒将在物体测量位置周围分组。这就是为什么这种方法有时也被称为适者生存的方法......

所以这整个事情构成了一个圆圈:

Initialization  ---->      Sampling
                        >             \
                       /               >
                 Updating           Prediction
                      <                /
                       \               <
                          Association

因此,这提供了一种跟踪给定场景中对象的好方法。进行多对象跟踪的一种方法是在所有对象上使用这一个粒子过滤器,这将起作用,但是当您尝试为对象提供ID时以及当对象彼此交叉时因为粒子云可能丢失一个对象并跟随另一个对象。

要解决此问题,您可以尝试使用Mixture-Particle-Filter(Vermaak等人[2003])。这个通过单个粒子过滤器跟踪每个对象(当然,不需要的粒子)。

关于这方面的好文章可以在这里找到:http://www.springerlink.com/content/qn4704415gx65315/ (如果你愿意的话,我也可以为你提供其他几个东西,如果你说德语,我甚至可以给你一个我刚才在大学里做过的演讲)

修改

忘了提及:因为你试图在OpenCV中这样做:据我所知,有一个Condensation算法的实现(第一个在整个图像上使用一个粒子滤波器)是OpenCV发行版的一部分虽然它可能已经过时了一点。直接在OpenCV中可能有更新的粒子滤镜方法,但如果不是,如果你寻找OpenCV和粒子滤镜,你会在Google上找到很多结果

希望有帮助......如果没有,请继续问......

答案 1 :(得分:2)

您可以简单地调整其中一个使用的EMGU CV示例 VideoSurveillance命名空间:

 public partial class VideoSurveilance : Form
   {
      private static MCvFont _font = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0);
      private static Capture _cameraCapture;
      private static BlobTrackerAuto<Bgr> _tracker;
      private static IBGFGDetector<Bgr> _detector;

      public VideoSurveilance()
      {
         InitializeComponent();
         Run();
      }

      void Run()
      {
         try
         {
            _cameraCapture = new Capture();
         }
         catch (Exception e)
         {
            MessageBox.Show(e.Message);
            return;
         }

         _detector = new FGDetector<Bgr>(FORGROUND_DETECTOR_TYPE.FGD);

         _tracker = new BlobTrackerAuto<Bgr>();

         Application.Idle += ProcessFrame;
      }

      void ProcessFrame(object sender, EventArgs e)
      {
         Image<Bgr, Byte> frame = _cameraCapture.QueryFrame();
         frame._SmoothGaussian(3); //filter out noises

         #region use the background code book model to find the forground mask
         _detector.Update(frame);
         Image<Gray, Byte> forgroundMask = _detector.ForgroundMask;
         #endregion

         _tracker.Process(frame, forgroundMask);

         foreach (MCvBlob blob in _tracker)
         {
            frame.Draw(Rectangle.Round(blob), new Bgr(255.0, 255.0, 255.0), 2);
            frame.Draw(blob.ID.ToString(), ref _font, Point.Round(blob.Center), new Bgr(255.0, 255.0, 255.0));
         }

         imageBox1.Image = frame;
         imageBox2.Image = forgroundMask;

      }
   }