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.

[ Hits: 88.375 ]

Por: Alessandro de Oliveira Faria (A.K.A. CABELO) em 05/10/2006 | Blog: http://assuntonerd.com.br


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/
$ ./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

Caso não consiga ver a apresentação em flash acima, segue o link do vídeo:
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:





Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Download, instalação e execução
   3. Mas eu não tenho sensor U.Are.U? Eu tenho outro modelo o que fazer!!!??
Outros artigos deste autor

Como instalar um cartão PCMCIA (modem/rede) no meu notebook?

Conheçam a linguagem D (saiu do forno)!

KDE-Edu e Gcompris: Software Livre a serviço da educação

WebCDWrite: O incrível serviço de gravação de CD-R sob demanda via HTTP

Gerando em tempo real efeito de voz robotizada

Leitura recomendada

Participe da revista Viva o Linux

Como executar tarefas a cada 5, 10 ou 15 minutos

APTonCD: Ubuntu Linux sem dependência de internet

Monitorando a temperatura do computador com lm_sensors + MRTG

Instalação do XFCE 4.2 no Debian

  
Comentários
[1] Comentário enviado por jeffestanislau em 05/10/2006 - 09:56h

Grande Cabelo,
Tava quebrando a cuca aqui pra viabilizar isso, seu artigo caiu do céu!

[]'s meu amigo!

[2] Comentário enviado por danilorlima em 05/10/2006 - 10:33h

Pô Cabelo, show este artigo!!!
Sempre procurei saber qual era o algoritmo usado nestes calculos, parabéns... e o reconhecimento facial é a mesma coisa ?

[3] Comentário enviado por removido em 05/10/2006 - 12:19h

Quando fiz make deu essa saída:

dpfp.c:69: warning: 'struct usb_device' declared inside parameter list
dpfp.c:69: warning: its scope is only this definition or declaration, which is probably not what you want
dpfp.c: In function 'get_dev_entry':
dpfp.c:75: error: dereferencing pointer to incomplete type
dpfp.c:76: error: dereferencing pointer to incomplete type
dpfp.c: At top level:
dpfp.c:159: warning: 'struct usb_device' declared inside parameter list
dpfp.c: In function 'dpfp_open_usb':


[4] Comentário enviado por guesser em 05/10/2006 - 21:16h

Impressionante como este cara é bom!!!!!

Abraço

[5] Comentário enviado por bolus em 06/10/2006 - 03:39h

Quando efetuei o Make, recebi a seguinte mensagem:
[root@SvrTechBOX libdpfp-0.2.1]# make
make all-recursive
make[1]: Entering directory `/home/phsoares/uareu4000/libdpfp-0.2.1'
Making all in libdpfp
make[2]: Entering directory `/home/phsoares/uareu4000/libdpfp-0.2.1/libdpfp'
make[2]: Nada a ser feito para `all'.
make[2]: Leaving directory `/home/phsoares/uareu4000/libdpfp-0.2.1/libdpfp'
Making all in examples
make[2]: Entering directory `/home/phsoares/uareu4000/libdpfp-0.2.1/examples'
/bin/sh ../libtool --tag=CC --mode=link gcc -g -O2 -o capture_continuous capture_continuous-capture_continuous.o ../libdpfp/libdpfp.la -ldpfp -lXv -lXext -lX11 ;
gcc -g -O2 -o .libs/capture_continuous capture_continuous-capture_continuous.o -L/usr/local/lib ../libdpfp/.libs/libdpfp.so /usr/local/lib/libusb.so -lm -lXv -lXext -lX11
/usr/bin/ld: cannot find -lXv
collect2: ld returned 1 exit status
make[2]: ** [capture_continuous] Erro 1
make[2]: Leaving directory `/home/phsoares/uareu4000/libdpfp-0.2.1/examples'
make[1]: ** [all-recursive] Erro 1
make[1]: Leaving directory `/home/phsoares/uareu4000/libdpfp-0.2.1'
make: ** [all] Erro 2
[root@SvrTechBOX libdpfp-0.2.1]#

[6] Comentário enviado por leoberbert em 06/10/2006 - 09:19h

Cara... Ficou excelente o artigo viu!!! Parabéns amigo!!!

Abração!

[7] Comentário enviado por michelpereira em 06/10/2006 - 13:41h

Mais uma vez o grande Alexandre nos brinda com um artigo fascinante e objetivo sobre biometria.

Parabéns novamente!

[8] Comentário enviado por evertonstm em 06/10/2006 - 18:01h

caraca esse cara e um extraterrestre, artigo espetacular valeu ai Kbelo..
vc e o cara ....

[9] Comentário enviado por removido em 09/10/2006 - 13:34h

Kra fantastico o artigo
agora qual hardware vc aconselharia comprar para fazer os testes ?

[10] Comentário enviado por balani em 09/10/2006 - 18:00h

Muito loko véio, esse campo tá crescendo cada vez mais, na empresa que trabalho o relogio de ponto com biometria. Parabens pelo artigo.

[11] Comentário enviado por retamero em 15/09/2007 - 23:21h

Interessante o assunto.

Alguem aqui conhece o leitor Hamster I da Nitgen (
no site deles fala de uma SDK (pra desenvolver em varios Windows e Linux e varias liguagens)

só que o driver que acompanha o SDK nào funciona nem com reza

seguindo este artigo tb não consegui fazer funcionar com esse hardware

lsusb
Bus 3 Device 2: ID 0a86:0100 NITGen Co., Ltd


[12] Comentário enviado por admtempos em 23/01/2009 - 18:02h

Muito intereçante este post num futuro muito possimo as autenticação serão assim

[13] Comentário enviado por sciani em 17/04/2009 - 11:12h

ae Cabelo, oqq eu faço se eu naum tenho nenhum leitor de digitais, e somente um banco de dados onde eu vou abrir as imagens de digitais?

abraços

[14] Comentário enviado por edu_light em 30/09/2009 - 17:19h

Cabelo, replico a pergunta enviada pelo colega sciani. E se eu tiver tão somente uma imagem digitalizada (bmp) armazenada no banco. Como faço para transforma-la em vetorial?

[15] Comentário enviado por pcxa em 19/05/2010 - 21:28h

Tem alguma versão do algoritmo de leitura/reconhecimento de impressão digital para microcontroladores de 32 bits, tipo PIC32xxxxxx?

Grato, em tempo, excelente artigo!

[16] Comentário enviado por heepz em 20/04/2011 - 10:47h

Ola!

Após eu dar o comando ./configure, no final deu:


checking for LIBUSB... configure: error: Package requirements ("libusb") were not met:

No package 'libusb' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables LIBUSB_CFLAGS
and LIBUSB_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

Obs: Utilizo Ubuntu 10.10


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts