Bonjour,
Je débute avec opencv et je teste actuellement haarcascade. Mon but est de pouvoir détecté sur une image une face, puis à l'intérieur une détection de lefteye et une seul car en principe on a qu'un oeil gauche etc..
C'est je pense un truc simple de programmeur mais je débute, donc si on est dans face je peux mettre lefteye et qu'un seul, puis righteye , puis nose etc.

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
 
#include <stdio.h>
#include "cv.h"
#include "highgui.h"
 
CvHaarClassifierCascade *cascade;
CvHaarClassifierCascade *cascade2;
CvMemStorage			*storage;
 
void detectFaces( IplImage *img );
 
int main( int argc, char** argv )
{
	CvCapture *capture;
	IplImage  *frame;
	int       key;
	char      *filename = "haarcascade_frontalface_alt_tree.xml";
    char      *filename2 = "haarcascade_mcs_mouth.xml";
	cascade = ( CvHaarClassifierCascade* )cvLoad( filename, 0, 0, 0 );
	cascade2 = ( CvHaarClassifierCascade* )cvLoad( filename2, 0, 0, 0 );
	storage = cvCreateMemStorage( 0 );
	capture = cvCaptureFromCAM( 0 );
 
	assert( cascade && storage && capture );
 
	cvNamedWindow( "video", 1 );
 
	while( key != 'q' ) {
		frame = cvQueryFrame( capture );
 
		if( !frame ) {
			fprintf( stderr, "Cannot query frame!\n" );
			break;
		}
 
		cvFlip( frame, frame, -1 );
		frame->origin = 0;
 
		detectFaces( frame );
 
		key = cvWaitKey( 10 );
	}
 
	cvReleaseCapture( &capture );
	cvDestroyWindow( "video" );
	cvReleaseHaarClassifierCascade( &cascade );
	cvReleaseMemStorage( &storage );
 
	return 0;
}
 
void detectFaces( IplImage *img )
{
    int i;
 
	CvSeq *faces = cvHaarDetectObjects(
			img,
			cascade,
			storage,
			1.1,
			3,
			0 /*CV_HAAR_DO_CANNY_PRUNNING*/,
			cvSize(40,40) );
 
	for( i = 0 ; i < ( faces ? faces->total : 0 ) ; i++ ) {
		CvRect *r = ( CvRect* )cvGetSeqElem( faces, i );
		cvRectangle( img,
					 cvPoint( r->x, r->y ),
					 cvPoint( r->x + r->width, r->y + r->height ),
					 CV_RGB( 255, 0, 0 ), 1, 8, 0 );
	}
 
	int j;
 
	CvSeq *eye = cvHaarDetectObjects(
			img,
			cascade2,
			storage,
			1.1,
			3,
			0 /*CV_HAAR_DO_CANNY_PRUNNING*/,
			cvSize(40,40) );
 
	for( j = 0 ; j < ( eye ? eye->total : 0 ) ; j++ ) {
		CvRect *r = ( CvRect* )cvGetSeqElem( eye, j );
		cvRectangle( img,
					 cvPoint( r->x, r->y ),
					 cvPoint( r->x + r->width, r->y + r->height ),
					 CV_RGB( 10, 0, 0 ), 1, 8, 0 );
	}
 
 
 
 
	cvShowImage( "video", img );
 
}
Actuellement, je ne sais pas dire si une face est détecter et si je suis dedans ou pas pour pouvoir ensuite mettre les eye par exemple.
Si quelqu'un pouvais me donner une piste, merci d'avance...

Stéphane