Comparación 1:1 de Huellas dactilares con SourceAFIS para Java

 

SourceAFIS es un algoritmo que reconoce las huellas dactilares humanas. Puede comparar dos huellas dactilares 1:1 o buscar en una base de datos grande 1:N para hacer coincidir la huella dactilar. Toma imágenes de huellas dactilares en la entrada y produce una puntuación de similitud en la salida. La puntuación de similitud se compara con el umbral de coincidencia personalizable. Así lo indica SourceAfis en su página principal, el proyecto fue desarrollado por Robert Važan originario de Eslovaquia, este es sin dudas el proyecto open source bimétrico mas completo desarrollado, está disponible para Java y .Net. El proyecto fue actualizado recientemente, añadienloe la funcionalidad a la versión Java de poder extraer un template a partir de una imagen JPG de una huella dactilar, algo que hasta hace poco solo estaba disponible para la versión .Net; inclusyo la we de SourceAfis está mas ordenada y estética, con ejemplos claros y puntuales. Otro aspecto que tengo que recalcar fue que la estructura del proyecto fue modificada drasticamente haciendola mas simple.

En esta ocasión pongo de manera puntual como realizar verificaciones biométricas 1:1 con Java.

Algo que hay que tengo que recalcar es que dichos ejemplos constituyen al proceso que viene luego de haberse obtenido la huella dactilar de un lector biométrico (si usted no está familiarizado con procesos biometricos, esto le puede resultar un tanto confuso), es bien sabido que esto le añade versatilidad y robustes al proyecto, ya que no depende de la marca del lector biometrico y esto puede significar en una escalabilidad de cualquier proyecto biométrico.

 

CONCEPTOS BÁSICOS ANTES DE COMENZAR:

Verificación 1:1 Correspondencia biométrica a menudo conocida como matching entre 2 huellas dactilares, dada una huella dactilar Candidata y una huella dactilar Prueba

Verificación 1:N Correspondencia biometrica a menudo conocida como matching entre 1 una huella dactilar comparada con una base de datos de N huellas dactilares

Huella Candidata Huella biométrica que es tomada al individuo para ser identificada con una base de datos u otra huella dactilar

Huella Prueba Huella biométrica almacenada en un registro o base de datos la cual se utilizó para un registro inicial del candidato

Al grano y puntual.

Importando desde Maven

<dependency>
    <groupId>com.machinezoo.sourceafis</groupId>
    <artifactId>sourceafis</artifactId>
    <version>3.2.2</version>
</dependency>

Importando desde Gradle

compile group: 'com.machinezoo.sourceafis', name: 'sourceafis', version: '3.2.2'

Código Java
Comparacion 2 platillas biométricas ISO19794
Para esta prueba es necesario que los templates biométicos estén en el formato ISO1974 ya que este es el soportado por SourceAfis

public static void FingerTemplateMatch() throws IOException {
        byte[] templateProbe = readAllBytes(Paths.get("X:\\rutaTemplateISO_P"));
        byte[] templateCandidate = readAllBytes(Paths.get("X:\\rutaTemplateISO_C"));
        FingerprintTemplate probe = new FingerprintTemplate().convert(templateProbe);
        FingerprintTemplate candidate = new FingerprintTemplate().convert(templateCandidate);
        double score = new FingerprintMatcher().index(probe).match(candidate);
        double threshold = 40;
        boolean matches = score >= threshold;
        System.out.println(matches);
}

Para implementación este código no podría ser la mejor manera, pero sin lugar a dudas puede servir para una interpretación mas clara aca mencionamos las variables mas imporantes:

  • byte[] templateProbe -> Variable que lee directamente el bloque de bytes proporcionado por una ruta en disco hacia un template de Prueba en formato ISO19794, el template de prueba se considera el template base sobre el cual se buscará hacer match con todos los templates candidatos
  • byte[] templateCandidate -> Variable que lee directamente el bloque de bytes proporcionado por una ruta en disco hacia un template Candidato en formato ISO19794, el template candidato busca autenticarse con el template prueba
  • double score -> Puntuación de similitud devuelta es un número no negativo que aumenta con la similitud entre las huellas dactilares prueba y candidata
  • double threshold -> Umbral, el recomendado es 40, que corresponde a FMR 0.01%. La correspondencia entre el umbral y el FMR es aproximada y varía con la calidad de las huellas dactilares coincidentes, a mayor umbral mayor certeza de credibilidad de matching entre la huella candidata y la huella prueba, pero existe un menor número de posiblidades de no correspondencia respecto a variables biometricas que juegan en contra como mala captura o una captura pobre de la huella dactilar.
  • boolean matches -> Debe comparar el puntaje con un umbral con expresión (puntaje>=umbral) para llegar a una decisión booleana de coincidencia o no coincidencia

Una reescritura del anterior código para un uso mas estándarizado y orientado a memoria, sería de la siguiente manera:

public static boolean FingerTemplateMatch(byte[] templateProbe, byte[] templateCandidate, double threshold) throws IOException {
    FingerprintTemplate probe = new FingerprintTemplate().convert(templateProbe);
    FingerprintTemplate candidate = new FingerprintTemplate().convert(templateCandidate);
    double score = new FingerprintMatcher().index(probe).match(candidate);
    return score >= threshold;
}

Comparacion 2 huellas en formato de imagen JPG
Para esta prueba es necesario que las huellas dactilares estén en formato JPG/JPEG

public static void FingerImageMatch () throws IOException {
        byte[] probeImage = Files.readAllBytes(Paths.get("D:\\huella.jpg"));
        byte[] candidateImage = Files.readAllBytes(Paths.get("D:\\huella2.jpg"));
        FingerprintTemplate probe = new FingerprintTemplate().dpi(500).create(probeImage);
        FingerprintTemplate candidate = new FingerprintTemplate().dpi(500).create(candidateImage);
        double score = new FingerprintMatcher().index(probe).match(candidate);
        double threshold = 40;
        boolean matches = score >= threshold;
        System.out.println(matches);
}
  • byte[] probeImage -> Variable que lee directamente el bloque de bytes proporcionado por una ruta en disco hacia una imagen de Huella Dactilar de Prueba
  • byte[]  candidateImage -> Variable que lee directamente el bloque de bytes proporcionado por una ruta en disco hacia una imagen de Huella Dactilar Candidata
  • dpi -> Variable que recibe el método dpi en la creación del objeto FingerrpintTemplate, esta por default está en 500 (ya que es un estándar), pero se debe de recalcar que cada lector biometrico puede tener diferentes profundidades de lectura por lo que habría que regirse a las esepecificaciones del lector biométrico para configurar esta variable
  • double score -> Puntuación de similitud devuelta es un número no negativo que aumenta con la similitud entre las huellas dactilares prueba y candidata
  • double threshold -> Umbral, el recomendado es 40, que corresponde a FMR 0.01%. La correspondencia entre el umbral y el FMR es aproximada y varía con la calidad de las huellas dactilares coincidentes, a mayor umbral mayor certeza de credibilidad de matching entre la huella candidata y la huella prueba, pero existe un menor número de posiblidades de no correspondencia respecto a variables biometricas que juegan en contra como mala captura o una captura pobre de la huella dactilar.
  • boolean matches -> Debe comparar el puntaje con un umbral con expresión (puntaje>=umbral) para llegar a una decisión booleana de coincidencia o no coincidencia

Una reescritura del anterior código para un uso mas estándarizado y orientado a memoria, sería de la siguiente manera:

public static boolean FingerImageMatch (byte[] probeImage, byte[] candidateImage, int dpiProbeIMG, int dpiCandidateIMG, double threshold) throws IOException {
        FingerprintTemplate probe = new FingerprintTemplate().dpi(dpiProbeIMG).create(probeImage);
        FingerprintTemplate candidate = new FingerprintTemplate().dpi(dpiCandidateIMG).create(candidateImage);
        double score = new FingerprintMatcher().index(probe).match(candidate);
        return score >= threshold;
}
Anuncios

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 )

Google+ photo

Estás comentando usando tu cuenta de Google+. 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 )

w

Conectando a %s