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 :

Comment fonctionne les descripteurs cascade ?


Sujet :

OpenCV

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Points : 66
    Points
    66
    Par défaut Comment fonctionne les descripteurs cascade ?
    bonjour,

    D'abord il faut signaler que je suis débutante dans le domaine de traitement d'image et dans la programmation avec opencv donc ça se peut que mes questions seront banales
    alors , je sais qu'il existe une application dans les sample d'opencv pour la détection de visage
    je voudrais connaitre comment travaillent les 'cascade' ou les descripteurs de Haar parce que j'ai pas bien compris comment ils récupèrent les caractéristique de visage par d'autre terme comment ils savent le visage de non visage . ensuite comment on récupère ces informations (qui sont dans le fichier . xml) je sais qu'il existe une fonction mais j'ai pas compris comment elle fonctionne . merci de me expliquer un peu
    enfin qu'elle est les déférences entre haarcascade_frontalface_alt.xml et haarcascade_frontalface_alt2.xml,haarcascade_frontalface_alt_tree

  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
    tes questions sont loin d'être banales, je ne suis pas un pro de l'utilisation de haar mais j'ai quelques réponse (c'est déjà ca ^^)

    comment on récupère ces informations (qui sont dans le fichier . xml)
    elles sont difficillement récupérable le seul moyen et d'aller voir ce qu'il écrit dans son xml (il te faut aller voir la fonction sous entendu le code de la fonction complète, à vue de nez doit y avoir pas mal d'histogramme)

    qu'elle est les déférences entre haarcascade_frontalface_alt.xml et haarcascade_frontalface_alt2.xml,haarcascade_frontalface_alt_tree
    pour généré le fichier XML tu as besoin de centaine de photo, une fois le xml généré,l'algo trackera les objets ayant les même propriété que les photos que tu as utilisé pour ta génération (brillance, contraste, couleur.....) les trois ont été généré avec des photos ayant des caractéritiques différentes de mémoire le premier cité ne detecte que les visages de face et bien éclairé pour les autres je ne sais pas ca (pour le tree c'est le traitement qui diverge au lieu de faire un traitement en cascade pour la comparaison, il le fait en forme d'arbre).

    en ce qui concerne la fonction ca doit être celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    static IntPtr cvHaarDetectObjects(
    	IntPtr image, 
    	IntPtr cascade, 
    	IntPtr storage, 
    	double scaleFactor, 
    	int minNeighbors, 
    	int flags, 
    	MCvSize minSize
    )
    image: c'est l'image dans laquelle tu cherches les objets à détecter
    cascade: c'est le filtre à appliqué, le descripteur
    storage: une zone mémoire ou tu va stocker les résultats du filtre
    scaleFactor: le facteur de reduction de la fenêtre de recherche il va rechercher en faisant des blocs et c'est la taille des blocs il me semble
    minNeighbors:ca je ne sais pas trop
    flags: un filtre pour exclure des zones de l'image par exemple
    minSize: la taille minimale de l'objet à détecter

    donc tu appliques la fonction et il va chercher comme un grands tout ce qui t'intéresse et le sauvegarde ^^

    Et bien sur j'ai failli oublier le paramètre de retour qui est le rectangle de l'objet détécté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CvSeq* faces = cvHaarDetectObjects( img, cascade, storage,
                                                1.1, 2, CV_HAAR_DO_CANNY_PRUNING,
                                                cvSize(40, 40) );
    dans l'exemple ca donne ca ^^
    CVSeq représente une écriture dynamique de ce que tu veux donc ici tu y écris des rectangles.

    voilà de ce que j'ai compris en espérant avoir été clair ^^

    edit: dit nous ce que tu veux faire si tu as des souci

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Points : 66
    Points
    66
    Par défaut
    bonjour, merci snowpy pour l'explication
    dit nous ce que tu veux faire si tu as des souci
    j'ai pas compris quelques lignes du code face detection, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int optlen = strlen("--cascade=");
    const char* input_name;
    if( argc > 1 && strncmp( argv[1], "--cascade=", optlen ) == 0 )
        {
            cascade_name = argv[1] + optlen;
            input_name = argc > 2 ? argv[2] : 0;
        }
    2- concernant le fichier xml (toujours j'ai un problème avec lui ) avant l'exécution du programme est ce que il était vide?(j'ai vous dit que mes questions sont banales )
    3-j'ai pas compris comment fonctionne "CvHaarClassifierCascade".

  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 code sert à charger le descripteur que tu lui as donnée en paramètre.

    2. Non il est loin d'être vide, il contient énormément de caractéristique de l'image que tu veux tracker, taille, luminosité, pour savoir précisément il faut aller fouiller dedans ^^

    3. CvHaarClassifierCascade c'est la manière dont il va tracker l'objet à l'intérieur de ton image

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Points : 66
    Points
    66
    Par défaut
    bonjour, merci snowpy
    le code sert à charger le descripteur que tu lui as donnée en paramètre.
    alors après l'exécution de ces lignes on obtient un descripteur qui contient les informations de l'image?
    il contient énormément de caractéristique de l'image que tu veux tracker, taille, luminosité, pour savoir précisément il faut aller fouiller dedans
    il contient les informations sur l'image ou sur le visage de cette image?
    comment aussi il connaitre que ça c'est un visage ou non ( ou l'essentiel qu'il détecte le visage mais comment ce n'est pas notre problème).
    finalement , je voudrais connaitre qu'elle est la différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
    qui criée une rectangle pour dessiner le visage
    et cette ligne qui a pour but de dessiner le rectangle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );
    en d'autre manière est ce que on peux utiliser le premier ligne pour connaitre les coordonnés du visage sans l'utiliser pour dessiner le rectangle par contre on l'utilise pour dessiner une autre chose

  6. #6
    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
    en d'autre manière est ce que on peux utiliser le premier ligne pour connaitre les coordonnés du visage sans l'utiliser pour dessiner le rectangle par contre on l'utilise pour dessiner une autre chose
    C'est tout a fait possible, regarde la structure CvRect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct CvRect
    {
    int x;
    int y;
    int width;
    int height;
    }
    CvRect;
    Cette structure contient la position du coin haut gauche du rectangle (ici qui encadre ton visage a priori) ainsi que sa largeur et sa longueur. A partir de la tu peux utiliser ces infos pour tracer ce que tu veux, pas seulement un rectangle.

  7. #7
    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
    la différence vient du fait que le haar enregistre tout les objets qui l'interesse dans une sequence donc obligation de les récupérer comme ca. Une séquence ne correspond qu'à un enregistrement dynamique ca peut être un rectangle (ce qui est ici notre cas) un cercle etc .....

    pour les coordonnées Glen ta donnée la soluce.

    alors après l'exécution de ces lignes on obtient un descripteur qui contient les informations de l'image?
    de visu la comme ca je dirais que ta un pointeur sur ton xml (une sorte de stream, je me trompe peut être )

    il contient les informations sur l'image ou sur le visage de cette image?
    comment aussi il connaitre que ça c'est un visage ou non
    ni l'un ni l'autre, pour tracker un objet tu as besoin d'une ou plusieurs référence, un objet standard (ici un visage) pour comparer tout les objets de ton image à ton standard. Donc ton xml contient les caractéristiques principale d'un visage humain de face (couleur, teinte, taille, luminosité .....)

    qui criée une rectangle pour dessiner le visage
    et cette ligne qui a pour but de dessiner le rectangle
    le rectangle est déjà créé et inséré dans une séquence, il faut ensuite les récupérer un par un et les remettres sous formes (structure) de rectangle pour pouvoir utiliser ses propriétés.

  8. #8
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Points : 66
    Points
    66
    Par défaut
    Merciiii bien pour tes réponses j'ai bien compris maintenant

    c'est résolu

  9. #9
    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
    je précise quand même que ces informations sont à prendre avec des "pincettes" (je ne suis pas un pro de l'utilisation de haar loin de la) mais c'est se dont j'ai retenue, il y a peut être des points faux.

  10. #10
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 610
    Points : 66
    Points
    66
    Par défaut
    merci v pour votre réponse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct CvRect
    {
    int x;
    int y;
    int width;
    int height;
    }
    CvRect;
    j'ai pas bien compris ce que vous voudrais dire par ce code?
    parce que j'ai pas trouvé cette structure dans le code ; est ceque moi qui je l'implimente ou quoi?
    merci de m'expliquer un peu.
    parce que dans le code on a crié deux point pour représenter la localisation du visage
    ensuite
    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
     
    for( i = 0; i < (faces ? faces->total : 0); i++ )
            {
               // Create a new rectangle for drawing the face
                CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
     
                // Find the dimensions of the face,and scale it if necessary
                pt1.x = r->x*scale;
                pt2.x = (r->x+r->width)*scale;
                pt1.y = r->y*scale;
                pt2.y = (r->y+r->height)*scale;
     
                // Draw the rectangle in the input image
                cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );
            }
        }
    il n'existe pas la notion de structure de cvrect

  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
    le face detect enregistre les objets tracké dans une sequence et dans cette sequence il enregistre ca sous forme de rectangle.

    donc tu fais une boucle avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
    ca te permet de récupérer les Rect dans la sequence. Quand il les enregistre dans la sequence, il ne fait qu'écrire sur un emplacement mémoire donc les données ne sont pas structuré. Avec le cvGetSeqElem tu récupère le bloc mémoire d'une donnée (ici un rectangle) et tu le mets dans une structure rectangle pour pouvoir travailler les propriétés d'un rectangle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct CvRect
    {
    int x;
    int y;
    int width;
    int height;
    }
    CvRect;
    ceci est la structure d'un rectangle, longueur largeur et coordonnée du point bas gauche (de mémoire ^^)
    la structure est défini dans un header et donc tu créé un pointeur sur une struture de type rect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
    et tu colle dans ta struture les données.

    Le visage est localisé avec un rectangle (l'algo le veux ainsi) libre à toi de dire que le point se situe à x+width/2 et y+height/2 (attention au signe selon l'orientation du repère)

    coordonnées en abscisse et ordonnée du centre de l'objet tracké.

Discussions similaires

  1. Comment fonctionnent les "keywords"
    Par shikakus dans le forum Référencement
    Réponses: 3
    Dernier message: 29/01/2007, 00h13
  2. Comment fonctionne les versions d'un logiciel?
    Par Antigonos Ier Gonatas dans le forum Windows
    Réponses: 12
    Dernier message: 14/07/2006, 18h48
  3. [VB6] Comment fonctionne les Tableaux ?
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 27/04/2006, 14h59
  4. [FLASH 8] Comment fonctionne les clips
    Par steeves5 dans le forum Flash
    Réponses: 3
    Dernier message: 27/01/2006, 10h23
  5. Comment fonctionnent les index des options d'un select ?
    Par pekka77 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 31/10/2005, 18h05

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