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 de visages d'une vidéo


Sujet :

OpenCV

  1. #1
    Membre régulier Avatar de bustaja
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2007
    Messages : 109
    Points : 112
    Points
    112
    Par défaut Détection de visages d'une vidéo
    Voilà, j'ai code un programme pour détecter les visages avec openCV...

    Seulement j'ai un problème...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Null pointer ()
    in function cvClearMemStorage [blablah]
    Abandonner / Recommencer / Ignorer
    Si je vire "cvClearMemStorage", ça marche mais ma fenêtre de sortie est noire...

    Je laisse mon source parce que j'vois pas...

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    void detect_and_draw( IplImage* img )
    {
         static CvMemStorage* storage = 0;
         static CvHaarClassifierCascade* cascade = 0;
     
         const char* cascade_name =
        "haarcascade_frontalface_alt.xml";
     
        int scale = 1;
        IplImage* temp = cvCreateImage( cvSize(img->width/scale,img->height/scale), 8, 3 );
        CvPoint pt1, pt2;
        int i;
     
        //cvPyrDown( img, temp, CV_GAUSSIAN_5x5 );
        cvClearMemStorage( storage );
     
        if( cascade )
        {
            CvSeq* faces = cvHaarDetectObjects( img, cascade, storage,
                                                1.1, 2, CV_HAAR_DO_CANNY_PRUNING,
                                                cvSize(40, 40) );
            for( i = 0; i < (faces ? faces->total : 0); i++ )
            {
                CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
                pt1.x = r->x*scale;
                pt2.x = (r->x+r->width)*scale;
                pt1.y = r->y*scale;
                pt2.y = (r->y+r->height)*scale;
                cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );
            }
        }
     
        cvShowImage( "Median", temp );
        cvReleaseImage( &temp );
    }
     
    int Tr_video::fen_test(char* nomfichier, int temps)
    {
        cvDestroyAllWindows();
        /* Variables */  
         IplImage *im, *imcp, *imcp2;
     
         CvCapture *avi; 
         /* Ouverture de la video */  
         avi = cvCaptureFromAVI(nomfichier); 
         cvNamedWindow("Originale", CV_WINDOW_AUTOSIZE); 
         cvNamedWindow("Median", CV_WINDOW_AUTOSIZE);
     
         int height    = (int) cvGetCaptureProperty(avi, CV_CAP_PROP_FRAME_HEIGHT);
         int width    = (int) cvGetCaptureProperty(avi, CV_CAP_PROP_FRAME_WIDTH);
     
         imcp = cvCreateImage(cvSize(width,height), IPL_DEPTH_8U, 3);
         imcp2 = cvCreateImage(cvSize(width,height), IPL_DEPTH_8U, 3);
     
         while(cvGrabFrame(avi)) 
           { 
           im = cvRetrieveFrame(avi);      
           cvShowImage("Originale", im);
     
           /* Traitement de l’image */  
     
           detect_and_draw(im);
     
           cvWaitKey(temps);
           }  
     
           cvReleaseImage(&imcp);
           cvReleaseImage(&imcp2);
     
           cvDestroyAllWindows();
     
           return 1;
    }
    Merci...

  2. #2
    Membre régulier Avatar de bustaja
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2007
    Messages : 109
    Points : 112
    Points
    112
    Par défaut
    Bon je vois que peu de personnes ne s'interesse à mon problème...

    J'vais encore chercher...

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Quel est le rôle de cvClearMemStorage ?
    Parce que je n'y connais rien à OpenCV, mais je vois un "Null pointer" d'un côté, et de l'autre que tu lui passes un pointeur nul.

  4. #4
    Membre régulier Avatar de bustaja
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2007
    Messages : 109
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par Laurent Gomila
    Quel est le rôle de cvClearMemStorage ?
    Parce que je n'y connais rien à OpenCV, mais je vois un "Null pointer" d'un côté, et de l'autre que tu lui passes un pointeur nul.
    cvClearMemStorage doit effacer storage, rien que cela...

    En fait j'viens de réparer l'erreur, je ne fesais pas la création de "storage"

    Sinon j'ai un truc sans bug mais qui me donne une magnifique fenêtre noire en sortie :/

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    static CvMemStorage* storage = 0;
     
    void detect_and_draw( IplImage* img )
    {
     
         static CvHaarClassifierCascade* cascade = 0;
     
         const char* cascade_name =
        "haarcascade_frontalface_alt.xml";
     
        int scale = 1;
        IplImage* temp = cvCreateImage( cvSize(img->width/scale,img->height/scale), 8, 3 );
        CvPoint pt1, pt2;
        int i;
     
        //cvPyrDown( img, temp, CV_GAUSSIAN_5x5 );
        cvClearMemStorage( storage );
     
        if( cascade )
        {
            CvSeq* faces = cvHaarDetectObjects( img, cascade, storage,
                                                1.1, 2, CV_HAAR_DO_CANNY_PRUNING,
                                                cvSize(40, 40) );
            for( i = 0; i < (faces ? faces->total : 0); i++ )
            {
                CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
                pt1.x = r->x*scale;
                pt2.x = (r->x+r->width)*scale;
                pt1.y = r->y*scale;
                pt2.y = (r->y+r->height)*scale;
                cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );
            }
        }
     
        cvShowImage( "Median", temp );
        cvReleaseImage( &temp );
    }
     
    int Tr_video::fen_test(char* nomfichier, int temps)
    {
        cvDestroyAllWindows();
        /* Variables */  
         IplImage *im, *imcp, *imcp2;
     
         CvCapture *avi; 
         /* Ouverture de la video */  
         avi = cvCaptureFromAVI(nomfichier); 
         cvNamedWindow("Originale", CV_WINDOW_AUTOSIZE); 
         cvNamedWindow("Median", CV_WINDOW_AUTOSIZE);
     
         int height    = (int) cvGetCaptureProperty(avi, CV_CAP_PROP_FRAME_HEIGHT);
         int width    = (int) cvGetCaptureProperty(avi, CV_CAP_PROP_FRAME_WIDTH);
     
         imcp = cvCreateImage(cvSize(width,height), IPL_DEPTH_8U, 3);
         imcp2 = cvCreateImage(cvSize(width,height), IPL_DEPTH_8U, 3);
     
         storage = cvCreateMemStorage(0);
     
         while(cvGrabFrame(avi)) 
           { 
           im = cvRetrieveFrame(avi);      
           cvShowImage("Originale", im);
     
           /* Traitement de l’image */  
     
           detect_and_draw(im);
     
           cvWaitKey(temps);
           }  
     
           cvReleaseImage(&imcp);
           cvReleaseImage(&imcp2);
     
           cvDestroyAllWindows();
     
           return 1;
    }
    Hum...

  5. #5
    Membre régulier Avatar de bustaja
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2007
    Messages : 109
    Points : 112
    Points
    112

  6. #6
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Points : 74
    Points
    74
    Par défaut
    Les algos de "Haar.." (et donc la fonction "cvHaarDetectObjects") ne travaillent pas a partir d'une image "brute" TOUTE la procédure indiquée dans le code exemple doit être suivie a la LETTRE. Pas question de faire une capture, suivie de l'appel de la fonction. Cette image ( peut importe sa provenance, AVI ou Webcam) doit passer par un certaint nombre de filtres.
    Voila pour la détection proprement dite. Sinon pour ton "ecran noir", je n'ais pas étudié ton source.. Bousculé.

    Jean-Pierre.
    Ce code fonctionne bien chez moi. Il est différent de celui du site.Il manque ce "bout" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        cvCvtColor( img, gray, CV_BGR2GRAY );
        cvResize( gray, small_img, CV_INTER_LINEAR );
        cvEqualizeHist( small_img, small_img );
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    #include "cv.h"
    #include "highgui.h"
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    #include <math.h>
    #include <float.h>
    #include <limits.h>
    #include <time.h>
    #include <ctype.h>
     
    static CvMemStorage* storage = 0;
    static CvHaarClassifierCascade* cascade = 0;
     
    void detect_and_draw( IplImage* image );
     
    const char* cascade_name = "haarcascade_frontalface_alt_tree.xml";
    /*  "haarcascade_frontalface_alt2.xml";*/
     
    int main( int argc, char** argv )
    {
        CvCapture* capture = 0;
        IplImage *frame, *frame_copy = 0;
     
        cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
     
        if( !cascade )
        {
            return -1;
        }
        storage = cvCreateMemStorage(0);
        capture = cvCaptureFromCAM( 0 );
        cvNamedWindow( "result", 1 );
     
        if( capture )
        {
            for(;;)
            {
                if( !cvGrabFrame( capture ))
                    break;
                frame = cvRetrieveFrame( capture );
                if( !frame )
                    break;
                if( !frame_copy )
                    frame_copy = cvCreateImage( cvSize(frame->width,frame->height),
                                                IPL_DEPTH_8U, frame->nChannels );
                if( frame->origin == IPL_ORIGIN_TL )
                    cvCopy( frame, frame_copy, 0 );
                else
                    cvFlip( frame, frame_copy, 0 );
     
                detect_and_draw( frame_copy );
     
                if( cvWaitKey( 10 ) >= 0 )
                    break;
            }
     
            cvReleaseImage( &frame_copy );
            cvReleaseCapture( &capture );
        }
     
        cvDestroyWindow("result");
     
        return 0;
    }
     
    void detect_and_draw( IplImage* img )
    {
        static CvScalar colors[] = 
        {
            {{0,0,255}},
            {{0,128,255}},
            {{0,255,255}},
            {{0,255,0}},
            {{255,128,0}},
            {{255,255,0}},
            {{255,0,0}},
            {{255,0,255}}
        };
     
        double scale = 1.3;
        IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 );
        IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale),
                             cvRound (img->height/scale)),
                         8, 1 );
        int i;
     
        cvCvtColor( img, gray, CV_BGR2GRAY );
        cvResize( gray, small_img, CV_INTER_LINEAR );
        cvEqualizeHist( small_img, small_img );
        cvClearMemStorage( storage );
     
        if( cascade )
        {
            double t = (double)cvGetTickCount();
            CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,
                                                1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,
                                                cvSize(30, 30) );
            t = (double)cvGetTickCount() - t;
            printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );
            for( i = 0; i < (faces ? faces->total : 0); i++ )
            {
                CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
                CvPoint center;
                int radius;
                center.x = cvRound((r->x + r->width*0.5)*scale);
                center.y = cvRound((r->y + r->height*0.5)*scale);
                radius = cvRound((r->width + r->height)*0.25*scale);
                cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );
            }
        }
     
        cvShowImage( "result", img );
        cvReleaseImage( &gray );
        cvReleaseImage( &small_img );
    }

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/03/2012, 10h01
  2. Détection de mouvement sur une vidéo
    Par kurul1 dans le forum C++Builder
    Réponses: 13
    Dernier message: 28/01/2009, 12h12
  3. Détection de visages dans une vidéo
    Par sialamed dans le forum OpenCV
    Réponses: 1
    Dernier message: 17/04/2008, 15h22
  4. Détection de contours sur une vidéo
    Par willem77 dans le forum OpenCV
    Réponses: 0
    Dernier message: 11/09/2007, 13h45
  5. 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