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.
Parte 2: 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
$ cd libdpfp-0.2.1/
$ ./configure
$ make
$ cd examples $ ls
# ./capture_finger
# rmmod dpfp
Agora execute o programa capture_finger novamente:
# ./capture_finger
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.cConecte 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çã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_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 offSe 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.pgmVeja as imagens geradas como resultado:

Páginas do artigo
1. Introdução2. 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
Conceito: Evitando acidentes com visão computacional
Xmorph: Efeitos de transformação de fotos com software livre
Transmitindo vídeo de eventos ao vivo via Internet com GNU/Linux
Leitura recomendada
Downloader for X - Um pequeno manual
Software Livre e Matemática Financeira
Compilação, empacotamento, instalação e configuração do WINE-dev
Comentários
Pô Cabelo, show este artigo!!!
Sempre procurei saber qual era o algoritmo usado nestes calculos, parabéns... e o reconhecimento facial é a mesma coisa ?
Sempre procurei saber qual era o algoritmo usado nestes calculos, parabéns... e o reconhecimento facial é a mesma coisa ?
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':
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':
Impressionante como este cara é bom!!!!!
Abraço
Abraço
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]#
[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]#
Cara... Ficou excelente o artigo viu!!! Parabéns amigo!!!
Abração!
Abração!
Mais uma vez o grande Alexandre nos brinda com um artigo fascinante e objetivo sobre biometria.
Parabéns novamente!
Parabéns novamente!
caraca esse cara e um extraterrestre, artigo espetacular valeu ai Kbelo..
vc e o cara ....
vc e o cara ....
Kra fantastico o artigo
agora qual hardware vc aconselharia comprar para fazer os testes ?
agora qual hardware vc aconselharia comprar para fazer os testes ?
Muito loko véio, esse campo tá crescendo cada vez mais, na empresa que trabalho o relogio de ponto com biometria. Parabens pelo artigo.
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
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
Muito intereçante este post num futuro muito possimo as autenticação serão assim
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
abraços
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?
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!
Grato, em tempo, excelente artigo!
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
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
Tava quebrando a cuca aqui pra viabilizar isso, seu artigo caiu do céu!
[]'s meu amigo!