/***********************************************************/ /* Solène AMRAM */ /* 9 juin 2008 */ /* */ /* Essai de détection, Toisième jet */ /***********************************************************/ //Essai de détection de visage avec un ficher xml de openCV #include "stdafx.h" #include #include using namespace std; // On cree une chaine de caractère contenant le chemin pour acéder au fichier xml voulu const char* cascade_name ="C:/Program Files/OpenCV/data/haarcascades/haarcascade_frontalface_alt.xml" ; const char* image_name ; // Déclaration des fonctions void detect_and_draw( IplImage* image ); void menu(); int main( int argc, char** argv ) { // Initialisation de l'image IplImage *img ; //Video CvCapture* capture = cvCreateCameraCapture( 0 ); //Vérification if( !capture ) return 10; //cvNamedWindow("video", CV_WINDOW_AUTOSIZE); char key = 'a'; // On essaye de capturer une frame if(!cvGrabFrame( capture )) return 20; // Tant qu'on n'a pas appuyé sur Q, on continue : while(key != 'q' && key!=27) { // On décompresse la dernière frame récupérée... img = cvRetrieveFrame( capture ); // Appel detect_and_draw(img); // On attend 10 ms key = cvWaitKey(10); // On essaye de capturer la frame suivante if(!cvGrabFrame( capture )) key = 'q'; } // Libérations //cvReleaseImage(&img); cvDestroyAllWindows(); img=NULL; return 0; } /** *Detect_and_draw : fonction qui détect et trace un carré autour des zones voulues *@param img : image d'entrée (IplImage*) */ void detect_and_draw( IplImage* img ) { // Mémoire pour calculs static CvMemStorage* storage = 0; // Creation d'un Haar classifier static CvHaarClassifierCascade* cascade = 0; int scale = 1; // Nouvelle image identique à img IplImage* temp = cvCreateImage( cvSize(img->width/scale,img->height/scale), 8, 3 ); // Variables CvPoint pt1, pt2; int i; // Chargement de cascade cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); //Vérification if( !cascade ) { fprintf( stderr, "ERROR: Could not load classifier cascade\n" ); return; } // allocation storage = cvCreateMemStorage(0); //fenetre d'affichage cvNamedWindow( "result", 1 ); cvClearMemStorage( storage ); // On utlisie le fichier chargé if( cascade ) { // There can be more than one face in an image. So create a growable sequence of faces. // Detect the objects and store them in the sequence CvSeq* faces = cvHaarDetectObjects( img, cascade, storage, 1.1, 6, CV_HAAR_DO_CANNY_PRUNING, cvSize(130, 130) ); // Loop the number of faces found. for( i = 0; i < (faces ? faces->total : 0); i++ ) { //Creer un rectagle CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); // Trouve les dimensions de la face (les met à l'échelle si besoin) pt1.x = r->x*scale; pt2.x = (r->x+r->width)*scale; pt1.y = r->y*scale; pt2.y = (r->y+r->height)*scale; // Dessiner le rectagle cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 ); } } // Libération cvShowImage( "result", img ); cvReleaseImage( &temp ); }