Tecnologias biometricas sao cada vez mais empregadas em aplicacoes civis. Um exemplo disso e que nas eleicoes deste ano, 21,6 milhoes de brasileiros (15% do total de eleitores do pais) em 762 municipios (entre eles 15 capitais) deverao usar a biometria nas urnas eletronicas, visando reduzir os riscos de erros, fraudes e lentidao.Na India, uma iniciativa pioneira do governo promete criar o maior banco de dados biometricos do mundo. No pais existem mais de meio bilhao de pessoas que nao possuem qualquer especie de identificacao, o que torna impossivel a elas receber auxilios governamentais, abrir conta em banco, solicitar emprestimos, obter carteira de motorista, entre outros. Com a expectativa de cadastrar os dados biometricos de mais de um milhao de pessoas ao dia, o projeto espera ter ate o final do ano os registros dos 1,2 bilhao de indianos em seu banco de dados.Diante disso, ao vasculhar sobre o tema, descobri que os codigos fontes de rotinas biometricas FBI/NIST sao publicos. Tais rotinas sao o coracao dos sistemas AFIS (Automatic Fingerprint Identification System), e dentre elas duas se destacam: o extrator de caracteristicas (feature extractor) e o comparador de minucias (matcher).Estudando esse codigo do NIST, em linguagem C, resolvi criar o suporte a tais funcionalidades de forma nativa no meu SGBD preferido, o PostgreSQL. E assim nasceu o pgAFIS (Automated Fingerprint Identification System support for PostgreSQL), um modulo capaz de fornecer funcionalidades de extracao de caracteristicas e comparacao de minucias a partir de instrucoes SQL dentro do PostgreSQL.Mas como funciona isso na pratica?Bem, comecemos pela modelagem de dados. E preciso criar uma tabela em que sejam armazenadas as informacoes das impressoes digitais, tal como descrito a seguir:Table "public.fingerprints" Column | Type | Modifiers --------+--------------+----------- id | character(5) | not null pgm | bytea | wsq | bytea | mdt | bytea | xyt | text | Indexes: "fingerprints_pkey" PRIMARY KEY, btree (id)"pgm" guarda imagens originais das impressoes digitais (PGM)"wsq" guarda imagens comprimidas das impressoes digitais (WSQ)"mdt" guarda os templates das digitais do tipo XYTQ em formato binario (MDT)"xyt" guarda os dados das minucias das digitais em formato textualO tipo de dados usado nessas colunas e o "bytea" (um array de bytes), similar ao BLOB em outros SGBDs. Os formatos PGM e WSQ sao abertos e muito conhecidos no mercado. Ja o formato MDT eu que inventei. :DEm seguida, as impressoes digitais devem ser obtidas em formato cru (raw) e armazenadas na coluna "pgm" dessa tabela. O formato PGM e uma especie de bitmap (mapa de bits), onde nao existe compressao. Os leitores de impressao digital gravam arquivos obtidos com esse formato.Agora e que o pgAFIS entra em cena! Uma funcao e capaz de converter os dados binarios de um conteudo PGM no formato WSQ (uma especie de JPEG criado pelo NIST/FBI). Isso e feito com a execucao dessa instrucao SQL:UPDATE fingerprintsSET wsq = cwsq(pgm, 2.25, 300, 300, 8, null);A segunda etapa em que age o pgAFIS e na extracao das caracteristicas locais das impressoes digitais (as minucias) a partir do conteudo WSQ. O resultado sao as informacoes do tipo XYTQ (coordenadas horizontal