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...