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
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:
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/
$ ./configurechecking 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:
$ makemake 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 $ lscapture_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_fingerdpfp_open_usb: interface claim failed dev: Device or resource busy dpfp_set_mode: 0 Falha de segmentaçãoCaso 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_fingerdpfp_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_continuousdpfp_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 offClique 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_enhanceddpfp_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:
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.pgm1/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.pgm1/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.pgm1/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
- Login automático com SSH e Automatização da instalação (deploy) e atualização de sites com GitLinux
- Extensão Sun Presentation Minimizer para Broffice.ORGLinux
- Otimização de Desempenho em sistemas GNU/LinuxLinux
- Hardware para sistemas GNU/Linux - Dicas de Desempenho - Parte 3Hardware
- Hardware para sistemas GNU/Linux - Dicas de Desempenho - Parte 2Hardware