使用OpenCV跟踪斑点

3


我有一个使用EMGU(openCV封装)的程序,可以从摄像头视频中减去背景并提取出干净的斑点。
现在我需要一个能够跟踪这些斑点并为它们分配ID的工具或库。
有什么建议或推荐吗?


谢谢,
SW

2个回答

4
如果您想跟踪多个对象,可以尝试使用粒子滤波器
粒子滤波器基本上会在图像上“分布”具有一定权重的粒子。在每个时间步骤中,这些权重将通过与该时刻物体的实际测量值进行比较来更新。具有高权重的粒子将向其方向处置更多粒子(在方向上添加轻微的随机部分)以供下一个时间步骤使用。几个时间步骤后,粒子将聚集在测量位置周围的物体。这就是为什么有时也称此方法为适者生存法的原因...
所以整个过程形成了一个循环:
Initialization  ---->      Sampling
                        >             \
                       /               >
                 Updating           Prediction
                      <                /
                       \               <
                          Association

因此,这提供了一种在给定场景中跟踪对象的良好方法。一种实现多目标跟踪的方法是在所有对象上使用一个粒子滤波器,这种方法可以工作,但是当您尝试为对象分配ID并且对象相互交叉时,会存在缺点,因为粒子云可能会失去一个对象并跟随另一个对象。
为了解决这个问题,您可以尝试使用Mixture-Particle-Filter(由Vermaak等人[2003]提出)。这个方法通过单独的粒子滤波器(当然需要较少的粒子)跟踪每个对象。
关于这个问题的一篇好文章可以在这里找到:http://www.springerlink.com/content/qn4704415gx65315/(如果您愿意并且会说德语,我还可以向您提供有关我在大学发表的演讲的其他材料)
编辑:忘记提到:既然您想在OpenCV中实现这一点:据我所知,Condensation算法的实现(第一种在整个图像上使用一个粒子滤波器的方法)是OpenCV分发的一部分,虽然它可能有点过时。如果没有更新的OpenCV粒子滤波器,您可以在Google上搜索OpenCV和粒子滤波器,会找到很多结果。
希望这有所帮助...如果不行,请继续问...

2
您可以简单地调整使用VideoSurveillance命名空间的EMGU CV示例之一:
     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;
    
          }
       }

使用OpenCV的BlobTrackerAuto存在几个问题。它只能在BGR图像上工作,速度非常慢,并且没有办法仅用于跟踪blob(而不进行前景提取部分)。 - Shachar Weis
我已经实现了一种自定义的前景背景检测方法,以获得漂亮的斑点,并将其与BlobTrackerAuto(您只需要实现一些接口)相结合,在我的场景中很好地运作,该场景包括跟踪在游泳池中游泳的老鼠。我发布给你的代码由于前景检测器类型而变慢,例如高斯混合可以提供更好的性能。然而,慢是一个相对的概念,取决于您的场景要求。 - Luca Del Tongo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接