2011-02-04 3 views
2


J'ai un programme EMGU (emballage OpenCV) qui soustrait l'arrière-plan de
une alimentation de la caméra et des extraits de belles blobs propres.
Maintenant, j'ai besoin de quelque chose qui va suivre ces blobs et les assigner avec des ID.
Des suggestions/bibliothèques?


Merci,
SWsuivi blobs avec OpenCV

Répondre

3

bien si vous avez plusieurs objets que vous souhaitez vous pouvez essayer de suivre un Particle Filter.

Les filtres à particules "déposent" des particules sur l'image qui ont chacune un certain poids. À chaque pas de temps, ces poids sont ensuite mis à jour en les comparant à la valeur mesurée réelle de l'objet à ce moment-là. Les particules ayant un poids élevé vont alors disposer de plus de particules dans leur direction (en ajoutant une légère partie aléatoire dans la direction) pour le pas de temps suivant. Après quelques pas de temps, les particules se regrouperont autour de la position mesurée des objets. Voilà pourquoi cette méthode est parfois aussi appelé la survie de la méthode plus apte ...

donc cette chose construit un cercle:

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

Donc, cela donne une bonne méthode de suivi des objets dans une scène donnée. Une façon de faire un suivi multi-objets serait d'utiliser ce filtre de particules sur tous les objets, ce qui fonctionnerait, mais présente des inconvénients quand vous essayez de donner des ID aux objets et aussi quand les objets se croisent puisque les nuages ​​de particules peuvent perdre un objet et en suivre un autre.

Pour résoudre ce problème, vous pouvez essayer un mélange de particules-filtre (par Vermaak et autres [2003]). Celui-ci suit chacun des objets par un filtre à particules individuel (avec bien sûr moins de particules nécessaires). Un bon article sur ce peut être trouvé ici: http://www.springerlink.com/content/qn4704415gx65315/ (Je peux également vous fournir plusieurs autres choses sur ce point si vous le souhaitez et si vous parlez allemand, je peux même vous donner une présentation que j'ai tenue à ce sujet dans mon université il y a un moment)

EDIT:

oublié de mentionner: Puisque vous essayez de le faire dans OpenCV: pour autant que je sais qu'il ya une implémentation de l'algorithme de condensation (le premier où vous utilisez un filtre de particules sur toute l'image) fait partie de la distribution OpenCV, bien qu'il puisse être un peu dépassé. Il pourrait y avoir de nouvelles façons du filtre à particules dans OpenCV directement, mais sinon vous trouverez beaucoup de résultats sur Google si vous recherchez OpenCV et filtres à particules

Espérons que cela aide ... sinon, s'il vous plaît continuez à demander .. .

2

Vous pouvez simplement adapter l'un des exemples CV EMGU qui utilise espace de noms vidéosurveillance:

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; 

     } 
    } 
+0

ce sont plusieurs problèmes avec l'utilisation de BlobTrackerAuto OpenCV. Il ne fonctionne que sur les images BGR, il est TRES lent, et il n'y a aucun moyen de l'utiliser uniquement pour le suivi des blobs (sans la partie Forground-extraction). –

+0

J'ai implémenté une approche personnalisée pour la détection d'arrière-plan de premier plan pour obtenir de beaux blobs puis couplé avec BlobTrackerAuto (il suffit d'implémenter une interface) et ça marche bien dans mon scénario qui consiste à suivre une souris dans un pool. Le code que je vous ai posté est lent en raison du type de détecteur de premier plan, par exemple Mélange de gaussiennes offrent une meilleure performance. Howewer slow est un concept relatif qui dépend des exigences de votre scénario –