Infra - Linux

Biometria: Processamento de imagens capturadas em leitores de impressão digital

Extração da imagem com um leitor de impressão digital é o primeiro passo no processo de verificação ou identificação biométrica. Neste artigo utilizaremos a biblioteca libdpfp para efetuar o processamento do cálculo das minúcias das imagens capturadas em leitores biométricos de impressão digital.

por Alessandro de Oliveira Faria



Introdução

A impressão digital é composta de linhas formadas pelas elevações da pele. A comparação por impressão digital é um método utilizado a mais de mil anos como forma de identificação de usuários. É uma característica única entre os seres humanos, inclusive entre irmão gêmeos univitelinos.

Formada ainda quando feto, a impressão digital acompanha a pessoa por toda a sua existência sem apresentar grandes mudanças. Extraindo os pontos característicos ou ponto de minúcias de uma impressão digital, um papiloscopista ou sistemas computadorizados podem identificar pessoas utilizando cálculos bastantes confiáveis.

São vários os tipos de impressões digitais, abaixo algumas imagens de diferentes digitais:

Grande parte dos algoritmos trabalham com o princípio de extração dos pontos de minúcias ou pontos característicos. Após a extração são calculados a relação entre as distâncias destes pontos, cada algoritmo possui a sua base de cálculo, seja por análise dos pontos entre si ou por agrupamentos de pontos para análise de semelhanças de triângulos com os ângulos internos.

Neste artigo calcularemos os pontos de minúcias utilizando a biblioteca libdpfp-0.2.1. Esta versão da biblioteca incorporou a abstração de hardware (módulo do kernel) para acesso ao leitor, com isto hoje já não é preciso instalar o módulo dos leitores compatível com a linha U.Are.U da digital persona.

Este release (versão 0.2.1da libdpfp) contém parte do código do projeto fvs e eFinger, utilizada para processar as imagens extraídas dos leitores de impressão digital.

Na primeira fase a biblioteca extrai a imagem do sensor conforme o exemplo abaixo:

Aplicando a extração de filtro de gabor, a linha da impressão digital é realçada com a cor preta.

Na próxima etapa a imagem já esta binarizada (branco e preto), as linhas foram reduzidas a um único pixel de largura.

Agora ficou fácil detectar os pontos de minúcias. Fazendo um exame de cada pixel na imagem, se houver um pixel branco sem vizinhos significa que encontramos um ponto terminal. Caso um ponto branco possua 3 pontos vizinhos, significa que encontramos uma bifurcação.

Veja o resultado abaixo:

Agora o próximo passo a ser implementado na biblioteca em termos de desenvolvimento é a comparação dos pontos de minúcias para obter o índice de similaridade entre duas impressões digitais.

O projeto eFinger executa esta tarefa, mas encontra-se ainda em fase embrionária, pois o algoritmo não considera rotação dos pontos, mas sem sombra de dúvida é um bom ponto de partida. Bom, depois de tanta teoria, vamos a prática no próximo capítulo. Download, instalação e execução

O download da biblioteca deve ser efetuado em:

  • http://download.berlios.de/dpfp/libdpfp-0.2.1.tar.gz

    Utilize o comando wget como no exemplo abaixo para fazer o download do pacote .tar.gz.

    $ mkdir uareu4000
    $ cd uareu4000
    $ wget
    http://download.berlios.de/dpfp/libdpfp-0.2.1.tar.gz

    Após o download descompacte o pacote com o comando tar -zxvf com no exemplo abaixo:

    $ tar -zxvf libdpfp-0.2.1.tar.gz

    libdpfp-0.2.1/
    libdpfp-0.2.1/config.guess
    libdpfp-0.2.1/ChangeLog
    libdpfp-0.2.1/libdpfp/
    libdpfp-0.2.1/libdpfp/Makefile.am
    libdpfp-0.2.1/libdpfp/dpfp_fprint_efinger.c
    libdpfp-0.2.1/libdpfp/dpfp.c
            :           :          :
            :           :          :
    ALGUNS SEGUNDOS DEPOIS
            :           :          :
            :           :          :
            :           :          :
    libdpfp-0.2.1/AUTHORS
    libdpfp-0.2.1/COPYING
    libdpfp-0.2.1/configure
    Agora utilize o comando configure para uma posterior compilação. 
    

    $ cd libdpfp-0.2.1/
    $ ./configure
    checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    checking for gawk... gawk
    checking whether make sets $(MAKE)... yes
    checking for gcc... gcc
            :           :          :
            :           :          :
    ALGUNS SEGUNDOS DEPOIS
            :           :          :
            :           :          :
            :           :          :
    config.status: creating examples/Makefile
    config.status: creating config.h
    config.status: executing depfiles commands
    Agora com o comando make, compile a a biblioteca libdpfp, abaixo o exemplo 
    de compilação: 

    $ make
    make  all-recursive
    make[1]: Entering directory `/neti/prg/uareu4000/libdpfp-0.2.1"
    Making all in libdpfp
    make[2]: Entering directory `/neti/prg/uareu4000/libdpfp-0.2.1/libdpfp"
            :           :          :
            :           :          :
    ALGUNS SEGUNDOS DEPOIS
            :           :          :
            :           :          :
            :           :          :
    make[2]: Leaving directory `/neti/prg/uareu4000/libdpfp-0.2.1"
    make[1]: Leaving directory `/neti/prg/uareu4000/libdpfp-0.2.1"
    Transforme-se em SUPER-USUÁRIO e entre na pasta examples. Digite o comando 
    "ls" para verificar se os arquivos binários se encontram presentes. 

    $ cd examples $ ls
    capture_continuous                               capture_finger_enhanced
    capture_continuous.c                             capture_finger_enhanced.c
    capture_continuous-capture_continuous.o          capture_finger_enhanced.o
    capture_continuous_gtk                           capture_finger.o
    capture_continuous_gtk.c                         Makefile
    capture_continuous_gtk-capture_continuous_gtk.o  Makefile.am
    capture_finger                                   Makefile.in
    capture_finger.c
    Conecte o sensor de impressão digita e execute o programa 
    capture_finger para verificar se o leitor esta funcionando corretamente. 
    

    # ./capture_finger
    dpfp_open_usb: interface claim failed
    dev: Device or resource busy
    dpfp_set_mode: 0
    Falha de segmentação
    

    Caso o erro "Device or resource busy" ocorra como no exemplo acima, provavelmente você já possui o módulo do kernel do sensor u.are.u instalado em seu sistema (artigo anterior: Instalando leitores de impressão digital modelo Digital Persona no Linux). Este módulo foi incorporado na nova versão da biblioteca, assim sendo não mais necessário alocá-lo em memória. Para removê-lo, utilize o comando "rmmod" como no exemplo baixo:

    # rmmod dpfp

    Agora execute o programa capture_finger novamente:

    # ./capture_finger

    dpfp_get_hwstat: [1] 1
    dpfp_set_mode: 0
    dpfp_set_hwstat_pwr: power off
    dpfp_set_hwstat_pwr: power on
    dpfp_get_irq: irq type 56aa
    place your finger on the sensor
    dpfp_set_mode: 10
    dpfp_get_irq: timeout, retry
    dpfp_get_irq: irq type 0101
    dpfp_set_mode: 20
    dpfp_fprint_write_to_file: wrote fprint to finger.pgm
    dpfp_set_mode: 0
    dpfp_set_hwstat_pwr: power off
    Se tudo estiver funcionando corretamente, uma imagem com o nome finger.pgm 
    será gerada no disco. Veja a imagem gerada pelo programa capture_finger:
    

    Para visualizar a imagem do sensor de impressão digital em tempo real, execute o programa capture_continuous ou capture_continuous_gtk e veja o resultado:

    # ./capture_continuous

    dpfp_get_hwstat: [1] 85
    dpfp_open_usb: device powered down on open, attempting to correct
    dpfp_set_hwstat_pwr: power on
    dpfp_get_hwstat: [1] 0
    dpfp_open_usb: device state corrected successfully
    dpfp_set_mode: 0
    dpfp_set_hwstat_pwr: power off
    dpfp_set_hwstat_pwr: power on
    dpfp_get_irq: irq type 56aa
    using Xv format 0x32595559 YUY2 packed
    dpfp_set_mode: 20
    Press M for CCD mode, E for enhanced mode, Q to quit
    dpfp_set_mode: 0
    dpfp_set_hwstat_pwr: power off
    

    Clique aqui para ver uma apresentação em Flash.

    O programa capture_finger_enhanced efetua o processamento da imagem, binarização e todos os processos citados no início do artigo.

    # ./capture_finger_enhanced

    dpfp_get_hwstat: [1] 83
    dpfp_open_usb: device powered down on open, attempting to correct
    dpfp_set_hwstat_pwr: power on
    dpfp_get_hwstat: [1] 0
    dpfp_open_usb: device state corrected successfully
    dpfp_set_mode: 0
    dpfp_set_hwstat_pwr: power off
    dpfp_set_hwstat_pwr: power on
    dpfp_get_irq: irq type 56aa
    dpfp_set_mode: 20
    place your finger on the sensor
    dpfp_set_mode: 10
    dpfp_get_irq: irq type 0101
    dpfp_set_mode: 20
    dpfp_set_mode: 0
    dpfp_set_hwstat_pwr: power off
    dpfp_fprint_write_to_file: wrote fprint to finger.pgm
    dpfp_fprint_soften_mean: took 0.006778 seconds
    dpfp_fprint_get_direction: took 0.804882 seconds
    fprint_direction_low_pass: took 0.139284 seconds
    dpfp_fprint_get_frequency: took 1.362015 seconds
    dpfp_fprint_get_mask: took 0.007775 seconds
    dpfp_fprint_enhance_gabor: took 4.805600 seconds
    dpfp_fprint_write_to_file: wrote fprint to finger_enhanced.pgm
    dpfp_fprint_thin: took 0.057944 seconds
    enhancements took 7.189731 seconds in total
    dpfp_fprint_write_to_file: wrote fprint to finger_thinned.pgm
    Veja as imagens geradas como resultado:
    

    Mas eu não tenho sensor U.Are.U? Eu tenho outro modelo o que fazer!!!??

    Princípio número um, muita calma, caso você não possua um leitor compatível com a linha digital persona, poderá utilizar direto o algoritmo do pacote fvs. Para isto, em primeiro lugar faça o download o pacote em:

  • http://ufpr.dl.sourceforge.net/sourceforge/fvs/fvs-0.1.1.tar.gz

    Utilize o comando wget como no exemplo abaixo para fazer o download do pacote .tar.gz.

    $ mkdir uareu4000
    $ cd uareu4000
    $ wget
    http://ufpr.dl.sourceforge.net/sourceforge/fvs/fvs-0.1.1.tar.gz

    Após o download descompacte o pacote com o comando tar -zxvf com no exemplo abaixo:

    $ tar -zxvf fvs-0.1.1.tar.gz

    fvs-0.1.1/
    fvs-0.1.1/ChangeLog
    fvs-0.1.1/AUTHORS
    fvs-0.1.1/COPYING
    fvs-0.1.1/Makefile.am
    fvs-0.1.1/INSTALL
            :           :          :
            :           :          :
    ALGUNS SEGUNDOS DEPOIS...
            :           :          :
            :           :          :
            :           :          :
    fvs-0.1.1/autom4te.cache/traces.0
    fvs-0.1.1/version.sh
    fvs-0.1.1/libtool
    Agora novamente com o comando make, compile o pacote fvs, abaixo o exemplo 
    de compilação: 

    $ cd fvs-0.1.1/
    $ make
            :           :          :
            :           :          :
    ALGUNS SEGUNDOS DEPOIS...
            :           :          :
            :           :          :
            :           :          :
    Entre na pasta demos para executar alguns programas e verificar o 
    funcionamento dos processos. 

    $ cd demos

    O programa fvs_binarize gera uma imagem binarizada (branco e preto) com o nome finger_binarize.pgm.

    $ ./fvs_binarize finger01.pgm finger_binarize.pgm
    1/5 Determining the ridge direction
    2/5 Determining the ridge frequency
    3/5 Creating the mask
    4/5 Enhancing the fingerprint image
    5/5 Binarize
    Cleaning up and exiting...
    Abaixo um exemplo de imagem gerada:
    

    O programa fvs_direction detecta as direções das impressões digitais.

    $ ./fvs_direction finger_binarize.pgm finger_direction.pgm Opening file finger_binarize.pgm... 1/2 Determining the ridge direction 2/2 Creating a new image with the direction Cleaning up and exiting... Veja o resultado:

    O programa fvs_thinner converte as linhas da impressão digital em um único pixel de largura.

    $ ./fvs_thinner finger01.pgm finger_thinner.pgm

    1/6 Determining the ridge direction
    2/6 Determining the ridge frequency
    3/6 Creating the mask
    4/6 Enhancing the fingerprint image
    5/6 Binarize
    6/6 Thinning
    Cleaning up and exiting...
    Veja o resultado:
    

    Agora finalmente o cálculo dos pontos de minúcias executando o programa fvs_minutia.

    $ ./fvs_minutia finger01.pgm finger_minutia.pgm

    1/8 Determining the ridge direction
    2/8 Determining the ridge frequency
    3/8 Creating the mask
    4/8 Enhancing the fingerprint image
    5/8 Binarize
    6/8 Thinning
    7/8 Detecting minutia
    8/8 Drawing minutia
    Cleaning up and exiting...
    Veja o resultado:
    

    O objetivo deste documento é esclarecer o funcionamento da biometria voltada para leitura de impressão digital. Os próximos passos são o processamento para identificação e verificação entre duas impressões digitais para determinar a sua similaridade.

    A NETi TECNOLOGIA (empresa no qual sou sócio proprietário) desenvolve soluções biométricas desde 1997. Várias aplicações baseadas em plataforma GNU/Linux utilizando a biometria de conhecimento facial e impressão digital foram desenvolvidas para o mercado consumidor. Abaixo um vídeo demonstrativo de uma aplicação exemplo utilizando o reconhecimento através da impressão digital com algoritmos disponíveis no mercado.

    [Vídeo] http://cabelo.linuxdicas.com.br/videos/digital.html
    [Vídeo] http://cabelo.linuxdicas.com.br/videos/finger.html

    Imagem de uma aplicação biométrica:

    "O próximo grande salto evolutivo da humanidade será a descoberta de que cooperar é melhor que competir"

    Prof. Pietro Ubaldi

    Sobre o autor: http://www.netitec.com.br/alessandro

  • Alessandro de Oliveira Faria

    Alessandro de Oliveira Faria - Sócio-proprietário da empresa NETi TECNOLOGIA fundada em Junho de 1996 (http://www.netitec.com.br), empresa especializada em desenvolvimento de software e soluções biométricas, Consultor Biométrico na tecnologia de reconhecimento facial, atuando na área de tecnologia desde 1986 assim propiciando ao mercado soluções em software nas mais diversas linguagens e plataforma, levando o Linux a sério desde 1998 com desenvolvimento de soluções open-source, membro colaborador da comunidade Viva O Linux, mantenedor da biblioteca open-source de vídeo captura entre outros projetos.