n_n al comentar cvSetImageROI no limitamos el area a procesar.
#include <stdio.h>
/*Algoritmos principales*/
#include "cv.h"
/*GUI y Video*/
#include "highgui.h"
CvHaarClassifierCascade *cascade_cara;
CvHaarClassifierCascade *cascade_ojo;
CvMemStorage *storage;
void ReconocerRostroOjos(IplImage *imagen);
/*--------------------------------------------------------------*/
int main(){
CvCapture *captura = 0;
IplImage *imagen;
char *cara = "haarcascade_frontalface_default.xml";
char *ojo = "haarcascade_eye.xml";
int key=0;
/* Cargando el clasificador de rostro */
cascade_cara = (CvHaarClassifierCascade*)cvLoad(cara, 0, 0, 0);
/* Cargando el clasificador de ojos */
cascade_ojo = (CvHaarClassifierCascade*)cvLoad(ojo, 0, 0, 0);
/*Declarando storage para detectar los ojos */
storage = cvCreateMemStorage(0);
captura = cvCaptureFromCAM( 0 );
if ( !captura ) {
fprintf( stderr, "No se encuentra la webcam!\n" );
return 1;
}
/* Crea una ventana */
cvNamedWindow("n_n", CV_WINDOW_AUTOSIZE);
while( key != 'q' ) {
imagen = cvQueryFrame( captura );
if( !imagen ) break;
/* Reconocer rostro y ojos*/
ReconocerRostroOjos(imagen);
cvShowImage("n_n", imagen);
if( cvWaitKey( 10 ) >= 0 )
break;
}
/*Deja de capturar*/
cvReleaseCapture(&captura);
cvDestroyWindow("n_n");
return 0;
}
void ReconocerRostroOjos(IplImage *imagen){
int i;
/*Reconocer rostro*/
CvSeq *faces = cvHaarDetectObjects(imagen, cascade_cara, storage,1.1, 2,0,cvSize(40, 40));
/* Salgo si se encuentra*/
if (faces->total == 0) return;
/* Dibujar un rectangulo */
CvRect *r = (CvRect*)cvGetSeqElem(faces, 0);
cvRectangle(imagen,cvPoint(r->x, r->y),cvPoint(r->x + r->width, r->y + r->height),CV_RGB(255, 0, 0), 1, 8, 0);
/* Limpio el buffer para trabajar con la siguiente imagen*/
cvClearMemStorage(storage);
/*Posicion de los ojos o region de interes dentro de la imagen principal*/
//cvSetImageROI(imagen, cvRect(r->x, r->y + (r->height/5.5), r->width, r->height/3.0));
/* Reconocer los ojos*/
CvSeq* ojos = cvHaarDetectObjects(imagen, cascade_ojo, storage,1.1, 2,0,cvSize(20, 20));
/* Dibujar un circulo */
for( i = 0; i < (ojos ? ojos->total : 0); i++ ) {
r = (CvRect*)cvGetSeqElem( ojos, i );
cvCircle( imagen,cvPoint(r->x + r->width*0.5, r->y + r->height*0.5),20, cvScalar(0,255,0), 1);
}
cvResetImageROI(imagen);
}
Gran parte de la documentacion que me ayudo a esto, son estos link's:
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html
http://www710.univ-lyon1.fr/~bouakaz/OpenCV-0.9.5/docs/