You are on page 1of 4

27 de agosto de 2009

Utilizar lector de huellas en nuestras aplicaciones .net - Segunda parte


En esta entrada le mostrar la forma en la que pueden implementar el lector de huellas digitales (o
dactilares) en nuestras aplicaciones .net.

El ejemplo esta hecho en C# con VS 2010, MySQL y la librera de Griaulle (fingerpint SDK 2009); si
no recuerdan de donde obtener la librera, pueden consultarlo aqu. Se utiliz, tambin, el
connector/net para enlazar a MySQL con C#.

Lo primero que debemos hacer es instalar el Griaulle Fingerprint SDK 2009, este ejemplo est
hecho con la versin 2009 del SDK. Es importante recordar la ruta de la instalacin.

Como segundo paso debemos configurar nuestra base de datos, ya que la informacin se
almacenar en dicha base de datos, en el ejemplo realizado tenemos una base de datos llamada
finger y una tabla llamada data, la tabla tiene 5 campos:
Id (int)
texto_asociado (text): en este campo almacenaremos un texto de referencia para identificar el
registro
template (mediumblob): aqu almacenaremos el template extrado de la huella.
Imagen (mediumblob): este campo no se utiliza en este ejemplo
Calidad_template (int): sirve para almacenar la calidad del template extraido y almacenado en el
campo template.

Una vez creado el proyecto en VS, el primer


paso es agregar la referencia de la librera de
Griaulle a nuestro proyecto, eso lo hacemos con
un clic con el botn derecho en el explorador
de soluciones (Solution Explorer), en la seccin
de referencias (references), del men
emergente seleccionamos: Agregar
referencia(Add reference), posteriormente
seleccionamos la pestaa Examinar (Browse) y
tenemos que elegir el directorio de instalacin
del SDK (en este caso: C:\Program
Files\Griaule\Fingerprint SDK
2009\bin\GriauleFingerprintLibrary.dll);
realizamos los mismo pasos para el
connector/net que nos servir para la Base de
Datos (la direccin en este caso es: C:\Program
Files\MySQL\MySQL Connector Net
6.0.4\Assemblies\MySql.Data.dll). Ya que hemos
agregado las referencias, podemos iniciar con
nuestro proyecto.

En el ejemplo mostrado, hemos diseado un formulario con 2 opciones:


Registrar: Inserta la informacin de la huella recin adquirida en la base de datos, junto con el texto
asociado.

Identificar: Identifica la huella, comparando la huella recin extraida contra cada una de las huellas
almacenadas en la base de datos.

Hace falta una opcin importante: Verificar, pero es muy fcil de implementar.
Si no recuerdan lo que significa Identificar, Verificar o algn otro concepto, este es el momento
perfecto para consultarlo en este articulo.
Al momento de utilizar el fingerprint SDK, lo que debemos hacer es declarar e inicializar un objeto
del tipo FingerprintCore:
GriauleFingerprintLibrary.FingerprintCore core = New
GriauleFingerprintLibrary.FingerprintCore();

Despus, declaramos los manejadores de los eventos onStatus (se dispara cada vez que un lector
de huellas es conectado o desconectado) y onImage (se dispara cada vez que una imagen es
adquirida por algn lector):

core.onStatus += new
GriauleFingerprintLibrary.StatusEventHandler(core_onStatus);
core.onImage += new
GriauleFingerprintLibrary.ImageEventHandler(core_onImage);

Uno de los requisitos para poder utilizar la libreria es inicializarla, es decir, indicar que vamos a
iniciar el uso de la librera:

core.Initialize();

Hecho esto, podemos indicar al lector que vamos a hacer uso de la captura de huellas:

core.CaptureInitialize();

--------------------------------
Texto agregado el 18/12/2009: Personalmente he optado por declarar los eventos y realizar las
inicializaciones correspondientes en el evento load del formulario.
--------------------------------

Hasta este punto hemos iniciado la captura de huellas con nuestro lector y hemos definido la
funcin que se ejecutar cada vez que una huella se adquiere del lector (con el evento onImage) y
la funcin que se ejecuta cuando un lector es conectado o desconectado en nuestro equipo (con el
evento onStatus).

En la funcin que se ejecuta cuando el lector es conectado al equipo, debemos indicarle a la librera
que debe iniciar la captura de huellas con ese lector, esto lo hacemos de la siguiente manera:

void core_onStatus(object source,GriauleFingerprintLibrary.Events.StatusEventArgs


se)
{
if (se.StatusEventType == GriauleFingerprintLibrary.Events.StatusEventType.SENSOR_PLUG)
{
core.StartCapture(source);
}
}

/*--------Aadido el 09 de Marzo del 2010------------*/

La funcin onImage que utilizamos en el ejemplo hace una comprobacin de la calidad de la imagen
obtenida del lector, si es de mala calidad se debe volver a capturar una huella, si es de calidad
media se pregunta al usuario si desea continuar y si es de buena calidad se contina sin ningn
problem:

void core_onImage(object source,


GriauleFingerprintLibrary.Events.ImageEventArgs ie)
{
buttonOK.Enabled = groupBox1.Enabled = false;
try
{
imagenHuella = ie.RawImage;
core.Extract(imagenHuella, ref templateHuella); //
extraemos la informacion de la huella y almacenamos esa informacion en
templateHuella (se tiene que pasar como referencia a la funcion)

switch(templateHuella.Quality)
{
case 0: // en caso de que la huella sea de mala
calidad, se tiene que volver a extraer la huella
labelCalidad.Text = "La huella es de mala calidad,
vuelva a intentar";
return;

case 1: // si la huella es de calidad media,


preguntamos si desean volver a extraerla
labelCalidad.Text = "Calidad media";
if (MessageBox.Show("la huella es de una calidad
media, desea continuar?", "", MessageBoxButtons.YesNo) ==
DialogResult.Yes)
break;
return;

case 2: // si la huella es de buena calid, se


procede con el programa
labelCalidad.Text = "Huella con buena calidad";
break;
}

buttonOK.Enabled = groupBox1.Enabled = true;

}
catch (System.Exception exc)
{
MessageBox.Show(exc.Message);
}
}

/*-----------------Aqu termina lo aadido el 09 de Marzo del 2010----------------*/

La condicin if() es para verificar que se ha conectado un lector (recuerden que tambin se ejecuta
el evento onStatus cuando se desconecta un lector)

La instruccin core.StartCapture(source); inicia la captura con el lector recin conectado mediante


el objeto source, que contiene los identificadores del lector conectado.

En este momento, si colocamos una huella en el lector, se disparar tambin el evento onImage,
para poder manejar la huella, debemos extraer el template y almacenarlo en memoria para poder
insertarlo en la base de datos, eso lo hacemos con la funcin Extract()

GriauleFingerprintLibrary.DataTypes.FingerprintRawImage imagenHuella;
imagenHuella = ie.RawImage;
core.Extract(imagenHuella, ref templateHuella);

en la funcin Extract(), el parmetro imagenHuella es la imagen original de la huella adquirida y


el parmetro templateHuella es el objeto donde se almacenar el template que se extraiga a partir
de imagenHuella.

Ya que tenemos el template, estamos listos para insertar el registro en la base de datos, es
importante que sea mediante parmetros, en el ejemplo hemos usado nuestra propia librera, por lo
que la instruccin que usamos es la siguiente:

bd.InsertarRegistroParametrizado("INSERT INTO data


(texto_asociado,template,calidad_template,imagen) VALUES('"
+ txtBxRegistrar.Text + "',@template," + templateHuella.Quality.ToString()
+ ",'')",
"@template", (object)templateHuella.Buffer);

Como requirimiento minimo se debe insertar el template de la huella y la calidad que tiene dicho
template (se obtiene con la propiedad templateHuella.Quality

En el cdigo disponible se puede observar cmo insertar registros con parmetros.


Hasta este momento tenemos tenemos al menos un registro en la base de datos, ahora podemos
iniciar el proceso de identificacin.

Para llevar a cabo el proceso de identificacin es necesario recuperar cada uno de los registros
existentes en nuestra base de datos para poder compararlos uno por uno. Para poder ir
almacenando temporalmente los registros de la base de datos, debemos crear un objeto donde
almacenemos el template

string consulta;
byte[] dataTemp; //nos permitir almacenar temporalmente el template de la B.D.
GriauleFingerprintLibrary.DataTypes.FingerprintTemplate templateTemp;
int precision,calidad;

consulta = "select texto_asociado, template, calidad_template from data


where 1=1";
MySql.Data.MySqlClient.MySqlDataReader rdr =
bd.EjecutarConsulta(consulta);
//debemos preparar la libreria para la identificacion de huellas
core.IdentifyPrepare(templateHuella);

while (rdr.Read())
{
dataTemp = (byte[])rdr["template"]; //extraemos el template desde la B.D.
calidad = (int)rdr["calidad_template"]; //extraemos la calidad de ese template

/* Creamos un nuevo objeto del tipo temporal "FingerprintTemplate" y asignamos las propiedades
del template que acabamos de extraer de la B.D.*/
templateTemp = new
GriauleFingerprintLibrary.DataTypes.FingerprintTemplate();
templateTemp.Buffer = dataTemp;
templateTemp.Size = dataTemp.Length;
templateTemp.Quality = calidad;
if ((core.Identify(templateTemp, out precision))==1) //si el template cumple con
los requisitos de presicin
{
MessageBox.Show(rdr["texto_asociado"].ToString());
break;
}
}

En el cdigo anterior, con el ciclo while(rdr.Read()){} se va obteniendo cada uno de los


registros de la base de datos uno por uno, dentro del ciclo asignamos la informacin del template en
un arreglo de bytes, con la condicin if() determinamos si el template de la base de datos coincide
con el template recin extraido

You might also like