Отслеживание BLOB-объектов с помощью OpenCV - PullRequest
2 голосов
/ 05 февраля 2011


У меня есть программа EMGU (оболочка openCV), которая вычитает фон из
видеопотока камеры и извлекает красивые чистые капли.
Теперь мне нужно что-то, что будет отслеживать эти капли и назначать им идентификаторы.
Есть предложения / библиотеки?


Спасибо,
SW

Ответы [ 2 ]

3 голосов
/ 05 февраля 2011

хорошо, если у вас есть несколько объектов, которые вы хотите отслеживать, вы можете попробовать Фильтр частиц .

Фильтры частиц в основном "удаляют" частицы на изображении, каждый из которых имеет определенный вес,Затем на каждом временном шаге эти веса обновляются путем сравнения их с фактическим измеренным значением объекта в это время.Частицы с большим весом будут затем удалять больше частиц в своем направлении (с добавлением небольшой случайной части в направлении) для следующего шага по времени.После нескольких временных шагов частицы будут группироваться вокруг измеренных объектов.Вот почему этот метод иногда также называют Выживанием наиболее подходящего метода ...

Итак, все это строит круг:

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

Так что это хороший метод отслеживания объектов вданная сцена.Одним из способов слежения за несколькими объектами было бы использование одного фильтра частиц для всех объектов, который будет работать, но имеет недостатки, когда вы пытаетесь присвоить идентификаторы объектам, а также когда объекты пересекаются друг с другом, поскольку облака частиц могутпотерять один объект и следовать за другим.

Чтобы решить эту проблему, вы можете использовать фильтр частиц-смесей (Vermaak et al. [2003]).Он отслеживает каждый из объектов с помощью отдельного фильтра частиц (с, конечно, менее необходимыми частицами).

Хорошую статью об этом можно найти здесь: http://www.springerlink.com/content/qn4704415gx65315/ (Я также могу предоставить вамнесколько других вещей на эту тему, если вам нравится, и если вы говорите по-немецки, я даже могу дать вам презентацию, которую я провел об этом в своем университете некоторое время назад)* Забыл упомянуть: так как вы пытаетесь сделать это в OpenCV: насколько я знаю, есть реализация алгоритма конденсации (первая, где вы используете один фильтр частиц на всем изображении), является частью дистрибутива OpenCV, хотяэто может быть немного устаревшим.Могут быть новые способы фильтрации частиц в OpenCV напрямую, но если нет, вы найдете много результатов в Google, если вы ищете OpenCV и фильтры частиц

Надеюсь, это поможет ... если нет, пожалуйста, продолжайте спрашивать...

2 голосов
/ 05 февраля 2011

Вы можете просто адаптировать один из примеров резюме EMGU, который использует пространство имен 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;

      }
   }
...