IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Détection et suivi d'un cheval par une caméra mobile


Sujet :

OpenCV

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Points : 4
    Points
    4
    Par défaut Détection et suivi d'un cheval par une caméra mobile
    Bonjour,

    je cherche à faire le tracking en temps réel d'un cheval grâce à une caméra de vidéo surveillance mobile (et dans un futur proche, faire un asservissement).

    Voici un exemple sur lequel mon programme doit marcher (je n'ai pas accès au système de vidéo): video

    Pour faire le tracking, j'ai voulu utiliser une soustraction d'arrière-plan améliorée (utilisation de la modélisation gaussienne de l'arrière plan avec la distance de Mahalanobis et utilisation d'ouverture morphologique pour la suppression du bruit) pour récupérer les objets en mouvement. Cependant le fait que la caméra bouge empêche une soustraction efficace.

    L'augmentation du nombre d'itérations d'ouvertures permet de limiter les effets du mouvement de la caméra mais ca ne me semble pas très justifiable dans le cas général (quelqu'un capable de me prouver que c'est mathématiquement fiable ou non est le bienvenu).

    Enfin, mon maitre de stage m'a proposé d'utilisé la corrélation entre images pour récupérer les régions d'intérêt et donc éviter une soustraction d'arrière-plan. De ce côté la, je ne vois pas vraiment comment m'y prendre.

    Auriez-vous une idée de l'utilisation de la corrélation ou même de toutes solutions permettant de respecter les contraintes?

    Merci d'avance.

    Fred

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    hum le haartraining doit fonctionner la dessus, as tu la possibilité de sélectionner le cheval au début de la vidéo avec la souris (au quel cas je te conseillerais pluôt de faire du camshift) et pour la corrélation http://webcache.googleusercontent.com/search?q=cache:zTd107Zp2l0J:vast.uccs.edu/~tboult/CS330/NOTES/OpenCVTutorial_III.ppt+corr%C3%A9lation+d'image+openCV&cd=1&hl=en&ct=clnk

    la il t'explique en gros comment ca marche (tu selectionne ta zone et tu recherche tout les motifs de la zone sélectionné un peu comme le camshift)

    http://www.developpez.net/forums/d60...-forme-simple/
    un vieux sujet ou il t'explique le principe du matching et d'autre truc très sympa

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Merci pour cette réponse. Je vais m'intéresser au CamShift pour voir comment l'utiliser, mais n'y a t'il pas de problème de suivi lorsqu'un objet qui ressemble à ce que l'on suit (un autre cheval par exemple) passe dans la région d'intérêt?

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    le camshift va suivre l'objet que tu lui indique, il faudrait que ton autre cheval soit comme le premier (des jumeaux ? XD) y a peu de chance que cela arrive enfin je pense que le camshift reste la meilleur solution si tu peux sélectionner l'objet à tracker (à ma connaissance).

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    J'ai utilisé les algorithmes fournis par openCV et cela fonctionne à quelques exceptions près (l'objet à tracker est modifié dans le cas d'un chevauchement).
    Pour pouvoir améliorer la qualité de tracking, je voudrais être sur que j'ai bien compris le principe du camshift:

    -Sélection de la région ou se trouve l'objet à tracker
    -Création d'un histogramme de cette région et égalisation de celui-ci de manière à avoir un meilleur contraste.
    -L'algorithme de mean shift va définir la région où la probabilité de retrouver l'histogramme précédent est la plus forte (tout en considérant les régions "proches" de la région initiale)
    -Définition de la nouvelle région
    -On recommence sur l'image suivante

    Je voudrais savoir si j'ai bien compris ce principe. Si oui, je pensais que l'augmentation de la dimension de l'histogramme serait un facteur d'amélioration du tracking mais il ne semble pas que ce soit le cas. Qu'est ce que signifie exactement "proche", y-a-t-il un moyen de modifier cette "distance".

    Merci d'avance.

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    tu as tout à fait compris, hum aucune idée de si on peut modifier la distance , si tu augmente l'histogramme tu lui demande une meilleur précision je dirais plutôt ce qui est assez embettant quand on fait du tracking, le plus simple serait de se restreindre à une zone qui a peu de chance d'être chevaucher sinon je vois pas trop comment l'éviter

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Merci. Je vais chercher du côté de la distance pour voir si il existe déjà des études.
    Sinon aucune idée pour l'effet de la modification de la dimension de l'histogramme? Je me demandais si une trop grande dimension n'amenait pas du bruit supplémentaire.

    Edit: Ok pour l'histogramme, je vais essayer différents types de sélection. Encore merci

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Points : 194
    Points
    194
    Par défaut
    Je travaille en ce moment sur ce genre de probleme et il y a de nombreuses facons de resoudre ton probleme. Premierement un histogramme de couleurs n'est pas tres complet au sens ou il ne contient aucune information sur la repartition spatiale des pixels. Je sais pas si tu comprends bien l'anglais mais il y a pas mal d'articles qui proposent des solutions. Une d'entre elle qui semble avoir de tresbon resultats est : donner plus de poids au pixel de ton histogramme plus ils sont proche du centre de l'objet, pour ca une methode existe, fais des recherches sur Epanechnikov kernel.
    Pour ton autre probleme sur le terme "proche" la technique utilise pour definir cette distance, encore une fois une methode qui a fais ces preuves est l'utilisation du coefficient de Bhattacharyya.
    Et vu que l'algo que tu utilise est deja implemente sous OpenCv je pense que tu ne pourra comme tu dis "modifier la distance" a mois d'implementer un petit tracker mean-shift et de l'adapter a tes besoins. Le probleme avec cette idee est que tu vas augmenter la possibilite de fausses detections ce qui peut etre genant si plusieurs objets de l'image se ressemblent.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta contribution Glen.

    Dans l'état actuel, mon programme suit correctement un cheval dans un environnement en mouvement et avec des chevaux en mouvement autour, je pense donc garder la configuration offerte par openCV.
    Le problème que je dois résoudre maintenant est celui de chevauchement. Pour cela, j'ai vu que le filtre de Kalman était efficace pour prévoir les prochaines zones d'intérêt et leurs tailles afin d'éviter les décrochages.

    J'ai vu que tu avais étudié ce type de filtre. Est ce que a pu tester son efficacité?

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Une (grosse) mise à jour!

    J'ai réussi à créer 2 "modules" qui fonctionnent correctement. L'un utilise le camshift pour le suivi, l'autre permet de faire de la correlation (similitude).

    Le camshift seul ne suffit pas pour suivre un cheval particulier car quand il y a croisement avec d'autres chevaux de couleurs proches, l'amas de chevaux est pris en compte. J'utilise donc la corrélation pour garder la bonne fenêtre lors d'un décrochage. A chaque frame, je garde en mémoire le contenu de la fenêtre de suivi et en cas de décrochage, j'effectue une corrélation entre la nouvelle image et le contenue de la fenêtre précédente.

    Sur la papier, c'est alléchant. Dans les faits, comment caractériser le "décrochage"?
    Pour cela, je garde en mémoire les positions des centres et les tailles des 3 dernières fenêtre de suivis pour estimer la taille et la position de la fenêtre suivante avec une marge d'erreur. Cette erreur est calculée grâce à la moyenne des erreurs des 3 dernières fenêtre (différence entre la taille estimée et celle calculée par le camshit, idem pour la position du centre).

    Au final, si sur le papier tout ca parait plutôt efficace, cette caractérisation ne semble pas efficace (aux erreurs humaines près).

    Auriez vous une idée pour caractériser un changement brusque de position ou de taille de manière à laisser le logiciel choisir entre l'une au l'autre méthode (camshift ou correlation) pour chaque frame?

    Merci d'avance.

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Points : 533
    Points
    533
    Par défaut
    en étudiant l'histogramme complet de l'image ca pourrait peut être donner quelque chose non ?

    le camshift se referant à l'histogramme, si ton image possède un histogramme trop concentré, le tracking risque d'échouer

  12. #12
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Points : 194
    Points
    194
    Par défaut
    Moi tout ce que j'ai a dire c'est que le camshift implemente sous OpenCv n'est efficace que si on connait bien son fonctionnement, rapidement est-ce que tu peux me donner le code avec lequel tu calcule ton histogramme et ton backproject.

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Voici le code que j'utilise pour le camshit:

    (Je n'ai pas mis les déclarations des IplImage qui sont les même que dans la demo d'OpenCV)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
     
    int hdims = 128;
    float hranges_arr[] = {0,180};
    float* hranges = hranges_arr;
     
    //Utilisation de l'espace HSV:
    cvCvtColor( image, hsv, CV_BGR2HSV);
     
    if( track_object )
    {
        //Début du traitement:
     
        //On crée un masque en limitant les couleurs:
        if(track_object < 0)
                cvInRangeS( hsv, cvScalar(0,50,50), cvScalar(50,200,200), mask );
        else
                cvInRangeS( hsv, cvScalar(hVal - 5,30, 10), cvScalar(hVal + 5,200,200), mask );
     
        cvSplit( hsv, hue, 0, 0, 0 );
     
        cvShowImage("Mask",mask);
     
        if( track_object < 0 )
        {
            float max_val = 0.f;
     
            //On ne s'intéresse qu'a la sélection de l'utilisateur.
     
            cvSetImageROI( hue, selection);
            cvSetImageROI( mask, selection);
     
            cvCalcHist( &hue, hist, 0, mask );
     
            cvGetMinMaxHistValue( hist, 0, &max_val, 0, &hVal );
            cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 );
     
            //Limitation des problèmes de bord:
            if(hVal < 5)
                hVal = 5;
            if(hVal > 355)
                hVal = 355;
     
            cvResetImageROI( hue );
            cvResetImageROI( mask );
            track_window = selection;
     
            track_object = 1;
        }
     
        //On lance le Camshift:
     
        cvCalcBackProject( &hue, backproject, hist );
     
        cvAnd( backproject, mask, backproject, 0 );
     
        cvShowImage("Backproject",backproject);
     
        cvCamShift( backproject, track_window, cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ), &track_comp, &track_box);
     
        track_window = track_comp.rect;
    }

  14. #14
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Points : 194
    Points
    194
    Par défaut
    T'as utilise le code de l'example present dans OpenCv pour faire ca, c'est pour ca que c'est pas tres precis. Ils utilisent seulement le canal hue pour construire leur histogramme donc niveau precision c'est pas ce qu'il y a de mieux. Le code de la fonction camshift en lui-meme est plutot bon mais le probleme c'est le peu d'information qui est passe en parametre qui fait que ce n'est pas robuste. Essaye d'utiliser au moins un histogramme BGR (ou encore mieux pondere le avec le noyau d'Epanechnikov) pour representer ton objet. Le probleme des chevaux qui se ressemble sera normalement resolu (hormis qu'ils soient vraiment identique, dans ce cas il faudra utiliser quelquechose de plus avance comme combiner ton camshift avec un filtre de Kalman). Mais en tout cas essaye ca, un histogramme a trois dimensions, ca sera largement plus robuste.

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta réponse.

    Je vais essayer d'utiliser un histogramme en 3 dimensions mais l'intérêt de HSV et de ne garder que le canal H est que la luminosité n'influence pas le résultat. L'utilisation d'un histogramme sera donc peut être plus robuste pour une scène donnée mais comme la luminosité risque de changer lors d'un déplacement, le suivi risque d'être affecté. Enfin le test m'en dira plus.
    J'avais regardé le noyau d'Epanechnikov mais il est utilisé pour des estimations de densité donc je vois comment l'utiliser pour pondérer un histogramme suivant la représentation spatiale des pixels considérés.
    Pour le filtre de Kalman, je vais certainement être amené à l'utiliser donc je vais me renseigner plus dessus.

  16. #16
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Points : 194
    Points
    194
    Par défaut
    J'etais entraine de lire un article sur le sujet et je me suis dit que ca pourrait t'interesser :
    http://www.cg.tuwien.ac.at/hostings/...ner-Nicole.pdf
    Tu verras dans cet article ils exposent plusieurs methodes de tracking en comparant leurs resultats, comme tu peux le voir sur les graphes de fin le CAMSHIFT est de loin le plus mauvais mais il a un avantage c'est comme tu dis, il resiste aux changements d'illumination. Sinon les methodes les plus stables sont l'histo pondere et la methode de Comaniciu et al.
    Bonne chance et tiens nous au courant.

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Alors la!!! Parfait ce document :p Bon ba plus qu'a mettre tout ca en place ^^
    En tout cas un grand merci.

    Je poste dès que j'ai des nouvelles.

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour, déjà, merci beaucoup pour toutes ces précieuses informations sur le feature tracking.
    Ensuite, psycko_puppet , j’aimerais savoir quelles stratégies tu avais mis en œuvre pour l’asservissement de la caméra mobile sur ton cheval ?
    la tâche que j'ai a réaliser moi est d'asservir un robot sur un objet pendant que le robot est en mouvement.
    merci.

  19. #19
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Salut sarion,

    pour l'asservissement de la caméra, il suffit de comparer le centre de la fenêtre de tracking et la taille de cette fenêtre aux instant t et t+1. Les différences de postions donnent les translations à effectuer et les rapports de tailles, le zoom.

  20. #20
    Futur Membre du Club
    Femme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par glen1789 Voir le message
    J'etais entraine de lire un article sur le sujet et je me suis dit que ca pourrait t'interesser :
    http://www.cg.tuwien.ac.at/hostings/...ner-Nicole.pdf
    Tu verras dans cet article ils exposent plusieurs methodes de tracking en comparant leurs resultats, comme tu peux le voir sur les graphes de fin le CAMSHIFT est de loin le plus mauvais mais il a un avantage c'est comme tu dis, il resiste aux changements d'illumination. Sinon les methodes les plus stables sont l'histo pondere et la methode de Comaniciu et al.
    Bonne chance et tiens nous au courant.
    SVP, je travaille sur le même sujet, j'essaye de suivre les personnes en utilisant Mean-Shif algorithm..est ce que vous pouvez m'envoyer cet article car le lien ne fonctionne pas chez moi..
    Cordialement.

Discussions similaires

  1. [2.x] Authentification avec FOSUserBundle par une application mobile
    Par Brownies17 dans le forum Symfony
    Réponses: 8
    Dernier message: 11/06/2013, 00h45
  2. Réponses: 0
    Dernier message: 19/04/2013, 16h17
  3. Reconnaissance de couleur par une caméra
    Par so.generously dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 13/03/2010, 18h26
  4. Réponses: 1
    Dernier message: 21/10/2009, 15h21
  5. Réponses: 0
    Dernier message: 24/09/2009, 14h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo