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 :

[CascadeClassifier] Détection de visage


Sujet :

OpenCV

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 30
    Points
    30
    Par défaut [CascadeClassifier] Détection de visage
    Bonjour à toutes et à tous,

    Je cherche a faire une (classique) détection de visage sur une vidéo. J'utilise les cascade classifier d'opencv et plus particulièrement ce tutoriel ( http://opencv.itseez.com/doc/tutoria...lassifier.html )

    Le code est assez basique, cependant, j'ai un problème tout bête : je n'arrive pas à loader le fichier "haarcascade_frontalface_alt.xml".
    En effet, à l'execution j'ai une exception et un beau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OpenCv Error : Null pointer (NULL filename) in unknown function
    Je me doute bien qu'il s'agit d'un problème lié à mon fichier à charger et à sont emplacement. J'ai donc essayé en entrant le chemin complet de mon fichier quand j'utilise "cascade.load( file_name )" ou encore de mettre mon fichier dans le même dossier que mon projet.

    Mais rien n'y fait Je sais que c'est un problème mineur mais il m'empeche d'avancer. Si quelqu'un à une idée ou à déjà rencontré ce genre de problème, qu'il n'hésite pas.

    Merci d'avance.
    Cordialement,
    A.

  2. #2
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 81
    Points
    81
    Par défaut
    Salut,

    Tu peux préciser ton arborescence ?
    Dans un de mes exemples qui fonctionne j'ai :

    ... tmp.load( cascadeName ) ...
    avec cascadeName un std::string ayant par exemple pour valeur :
    "../ressourcesSystemeTracking/classifiers/body.xml"

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 30
    Points
    30
    Par défaut
    Salut et Merci pour ta réponse.

    Qu'entends tu par arborescence?
    Si c'est une question à propos de l'endroit où se trouve mon cascade classifier .xml, je l'ai mis dans le dossier même de mon projet donc je ne devrais pas avoir à spécifier le path de mon fichier dans le code.

    Dans le sample que j'essaye de faire marcher c'est fait tout facielement comme ça =
    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
    #include "opencv2/objdetect/objdetect.hpp"
     #include "opencv2/highgui/highgui.hpp"
     #include "opencv2/imgproc/imgproc.hpp"
     
     #include <iostream>
     #include <stdio.h>
     
     using namespace std;
     using namespace cv;
     
     /** Function Headers */
     void detectAndDisplay( Mat frame );
     
     /** Global variables */
     String face_cascade_name = "haarcascade_frontalface_alt.xml";
     String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
     CascadeClassifier face_cascade;
     CascadeClassifier eyes_cascade;
     string window_name = "Capture - Face detection";
     RNG rng(12345);
     
     /** @function main */
     int main( int argc, const char** argv )
     {
       CvCapture* capture;
       Mat frame;
     
       //-- 1. Load the cascades
       if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };
       if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };
     
     (suite du programme)
    J'ai également essayé en remplacant le nom du fichier par son path en entier : "C:/opencv/data/haarcascades/haarcascade_frontalface_alt.xml" mais l'erreur du NULL pointer persiste

    Si tu as une idée je suis preneur! Merci de ton aide.
    A.

  4. #4
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 81
    Points
    81
    Par défaut
    Ah, si tu utilises le code tel quel ce n'est pas une erreur d'emplacement,
    Si l'adresse du fichier xml était mauvaise tu rentrerais dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("--(!)Error loading\n")
    L'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OpenCv Error : Null pointer (NULL filename) in unknown function
    Doit correspondre à autre chose mais je ne sais pas quoi puisque l'exemple fonctionne sur mon ordinateur.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par Jérôme.L Voir le message
    L'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OpenCv Error : Null pointer (NULL filename) in unknown function
    Doit correspondre à autre chose mais je ne sais pas quoi puisque l'exemple fonctionne sur mon ordinateur.
    Salut et merci pour ton aide et ta patience
    Quand tu dis que le code fonctionne tel quel, tu utilises quelle version d'openCV? (j'ai la 4.0 et non la 4.1 si tant est que les deux soit diiférentes)

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 81
    Points
    81
    Par défaut
    La dernière version release est la 2.4 d'openCV, j'utilise la version 2.3.1
    Mais le problème ne doit pas venir de la version.
    Je pourrais te passer un projet complet avec le fichier .vcproj et .sln de visual studio seulement avec les .dll l'archive pèse 29mo et je sais pas comment te la poster.
    Je suppose qu'un idiot est venu mettre -1 à tout les messages, alors je vais y mettre +1 pour compenser.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 30
    Points
    30
    Par défaut
    Hop! Merci Jérôme pour ton aide. Grâce à toi j'en suis donc arrivé à la conclusion que la configuration de mon projet VS pour OpenCV devait être bancale vu que le même code tournait chez toi.

    La solution était de passer mes .lib en include en mode Debug (ex: "highgui240d") puisque c'est ce que je faisais mais pour le Release. Et là miracle le .xml se load!

    Par contre, dernière petite question pour toi puisque tu as pu lancer l'exemple du tuto et que tu as l'air de bien travailler avec des cascade classifier :

    Est-ce que la détection de visage était fluide? Parce que moi ca tourne autour de 1Hz Un moyen d'augmenter la vitesse d’exécution de la détection?

    Encore merci,
    A.

  8. #8
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 81
    Points
    81
    Par défaut
    L'exemple qui est fournis est loin d'être parfait^^
    Sur l'appel de la fonction detectMultiScale(), le dernier paramètre de type cv::size correspond à la taille la plus petite possible de l'objet que tu cherches à détecter.

    Concrètement pour une valeur de (30, 30) la fonction recherchera tout les visages mesurant au minimum 30 pixels de large par 30 pixel de haut.
    Si tu augmentes ces valeurs la fonction sera exécuté plus rapidement et tu gagneras en fluidité.
    En contrepartie si tu augmentes trop cette valeur tu pourrais ne plus détecter ce que tu cherches, par exemple si le visage à l'écran est de 80*80 pixels et que ta valeur choisi est 100*100.

    Dans le cas de l'exemple je trouve la valeur trop petite, essais avec Size(60, 60)

    edit : Le mieux serait peut être carrément de rajouter une trackbar pour faire varier ces valeurs afin de régler la valeur en fonction des performances de ton ordi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cvNamedWindow(window_name.c_str(),1);
    cvCreateTrackbar( "track1", window_name.c_str(), &valt1, 200,  NULL);

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 30
    Points
    30
    Par défaut
    En effet, l'exemple donne quand même pas mal de fil à retordre.

    Merci pour ton idée de la trackbar et du changement de la taille de la fenêtre de détection.

    Après quelques tests, la valeur qui permet un bon compromis entre rapidité et efficacité se situe autour de 80.
    Seul soucis, la temps d'execution est toujours élevé (autour de 150 ms) et cette partie de détection de visages est juste une petite étape de mon projet. Si je la laisse tel quel mon FPS est ridicule à la fin du programme

    J'ai fait une brève recherche sur le net mais j'ai rien trouvé de probant. Il n'y a donc aucune possibilité pour améliorer tout ça à part en changeant la taille de détection ou en reconstruisant soit même le fichier .xml ??

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 72
    Points : 104
    Points
    104
    Par défaut
    Bonjour,
    Si mes souvenirs sont bon, le haar implémenté dans opencv utilise donc un seul cœur cpu, un moyen pour augmenter la vitesse de traitement serai de l’exécuter sur plusieurs cœurs cpu, la méthode la plus simple serait de découper l'image sur 4 (en prenant en compte une marge) et faire 4 traitements parallèle sur les 4 zones, théoriquement ça doit permettre de diviser le temps par 3 ou 4.

  11. #11
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 81
    Points
    81
    Par défaut
    Une autre idée qui n'améliore pas la vitesse de calcul mais qui te permet d'avoir un bon ips serait de lancer un thread supplémentaire pour gérer le traitement d'image.

    Thread numéro 1 : Affichage de l'image de ta caméra non traité

    Thread numéro 2 : Tu effectues la détection à partir de l'image actuellement affiché et tu dessines le résultat dans une image qui est un filtre transparent que tu affiches par dessus l'image caméra.

    Avantage : aucune latence d'image.
    Inconvénient : un décalage équivalent au temps nécessaire pour effectuer une détection entre l'image caméra et le filtre.

    Note : OpenCV ne gère par la transparence.

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 30
    Points
    30
    Par défaut
    Bonjour et merci pour vos réponse éclairées!

    Je vais mettre le sujet en "résolu" car le problème initial à été traité.
    Pour ce qui est de la rapidité, après quelques recherches, je vais essayé d'implémenter les points suivants :
    - Cropping de mon image sur une zone d'intérêt probable et compatible avec mon projet pour ce qui est de la détection de visage
    - Filtrage de l'image en fonction de la couleur de la peau du visage à détecter
    - LBP algorithm au lieu du Haar (plus rapide)
    - TBB enable pour la gestion multiple cores

    Pour ce qui est des threads, j'ai du mal à les gérer en C++ (mon niveau n'est pas encore assez avancé) mais c'est une bonne idée, merci.

    Enfin, pour la transparence (overlay) si elle n'est pas gérée par OpenCV, connaitrais tu une bibliothèque de traitement d'image efficace et qui gèrerait la transparence??

  13. #13
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 43
    Points : 81
    Points
    81
    Par défaut
    Il doit y'en avoir plusieurs,
    Personnellement j'ai l'habitude d'utiliser OpenCV avec Qt (pour l'IHM) pour avoir une portabilité facile à faire, et Qt gère la transparence des images.
    Cependant je ne pense pas que ce soit le plus facile à utiliser, donc ça fonctionne... mais il doit y'avoir mieux.

    Je crois que les dernières versions d'OpenCV utilisent nativement Qt pour certaines fonction de highGui, voir [Lien]
    Il y'a peut être moyen de gérer la transparence sous openCV en utilisant le support Qt du coup mais je ne me suis pas vraiment penché sur la question.

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2011
    Messages : 33
    Points : 30
    Points
    30
    Par défaut
    Ok parfait, je vais me pencher sur la question. Ca tombe bien, la dernière partie de mon projet consistera à une interface graphique et je comptais utiliser Qt.

    Merci encore.
    Cordialement,
    A.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détection de visages dans une vidéo
    Par sialamed dans le forum OpenCV
    Réponses: 1
    Dernier message: 17/04/2008, 15h22
  2. Détection de visages
    Par sialamed dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 07/01/2008, 14h47
  3. Détection de visages d'une vidéo
    Par bustaja dans le forum OpenCV
    Réponses: 5
    Dernier message: 25/06/2007, 17h50
  4. Détection de visages dans une image en niveaux de gris
    Par bert_ dans le forum Traitement d'images
    Réponses: 12
    Dernier message: 04/04/2007, 18h04

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