bonjour,
je cherche quelqu'un qui pourrait m'aider à résoudre un problème sur opencv
j'ai fait un programme qui lit les frams de ma webcam
ensuite j'appel cvHaarDetectObjects pour détecter les visages
mon problème c'est que la fonction cvHaarDetectObjects est tres tres lente environ une image par seconde
je suis aller fouiller sur le net et apparemment pour les autres c'est tres fluide????
voila mon code si qq à une idée:
#include "stdafx.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <algorithm>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <float.h>
#include <limits.h>
#include <time.h>
#include <ctype.h>
//initialisation
static CvMemStorage* storage = 0;
static CvHaarClassifierCascade* cascade = 0;
void detect_and_draw( IplImage* image );
const char* cascade_name ="haarcascade_frontalface_default.xml";
void detect_and_draw(IplImage* img)
{
static CvScalar colors[] = { {{0,0,255}}, {{0,128,255}}, {{0,255,255,255}}, {{0,255,0}}, {{255,128,0}}, {{255,255,0}}, {{255,0,0}}, {{255,0,255}} }; //couleurs des differents contours si il y en a plusieur
int scale = 1;
//detection des visages
cvClearMemStorage( storage);
CvSeq* objects = cvHaarDetectObjects( img, cascade, storage,1.1, 3, 0, cvSize(10,10));
//dessin des triangles autour de chaque visage detectee
for(int i=0; i< (objects ? objects->total : 0); i++)
{
CvRect* r = (CvRect*)cvGetSeqElem( objects, i );
cvRectangle(img, cvPoint(r->x*scale, r->y*scale), cvPoint((r->x+r->width)*scale, (r->y+r->height)*scale), colors[i%8]);
cvShowImage( "result", img );
}
cvShowImage( "result", img ); //affichage
}
int main(int argc, char *argv[])
{
//initialisation des images
IplImage *img=0;
IplImage *frame, *frame_copy = 0;
cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
//vérif des erreurs
if( !cascade )
{
fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
return -1;
}
//creation du lien avec l'espace memoir et de l'affichage
storage = cvCreateMemStorage(0);
cvNamedWindow( "result", 1 );
//img= cvLoadImage("lena.jpg",1); //si on veut utiliser une image
//chargement de la video
CvCapture* capture=cvCaptureFromCAM(0); // si on veut utiliser une webcam
//CvCapture* capture = cvCreateFileCapture("bourvil.avi"); // si on veut utiliser une vidéo
//boucle d'appel de la fonction detect_and_draw pour chaque frame
for(;;)
{
img = cvQueryFrame(capture);
detect_and_draw( img );
if( cvWaitKey( 2 ) >= 0 )
break;
}
cvReleaseImage( &img );
return 0;
}
merci