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
|
/**
* Détection et dessin de la position de l'objet.
*
* @param _image Image source de la détection.
* @param _cascade Structure nécessaire à la détection.
*/
void detect(IplImage *_image, CvHaarClassifierCascade *_cascade)
{
int i, neighbors, flags;
double scale;
CvSeq *faces;
CvSize size;
CvRect *rectangle;
CvPoint p1, p2;
IplImage *gray;
// Paramètres de la détection
scale = 1.05;
neighbors = 2;
flags = 0; // ou CV_HAAR_DO_CANNY_PRUNING;
size = cvSize(50, 50);
// Allocation de l'espace mémoire de la détection
if(storage == NULL)
storage = cvCreateMemStorage(0);
cvClearMemStorage(storage);
// Conversion en niveau de gris
gray = cvCreateImage(cvSize(_image->width, _image->height), 8, 1);
cvConvertImage(_image, gray, CV_BGR2GRAY);
if(_cascade != NULL)
{
// Détection de(s) objet(s) visibles sur l'image source
faces = cvHaarDetectObjects(gray, _cascade, storage, scale, neighbors, flags, size);
if(faces != NULL)
{
for(i = 0; i < faces->total; i++)
{
// Conversion en rectangle
rectangle = (CvRect*) cvGetSeqElem(faces, i);
// Calcule des points du réctangle
p1.x = rectangle->x;
p1.y = rectangle->y;
p2.x = (rectangle->x + rectangle->y);
p2.y = (rectangle->y + rectangle->height);
// Dessin du réctangle sur l'image source
cvRectangle(_image, p1, p2, CV_RGB(255,0,0), 3, 8, 0);
}
}
}
// Libération de l'espace mémoire en niveau de gris
cvReleaseImage(&gray);
} |
Partager