Preparando para detectar emociones

Nuestra práctica se basa en la detección  de emociones en una cara, y para ello debemos sacar la información adecuada de lo que tenemos con el programa de detección de caras para poder iniciar esa tarea.

Nos damos cuenta de que en el programa de detección de caras, al detectar las caras crea un rectángulo de cada una de ellas, que luego transformará a un círculo posteriormente para dibujarlo y que quede más bonito.

  • Obtener subimágenes a partir de una imagen

A nosotros nos interesa justamente ese rectángulo de la cara para poder crear una imagen que contenga sólamente a ese rectángulo, y dentro de esa imagen de la cara poder detectar las emociones. Es sencillo sacar una subimagen a partir de una imagen, de forma que si yo tengo un puntero a imagen img, y un rectángulo CvRect llamado rectan, siendo imgCut otro puntero a imagen donde quiero guardar mi imagen recortada, debo hacer lo siguiente:

cvSetImageROI( *img, rectan);
imgCut=cvCreateImage( cvSize(rectan.width,rectan.height), (*img)->depth, (*img)->nChannels );
cvCopy(*img,imgCut,0);
cvResetImageROI(*img);

 

La ROI es la Region of Interest, o Región de Interés de mi Imagen, con lo cual en principio defino la región de interés como la región donde se encuentra mi cuadrado, creo mi imagen, y después hago un copy para copiar esa región de interés y he de resetear la región de interés en la imagen anterior.

 

He de tener en cuenta para crear el rectángulo si quiero crearlo yo en una zona de la imagen que las imágenes solo tienen como parámetros width y height, mientras que en un rectángulo tengo que indicarle las coordenadas x,y, además de width y height. El 0 del eje x es la esquina de abajo a la izquierda, mientras que el 0 del eje y es la esquina de arriba a la izquierda. Por tanto si quiero crear un rectángulo del cuarto superior izquierdo de la imagen, debería hacer que rectan.x=0,  rectan.y=0, y rectan.width=img->width*o.5, rectan.height=img->height*o.5.

  • Tipos de SubImágenes que obtengo, qué hacer con ellas 

Ahora no sólo podemos querer subimágenes de la cara sino de las distintas partes como pueden ser ojos y sonrisa, para poder detectar emociones en esas partes, que son las que parece que más cambian al mostrar emociones, y posteriormente la experiencia nos demostrará que así es.

Para determinar qué es la cara, es sencillo, incluso para determinar qué es el ojo puede parecer relativamente sencillo, porque ya existe un clasificador que te detecta ojos, a partir del cual puedes obtener los rectángulos necesarios. Sin embargo para la sonrisa, o partes de las que no tienes un rectángulo creado, lo mejor es probar. Para ello tu haces un rectángulo aproximado, y guardas imágenes de la subimagen que crees con el tamaño del rectángulo creado. Viendo las imágenes puedes ajustar la anchura del rectángulo y eso es lo que hicimos con la sonrisa. En nuestro caso, llegamos a la conclusión de que los mejores parámetros para la zona de la sonrisa eran:

rectSonrisa.x=imgCut->width*0.25;
rectSonrisa.y=imgCut->height*0.68;
rectSonrisa.width=imgCut->width*0.5;
rectSonrisa.height=imgCut->height*0.25;

ImgCut es el puntero a la imagen de la cara que devuelve el clasificador de detección de caras.

Con los parámetros de las zonas que vayamos creando, será necesario incluirlos en un archivo .txt, para luego pasárselo al programa entrenador, y eso será justamente lo que hagamos. Con estas sencillas instrucciones, creamos el archivo de texto necesario para el programa entrenador llamado Haartraining, que en posteriores entradas explicaremos:

     sprintf(pruebaa,”../../apps/HaarTraining/make/sonrisa.dat”);     
     fichero=fopen(pruebaa,”a+”);     
     sprintf(numeros,”Imagen/imag%d%s%d%s%d%s%d%s%d%s%d%s”,*entero,”.”,facesCount,”.jpg 1 “,rectSonrisa.x,” “,rectSonrisa.y,” “,rectSonrisa.width,” “,rectSonrisa.height,”\n”);
     fwrite(numeros,strlen(numeros),1,fichero);
     fclose(fichero);

Lo importante del nombre de la imagen es que hay que ir cambiándolo con una variable, porque vamos a crear muchas imágenes y guardar datos de ellas. Por ello, es necesario que el nombre vaya cambiando.El %d indica que espera un entero y el %s que espera un string. Después del nombre de la imagen, al programa habrá que pasarle los datos del rectángulo donde quieres que busque dentro de la imagen, y nosotros le pasamos el rectángulo de la sonrisa, ya que solamente le pasaremos al programa la imagen de la cara. Evidentemente previo a esto, hay que haber guardado la imagen con el mismo nombre en el directorio indicado en el segundo sprintf (en el primero indicas donde guardas el fichero de texto).

 

Conclusión:

Tenemos la opción de guardar imágenes de caras y guardar en un archivo de texto la información de la zona donde queremos que se busque la emoción a tener en cuenta, paso esencial para poder meternos con el programa de Haartraining.

 

Un saludo

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: