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.398 ]

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

STEPMANIA: Transforme seu PC com GNU/LINUX em uma máquina Dance Dance Revolution

Scribus 1.1.6: A opção Linux para Adobe PageMaker, QuarkXPress e InDesing

Leitor de impressão digital Futronic FS80 no Linux

OAK: Câmera Open Source de Visão Computacional com AI

Detectando assalto na multidão com visão computacional

Leitura recomendada

obshutdown, Shutdown Menu para OpenBox

CentOS como terminal server autenticando em Windows Server 2003 Active Directory com montagem automática de compartilhamentos de rede

Stopmotion: Crie animações com objetos inanimados e brinquedos

Diferentes áreas de trabalho com diferentes wallpapers

Instalação do Arch Linux com LVM + Luks

  
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