Día 2: Guardando capturas

La idea es la siguiente:

1.- Queremos entrenar al robot para reconocer distintos estados de ánimo según la cara del jugador, para ello debemos tomar una serie de capturas del jugador para entrenar al robot. Haremos una serie de capturas con cara alegre, enfadada, triste, etc… y posteriormente estas servirán de entrenamiento al robot.

2.- Cada vez que nos sentemos en frente de Groucho, él (la webcam) tomará capturas de nuestra cara y las comparará con las fotos entrenadoras para reconocer nuestro estado de ánimo.

3.- En función de nuestro estado de ánimo y de otra serie de factores Groucho actuará según unos patrones de conducta.

Vamos a centrarnos en el objetivo 1. El primer paso es tomar capturas de la webcam. Pero establecemos una serie de requisitos.

Primero: Para capturar una imagen debe haber una cara en dicha imagen por lo menos.

Segundo: Para que una cara sea válida se han de detectar ojos en dicha cara. De esto ya nos ocupamos en la anterior sesión, pero en este caso no queremos que se dibujen los círculos en las capturas que guardemos por tanto los desactivaremos.

Tercero: Queremos que además de la imagen se guarde un archivo de texto asociado con el centro y el radio del círculo que se dibujaría en las caras, cuya utilidad explicaremos posteriormente.

¿Dónde incluimos nuestro código? Hay dos bucles anidados, el primero recorre las caras encontradas en un captura y el segundo recorre cada cara para encontrar nested_objects, que en nuestro caso se traduce prácticamente por ojos. Como solo queremos capturas de caras con ojos debemos introducir en el segundo bucle nuestro código:

if(!i&&!j) {
*entero=*entero+1;

if((*entero)<20){

sprintf(prueba,”Imagen/imag%d%s”,*entero,”.jpg”);

cvSaveImage(prueba,img);

}
}
if(!j&&(*entero)<20){

sprintf(pruebaa,”Imagen/imag%d%s”,*entero,”.txt”);
fichero=fopen(pruebaa,”a+”);
sprintf(numeros,”radio %d%s%d%s%d%s”, radius, ” center “, center.x,”,”,center.y,”\n”);
fwrite(numeros,strlen(numeros),1,fichero);
fclose(fichero);
}

i es el índice del primer bucle, j el del segundo. La condición del primer if nos impone que debemos estar en la primera ejecución de ambos bucles, ¿por qué? Si no impusiesemos esta condición se guardaría una imagen por cada nested_object y por cada cara, lo cual no queremos.

*entero es un puntero a un entero definido fuera del método que a partir de ahora limitará el número de capturas que se toman, en nuestro caso hemos elegido un valor de 20. Posteriormente salvamos la imagen.

En el tercer if creamos nuestro archivo de texto, en este caso hemos impuesto que hayamos tomado menos de 20 imágenes y además sea el primer nested_object de la pasada del bucle actual ¿Por qué ahora no hemos incluido !i en el if? Porque queremos los radios y centros de todas las caras detectadas. Finalmente creamos el fichero con fopen(), fwrite(), fclose(), etc… y usando las variables ofrecidas por el fichero de opencv: radius, center.x y center.y.

De esta forma se salvan en el directorio de trabajo 20 imágenes y 20 archivos de texto.

Pero esto no es suficiente, si tenemos que comparar dos imágenes con el mismo fondo, a pesar de que nos movamos un poco, se identificarán como prácticamente iguales, por tanto tenemos que guardar una versión recortada de nuestras caras. Intentaremos llevar a cabo este objetivo en sesiones posteriores haciendo uso de la información de radio y centro de las caras que hemos conseguido guardar en ficheros de texto.

Próximos objetivos:

– Detectar movimiento mediante variaciones del centro de las caras en imágenes sucesivas.

– Detección de luz o ausencia de luz midiendo la energía de la captura

– Dotar de identidad a las caras, esto es, si aparece una nueva cara en pantalla seguiremos identificando la anterior como “la anterior” mediante un código de colores.

-Recortar las capturas para tener solo las caras que vamos a comparar.

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: