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
|
//declarations
CvHaarClassifierCascade* pCascade = 0; // le detecteur de visage
CvMemStorgage* pStorage = 0; // buffer mémoire expensible
CvSeq* pFaceRectSeg; // liste des visages detectés
int i;
// initialisations
IplImage* pInpImg = (argc > 1) ?
cvLoadImage(argv[1], CV_LOAD_IMAGE_COLOR) : 0;
pStorage = cvCreateMemStorage(0);
pCascade = (CvHaarClassifierCascade *)cvLoad
((OPENCV_ROOT"/data/haarcascades/haarcascade_frontalface_default/xml"),0,0,0,0);
// On valide que tout a bien été initialisé correctement
if(!pInpImg || !pStorage || !pCascade)
{
printf("L'initilisation a echoue : %s \n,
(!pInpImp)? "n'a pas charge l'image" :
(!pCascade)? "n'a pas charge le detecteur de Haar -- "
"verifiez que le chemin est correct" :
"Allocation memoire a echoue");
exit(-1);
}
// Detection de visage dans l'image
pFaceRectSeq = cvHaarDetectObjects
(pInpImg, pCascade, pStorage,
1.1, // augmente l'échelle de recherche de 10% à chaque passe
3, // met de côté les groupes plus petit que 3 détections
CV_HAAR_DO_CANNY_PRUNING, // abandonne les régions non candidates à contenir un visage
cvSize(0,0)); // utilise les paramètres XML par défaut pour la plus petite echelle de recherche
// create a window to display detected faces
cvNamedWindow("Fenetre de Haar", CV_WINDOW_AUTOSIZE);
// dessine un rectangle autour de chaque visage detecté
for(i=0;i<(pFaceRectSeq? pFaceRectSeq->total:0);i++)
{
CvRect* r = (Cvrect*)cvGetSeqElem(pFaceRectSeq, i);
CvPoint pt1 = { r->x, r->y };
CvPoint pt2 = { r->x, r->width, r->y + r->height };
cvRectangle(pInpImg, pt1, pt2, CV_RGB(0,255,0), 3, 4, 0);
}
// Affiche la détection de visage
cvShowImage("Fenetre de Haar", pInpImg);
cvWaitKey(0);
cvDestroyWindow("Fenetre de Haar");
// Libère les ressources
cvReleaseImage(&pInpImg);
if(pCascade) cvReleaseHaarClassifierCascade(&pCascade);
if(pStorage) cvReleaseMemStorage(&pStorage); |
Partager