jueves, 4 de marzo de 2010

Identificación facial con .net - Griaule ICAO Face SDK

Antes de cualquier cosa debemos aclarar que el ejemplo que utilizaremos en esta entrada únicamente identifica el rostro en una imagen y no es capaz de determinar si ese rostro pertenece a cierta persona (como si hiciera con huella digital), sin embargo puede ser de mucha ayuda para las aplicaciones.

Aclarado el punto anterior, es tiempo de comenzar. Lo primero que necesitaremos es la libreria ICAO Face SDK que podemos descargar desde el sitio web de Griaule



Ya que hemos instalado la libreria, debemos crear un nuevo proyecto en Visual Studio. En nuestro caso vamos a crear un proyecto en C#







Ya que hemos creado nuestro proyecto debemos agregar la referencia a la libreria ICAO (Com.Griaule.IcaoFace)

Para este ejemplo se tomo como fuente de imagenes una webcam (me base en esta pagina para hacer eso)


Hasta este punto he saltado las explicaciones, sin embargo ustedes pueden obtener las imágenes desde archivos.

Para continuar debemos declarar un objeto del tipo IcaoImage y otro del tipo FaceImage


Com.Griaule.IcaoFace.IcaoImage imagenIcao;
Com.Griaule.IcaoFace.FaceImage imagenRostro;

También en este punto hemos diseñado nuestro formualrio, el cual tiene 3 picturebox, 3 botones y un control ListView.





El control listview nos servirá para tener una lista de todas las webcams desde las que podemos obtener las imágenes.

El botón buttonObtenerImagen lo usaremos para obtener la imagen desde nuestra camara web (ustedes pueden poner "dialogo de abrir archivo"). El primer picturebox (PictureBoxOriginal) lo usaremos para mostrar la imagen obtenida desde nuestra webcam; hasta aquí el proceso es realmente sencillo.

El botón "buttonReferencias" lo utilizaremos para determinar la posición de los ojos y la boca en la imagen que tiene nuestro PictureBoxOriginal y el resultado lo mostraremos en el PictureBoxReferencias, para hacer eso necesitamos controlar el eventro clic de nuestro botón y determinar si la libreria es capaz de localizar los ojos y la boca, en caso afirmativo podemos mostrar la imagen resultante en nuestro PictureBoxReferencias:


private void button1_Click(object sender, EventArgs e)
{
imagenRostro = new Com.Griaule.IcaoFace.FaceImage(pictureBoxOriginal.Image);
imagenRostro.MouthDetectionEnabled = true;
if (imagenRostro.DetectionProbability == 0)
MessageBox.Show("No se pueden encontrar puntos de referencia");
else
{
pictureBoxReferencias.Image = imagenRostro.ImageWithFeatures(2, Color.Azure);
}
}




Y como último paso procedemos a recortar la imagen alrededor del rostro y mostrando el resultado en nuestro PictureBoxImgRecortada, controlamos el evento clic de nuestro buttonRecortar:

private void buttonRecortar_Click(object sender, EventArgs e)

{
imagenIcao = imagenRostro.FullFrontalImage(70, 1, Com.Griaule.IcaoFace.IcaoImage.IcaoFullFrontalMode.FullFrontal);
pictureBoxImgRecortada.Image = imagenIcao.Image;
}




Nota al margen: La libreria al recortar la imagen alinea los ojos, por lo que si el rostro esta inclinado obtendremos una imagen con unos bordes de color blanco, tal como en el ejemplo mostrado. Además esta librería no efectiva al 100% por lo que les recomendaria que tomaran imágenes con un color de fondo sólido (como una pared).




Les dejo el código casi completo:


Atalasoft.Twain.Acquisition adquirirImagen; //webcam
Com.Griaule.IcaoFace.IcaoImage imagenIcao;
Com.Griaule.IcaoFace.FaceImage imagenRostro;

public Form1()
{
InitializeComponent();
adquirirImagen = new Atalasoft.Twain.Acquisition(); //webcam
}

private void Form1_Load(object sender, EventArgs e)
{
try
{
/* webcam */
adquirirImagen.ImageAcquired += new Atalasoft.Twain.ImageAcquiredEventHandler(adquirirImagen_ImageAcquired);
if (adquirirImagen.SystemHasTwain)
{
foreach (Atalasoft.Twain.Device dispositivo in adquirirImagen.Devices)
{
listViewDispositivo.Items.Add(new ListViewItem(dispositivo.Identity.ProductName));
}
}
}
catch (System.Exception exc)
{
...
}
}

/* se adquiere una imagen de la webcam */
void adquirirImagen_ImageAcquired(object sender, Atalasoft.Twain.AcquireEventArgs e)
{
pictureBoxOriginal.Image = e.Image;
}

private void buttonObtenerImagen_Click(object sender, EventArgs e)
{
try
{
foreach (Atalasoft.Twain.Device dispositivo in adquirirImagen.Devices)
{
if (dispositivo.Identity.ProductName == listViewDispositivo.SelectedItems[0].Text)
{
dispositivo.Acquire();
}
}
}
catch (System.Exception exc)
{
...
}
}

private void button1_Click(object sender, EventArgs e)
{
imagenRostro = new Com.Griaule.IcaoFace.FaceImage(pictureBoxOriginal.Image);
imagenRostro.MouthDetectionEnabled = true;
if (imagenRostro.DetectionProbability == 0)
MessageBox.Show("No se pueden encontrar puntos de referencia");
else
{
pictureBoxReferencias.Image = imagenRostro.ImageWithFeatures(2, Color.Azure);
}
}

private void buttonRecortar_Click(object sender, EventArgs e)
{
imagenIcao = imagenRostro.FullFrontalImage(70, 1, Com.Griaule.IcaoFace.IcaoImage.IcaoFullFrontalMode.FullFrontal);
pictureBoxImgRecortada.Image = imagenIcao.Image;
}


Tal vez les interese cómo implementar un lector de huellas en sus aplicaciones


10 comentarios:

  1. muy bueno el recurso!!, gracias, me ha servido de mucho!!!

    ResponderEliminar
  2. oye y esa de Atalasoft.Twain.Acquisition de donde lo saco]? es un dll que se descarga o que using debo de poner? como lo consigo? gracias

    ResponderEliminar
    Respuestas
    1. Majo:
      esa libreria es opcional, yo la utilice para poder accesar a las imagenes de mi camara, pero si la deseas puedes comprarla. Gracias.

      Eliminar
  3. Majo:
    esa libreria es opcional, yo la utilice para poder accesar a las imagenes de mi camara, pero si la deseas puedes comprarla. Gracias.

    ResponderEliminar
  4. hola amigo alfonso estoy realizando mi tesis sobre un sistema de reconocimiento facial tu codigo me sirve para identificar una imagen pero necesito compararla por otra captada desde la camara web de verdad si podrias ayudarme necesito tu ayuda amigo saludos desde venezuela

    ResponderEliminar
    Respuestas
    1. Disculpa, no sabia que el enlace que apunta a la entrada de acceso a imágenes a través de la cámara web estaba roto. Si tienes alguna duda puedes plantearla, asi los que posteriormente lean la entrada podrán resolver algunas dudas también.
      Te recomendaria primeramente tener la librería mencionada, es de paga y ya no recuerdo bien esa parte pero creo que necesita un archivo con extensión .lic, esa librería me la proporcionaron en la empresa donde trabajaba asi que la verdad no me metí a investigar mucho cómo conseguirla.

      Espero que puedas plantear tus dudas.

      Eliminar
  5. amigo necesito tu ayuda necesito compara la imagen de una camara web con una guardada previamente es para mi tesis de verdad la necesito sin ofenderte te podria pagar por la ayuda saludos amigo

    ResponderEliminar
    Respuestas
    1. Disculpa, no sabia que el enlace que apunta a la entrada de acceso a imágenes a través de la cámara web estaba roto. Si tienes alguna duda puedes plantearla, asi los que posteriormente lean la entrada podrán resolver algunas dudas también.
      Te recomendaria primeramente tener la librería mencionada, es de paga y ya no recuerdo bien esa parte pero creo que necesita un archivo con extensión .lic, esa librería me la proporcionaron en la empresa donde trabajaba asi que la verdad no me metí a investigar mucho cómo conseguirla.

      Espero que puedas plantear tus dudas.

      Eliminar
  6. Hola, Com.Griaule.IcaoFace.IcaoImage donde la consigo puedes enviarme el codigo del proyecto? gracias de antemano

    ResponderEliminar
  7. Me llama mucho la atención como ha cambiado la tecnologia en 6 años... una de las partes buenas que nos empieza a dejar internet es que hay una historia de las cosas...
    muchas gracias por el post!

    ResponderEliminar