Detector de caras y algo de tiempo libre…

Mediante OPENCV y la pequeña clase que organicé en C++ para manipular el misil (ir), he creado un detector de caras de personas en Visual C++ para que de forma automática proporcione al misil la posición del objetivo.

Primero pondré algo de resultados visibles y luego pasaré a resumir un poco cómo se lo hice.

Face detector
Face detector
Face detector
Face detector

Lo que se ve ahí, es la salida del programa de OpenCV. El detector de caras tiene cierto margen de error, depende de si la cara está algo tapada o si la orientación de ésta es muy brusca puede no detectarla, sin embargo es bastante robusto, incluso con gafas y a una distancia considerable hace bingo.

En un principio es un vídeo nítido. Pero para darle un toque personal, le he distorsionado el histograma para alterar el contraste y la calidad, puesto algún texto sin sentido para adornar y como no, tintado de rojo al más puro estilo de un T-800.

El código para estos efectos no es muy complicado de entender (frame_copy es una imagen de la webcam en un instante de tiempo y frameSizeImg es una imagen png completamente roja):

// Effects
// Histogram / contrast
IplImage *out = cvCreateImage ( cvGetSize(frame_copy),IPL_DEPTH_8U,1);
cvConvertImage(frame_copy,out);
cvEqualizeHist(out,out);
 
// Red filter (in Memoriam of Arnold)
cvConvertImage(out, frame_copy);
cvSetImageROI(frame_copy, cvRect(0,0,frame_copy->width,frame_copy->height));
cvAddWeighted(frame_copy, 1, frameSizeImg, 1, -100, frame_copy);
cvResetImageROI(frame_copy);
 
// Text
cvPutText (frame_copy,"ALL DEFENSE SYSTEMS",cvPoint(20,150), &font, cvScalar(255,255,255));
cvPutText (frame_copy,"ACTIVE STATUS 3583A",cvPoint(20,170), &font, cvScalar(255,255,255));
cvPutText (frame_copy,"I/O LEVELS AT MAX",cvPoint(20,180), &font, cvScalar(255,255,255));
cvPutText (frame_copy,"-------------------",cvPoint(20,186), &font, cvScalar(255,255,255));
cvPutText (frame_copy,actionStr,cvPoint(20,198), &font, cvScalar(255,255,255));
cvPutText (frame_copy,"DEVICE LOADED",cvPoint(20,220), &font, cvScalar(255,255,255));
cvPutText (frame_copy,"CHECKSUM: 4390",cvPoint(500,210), &font, cvScalar(255,255,255));
cvPutText (frame_copy,"SEARCH AND DESTROY MODE",cvPoint(426,240), &font, cvScalar(255,255,255));
cvPutText (frame_copy,"FULL ISO LEVELS",cvPoint(500,250), &font, cvScalar(255,255,255));
cvPutText (frame_copy,acquireStr,cvPoint(frame_copy->width/2 - 140,frame_copy->height - 40), &font2, cvScalar(255,255,255));

En cuanto a la detección de caras, me he basado en el método de Viola-Jones.

OpenCV automatiza el proceso de reconocimiento de caras hasta tal punto que basta con 4 o 5 líneas de código para poner en marcha algo estándar. Que a mi, por el momento, me vale.

El core del proyecto es esta linea:

CvSeq* faces = cvHaarDetectObjects( img, cascade, storage,
                                    2, 2, CV_HAAR_DO_CANNY_PRUNING,
                                    cvSize(40, 40) );

Donde img es una imagen de la cámara en el instante de la detección de la cara y cascade el objeto en el que se almacena la información de las HaarCascades del XML de las caras que se debe abrir previamente. El resto de parámetros son opciones para alterar la detección según se desee.

Una vez montados, por una parte, el detector de caras y, por la otra, el controlador del misil, hay que ponerlos a trabajar juntos. Task fácil. No tiene mucho misterio programando con objetos y clases.

Video de regalo:

Etiquedado como , , ,

1 respuesta a Detector de caras y algo de tiempo libre…

  1. mary

    por favor necesito un tutorial entendible sobre open cv con java necesito algo entendible para rconocimiento facial

Deja un comentario

Tu dirección de correo electrónico no será publicada.