Página 1 de 3

Leitor Fingerprint

Enviado: 31 Jan 2008 18:28
por rossine
Olá pessoal,

Alguém tem um exemplo de como capturar os dados desta leitora ? Uso fwh + xhb.

Obrigado,

Enviado: 31 Jan 2008 20:33
por rochinha
Amiguinho

Tempos atras eu comecei a brincar com o SDK dela, mas como não tinha a periférico para testar nem continuei.

Agora descolei um APC BioPod, mas o SDK só é enviado pelo fabricante mediante o envio de um email com dados da nota fiscal de compra e CNPJ.

Por falta de tempo não fiz isto.

Este FingerPrint não é por acaso M$ Fingerprint né? pois se for, voce terá uma dor de cabeça para descolar algum SDK pra ele ja que a M$ colocou o suporte em seus Windows para usar com ele e não disponibiliza de forma fácil qualquer documentação ou SDK.

Talvez a idéia seja voce instalar o software de login do mesmo, chama-lo a partir de seu aplicativo, abrir a base de dados, via OLE/ADO, provavelmente esta base de dados seja MDB criticar as informações e liberar o acesso.

Enviado: 31 Jan 2008 21:52
por Maligno
O ideal seria o uso de SDKs como da Griaule. Eu estava querendo usar um leitor desses num programa que estou fazendo em TC++, como uma opção a mais. No que pese o fato do leitor da MS não ser seguro (nem foi feito pra ser), pensei em comprar. Mas sem ter um bom SDK, não vale a pena dispor de tempo pra isso.

Enviado: 31 Jan 2008 22:03
por rochinha
Amiguinhos

Acabei de passar pelo site Griaule e la indica que o Fingerprint realmente é suportado por seu SDK mas logicamente ele não é gratuito.

Mas é um inicio:

Vejam: http://www.griaule.com/page/en-us/fingerprint_sdk

Enviado: 31 Jan 2008 22:09
por Maligno
Uai! Mas foi o link que eu passei. :)

Aliás, eles também tem a mesma página em português brasileiro (é só ver lá). Inclusive, um detalhe interessante: o centro técnico deles é no Brasil.

Enviado: 31 Jan 2008 22:29
por Maligno
Uma curiosidade: dei risada quando vi um artigo sobre um pessoal nos EUA que afirma que 90% dos leitores biométricos podem ser burlados com massinha de modelar. :)))

Fico imaginando o ladrão "roubando" a impressão digital de uma vítima. :)))))


PS: A digitalização é em 3D. Logo, não vale imprimir a impressão num papel. Essa "técnica" só dá certo em filme. :)

Enviado: 01 Fev 2008 07:56
por toya
Baixem aqui um exemplo disponibilizado pelo nosso colega Giovany Vecchi no Forum Fivewin-Brasil...
http://www.toyanet.com.br/up/grfinger.zip

Enviado: 01 Fev 2008 08:39
por Maligno
Obrigado, Toya. Não vou poder testar, mas vou deixar esse demo guardado. Ainda não comprei nenhum leitor. Só vou comprar quando conseguir o FingerPrint SDK da Griaule. Se você testou, seria legal se pudesse comentar conosco o que achou.

Enviado: 01 Fev 2008 09:27
por rossine
Olá pessoal,
Este FingerPrint não é por acaso M$ Fingerprint ?
o proprio.

Eu estou usando o sdk da griaule (trial). O exemplo do Giovany reconhece o leitor, mas assim que tiro o dedo do leitor, gera um erro de GPF no grfinger.exe.

Vejam este link http://fivetechsoft.com/forums/viewtopi ... ingerprint

Obrigado a todos,

Rossine.

grfingerX

Enviado: 01 Fev 2008 10:33
por rochinha
Amiguinhos

Maligno, não havia consultado seu link pois quando comecei a procurar informações seu post não havia entrado.

Rossine, veja se o codigo abaixo é de alguma ajuda:

Código: Selecionar todos

#include "FiveWin.ch"
#include "Struct.ch"
//#include "adofw.ch"

#DEFINE GR_DEFAULT_CONTEXT 0
#DEFINE GR_NO_CONTEXT  -1

STATIC DBFile, ConnectionString, connection
STATIC Raw, Template, DB
STATIC oActiveX, cMsg, oText, oWnd, cInfo, cEvents, GrFingerXCtrl1
STATIC oFoto, cFoto

FUNCTION Main()
   LOCAL oGet, err, lRet
   cEvents := ""
   cFoto:="..\BITMAPS\cara1.bmp"

   DEFINE DIALOG oWnd RESOURCE "Test"

   //oActiveX = CreateOleObject("GrFingerX.GrFingerXCtrl.1") //Ctrl1")
   //oActiveX := TOleAuto():New( "GrFingerX.GrFingerXCtrl.1" )
   oActiveX := TActiveX():New( oWnd, "GrFingerX.GrFingerXCtrl.1" )

   REDEFINE GET oGet VAR cEvents ID 102 OF oWnd MEMO UPDATE
   REDEFINE BITMAP oFoto ID 103 OF oWnd RESOURCE "Speaker" UPDATE

   oActiveX:bOnEvent = { | event, aParams | cEvents += EventInfo( event, aParams ) }
   ACTIVATE DIALOG oWnd CENTERED ON INIT ( GrFingerInitialize() ) ;
      VALID ( MemoEdit( cEvents ), .t. ) //oActiveX:Do( "GoHome" )
   RETURN NIL

FUNCTION EventInfo( event, aParams )
   //local cMsg := "Event: " + cValToChar( event ) + CRLF
   local n
   cMsg := "Event: " + cValToChar( event ) + CRLF
   cInfo:=""
   cMsg += "Params: " 
   for n = 1 to Len( aParams )
       cMsg += cValToChar( aParams[ n ] ) + CRLF
       cInfo += cValToChar( aParams[ n ] ) + CRLF
   next
   /*
    * -----------------------------------------------------------------------------------
    * GrFingerX events:
    * A fingerprint reader was plugged on system
    * -----------------------------------------------------------------------------------
    */
   IF     event=="SensorPlug" //(ByVal idSensor As String)
          cMsg+="Sensor: " + CSTR(aParams[1]) + ". Event: Plugged."
          IF aParams[2] != NIL .AND. aParams[2] != "File"
             oActiveX:Do("CapStartCapture", aParams[2])
             cMsg += "CapStartCapture "+CSTR(aParams[2])
          ENDIF
   ELSEIF event=="Plugged" //(ByVal idSensor As String)
          cMsg+="Sensor: " + CSTR(aParams[1]) + ". Event: Plugged222."
          //      oActiveX:Do("CapStartCapture", aParams[1])
   ELSEIF event=="SensorUnplug" //(ByVal idSensor As String) //' A fingerprint reader was unplugged from system
          cMsg+="Sensor: " + aParams[2]+". Event: Unplugged."
          oActiveX:Do("CapStopCapture", aParams[1])
   ELSEIF event=="FingerDown"  //(ByVal idSensor As String) //' A finger was placed on reader
          cMsg+="Sensor: " + aParams[2] +". Event: Finger Placed."
   ELSEIF event =="FingerUp" //(ByVal idSensor As String) //' A finger was removed from reader
          cMsg += "Sensor: " + aParams[2] + ". Event: Finger removed."
   ELSEIF event == "ImageAcquired" //(ByVal idSensor As String, ByVal width As Long, ByVal height As Long, rawImage As Variant, ByVal res As Long)
          * An image was acquired from reader
          * Copying aquired image
          cMsg += "Sensor: " + CSTR(aParams[1])+" Width"+CSTR(aParams[2]) + ". Event: Image captured."
          raw:img    = aParams[ 9] //rawImage
          raw:height = aParams[ 8] //height
          raw:width  = aParams[ 7] //width
          raw:res    = aParams[10] //res
          * Signaling that an Image Event occurred.
          /*
          FOR n:=6 TO LEN(aParams)
              Msginfo(aparams[n], VALTYPE(aParams[n]))
          NEXT n
          */
          //    Msginfo(LEN(aparams[9]))
          //    msginfo(CSTR(aParams[2])+"|"+CSTR(aParams[3])+"|"+CSTR(aParams[4])+"|"+CSTR(aParams[5]))
          //    msginfo(CSTR(aParams[1])+"|"+CSTR(aParams[3])+"|"+CSTR(aParams[4])+"|"+CSTR(aParams[5]))
          cMsg += "Sensor: " + CSTR(aParams[2]) + ". Event: Image captured."
          * display fingerprint image
          PrintBiometricDisplay(.F., GR_DEFAULT_CONTEXT)
          /*
              ' now we have a fingerprint, so we can extract template
              formMain.btExtract.Enabled = True
              formMain.btEnroll.Enabled = False
              formMain.btIdentify.Enabled = False
              formMain.btVerify.Enabled = False
              
              ' extracting template from image
              If formMain.ckBoxAutoExtract.Value Then Call formMain.btExtract_Click
              ' identify fingerprint
              If formMain.ckBoxAutoIdentify.Value Then Call formMain.btIdentify_Click
          */
   ENDIF
   oWnd:Update()
   return cMsg + CRLF

/*
' -----------------------------------------------------------------------------------
' Main functions for fingerprint recognition management
' -----------------------------------------------------------------------------------
*/
FUNCTION GrFingerInitialize()
  LOCAL err, lRet:=.F.
  STRUCT raw
         MEMBER img As STRING LEN 2048
         MEMBER width As LONG  // Image width.
         MEMBER height As LONG // Image height.
         MEMBER res As LONG    // Image resolution.
  ENDSTRUCT
  STRUCT Template
         MEMBER tpt AS STRING LEN 1000
         * Template size
         MEMBER Size AS LONG
  ENDSTRUCT
  * Create a new Template
  template:tpt := SPACE(1000)
  * Create a new raw image
  raw:width    := 0
  raw:height   := 0
  * Initializing library
  err = oActiveX:Do("Initialize")
  If err < 0
     lRet:= err
     RETURN NIL
  EndIf
  lRet := oActiveX:Do("CapInitialize")
  RETURN lRet

FUNCTION FinalizeGrFinger()
  * Finalizing libraries
  oActiveX:Do("CapFinalize") //formMain.GrFingerXCtrl1.CapFinalize
  oActiveX:Do("Finalize") //formMain.GrFingerXCtrl1.Finalize
  RETURN NIL

FUNCTION PrintBiometricDisplay(biometricDisplay, context )
  * Display fingerprint image on screen
  LOCAL nRet, Handle
  * handle to finger image
  * Dim handle As IPictureDisp
  */
  msginfo("printbio-1")
  If biometricDisplay
     msginfo("biometricdisplay")
     *' get image with biometric info
     //oActiveX:Do("biometricdisplay", template.tpt, raw.img, raw.width, raw.height, raw.res, formMain.hDC, handle, context)
     //formMain.GrFingerXCtrl1.biometricDisplay template.tpt, raw.img, raw.width, raw.height, raw.res, formMain.hDC, handle, context
  Else
     *' get raw image
     //oActiveX:Do("CapRawImageToHandle", raw:img, raw:width, raw:height, oWnd:hDC, @handle)
     //formMain.GrFingerXCtrl1.CapRawImageToHandle raw.img, raw.width, raw.height, formMain.hDC, handle
     ActXInvoke( ActXPdisp( oActiveX:hActiveX ), "CapRawImageToHandle", raw:img, raw:width, raw:height, oWnd:hDC, @handle)
     msginfo(Handle)
  End If
  *' draw image on picture box
  If !(handle ==NIL)
      oFoto:Picture = handle
      Msginfo()
      oFoto:Update()
  End If
  RETURN NIL  //End Sub

FUNCTION CSTR( string )
  RETURN string

Enviado: 01 Fev 2008 12:26
por rochinha
Amiguinho

Outro exemplo:

Código: Selecionar todos

// Using Microsoft Excel ActiveX

#include "FiveWin.ch"
#include "Struct.ch"

#DEFINE GR_DEFAULT_CONTEXT 0
#DEFINE GR_NO_CONTEXT  -1

STATIC DBFile, ConnectionString, connection
STATIC Raw, Template, DB
STATIC oActiveX, cMsg, oText, oWnd, cInfo, cEvents, GrFingerXCtrl1
STATIC oFoto, cFoto

function Main()

   local oWnd
   public oActiveX, oBitMap, oLbx, aFlds:={ "GRFinger for Fivewin..." }, nItem:=0
   public cFile, MyContextID := "0"

   DEFINE DIALOG oWnd RESOURCE "GRFingerX"

   REDEFINE BITMAP oBitMap ID 100 OF oWnd FILENAME "GRFinger.bmp" //ADJUST
   REDEFINE BUTTON ID 101 OF oWnd ACTION Enroll()
   REDEFINE BUTTON ID 102 OF oWnd ACTION Verify()
   REDEFINE BUTTON ID 103 OF oWnd ACTION Identify()
   REDEFINE BUTTON ID 104 OF oWnd ACTION Extract()
   REDEFINE BUTTON ID 105 OF oWnd ACTION fun()
   REDEFINE BUTTON ID 106 OF oWnd ACTION oBitMap:LoadBMP(cFile:=cGetFile("Gráficos|*.bmp","Selecione um arquivo")); oBitMap:Refresh()
   REDEFINE LISTBOX oLbx VAR nItem ;
                   ITEMS aFlds ;
                   ID 107 OF oWnd
   ACTIVATE DIALOG oWnd CENTERED ON INIT InicializaControle() ;
                        VALID ( oActiveX:Finalize(), oActiveX:DestroyContext( MyContextID ), .T. )

   return nil

FUNCTION InicializaControle() 
   if .not. IsActiveX( "GrFingerX.GrFingerXCtrl.1" )
      oLbx:ADD("GRFingerX Activex nao instalado")
      quit
   endif
   oActiveX := TOLEAUTO():New("GrFingerX.GrFingerXCtrl.1")
   // Inicializa a captura do activex
   oError := oActiveX:Initialize()
   if oError <> 0
      oLbx:ADD( "Erro de Inicializacao "+str(oError,3) )
   endif
   // Inicializa a captura do activex
   oError := oActiveX:CapInitialize()
   if oError <> 0
      oLbx:ADD( "Erro de Captura "+str(oError,3) )
   endif
   // Cria contexto para o activex
   oError := oActiveX:CreateContext( MyContextID )
   if oError <> 0
      oLbx:ADD( "Erro de Criacao do Contexto "+str(oError,3) )
   endif
   oError := oActiveX:CapLoadImageFromFile( "GRFingerX.bmp", 300 )
   if oError <> 0
      oLbx:ADD( "Erro de Carregamento de Imagem "+str(oError,3) )
   endif
   return nil

FUNCTION GrFingerFinalize(oActiveX)
  oActiveX:Do( "CapFinalize" )
  oActiveX:Do( "Finalize" )
  RETURN NIL

FUNCTION GrFingerBiometricDisplay( template, RawImg, RawWidth, RawHeight, RawRes, hDC, handle, context )
  oActiveX:Do( "biometricdisplay", template, RawImg, RawWidth, RawHeight, RawRes, hDC, handle, context )

  msginfo("printbio-1")
  If biometricDisplay
     msginfo("biometricdisplay")
     *' get image with biometric info
     //oActiveX:Do("biometricdisplay", template.tpt, raw.img, raw.width, raw.height, raw.res, formMain.hDC, handle, context)
     //formMain.GrFingerXCtrl1.biometricDisplay template.tpt, raw.img, raw.width, raw.height, raw.res, formMain.hDC, handle, context
  Else
     *' get raw image
     //oActiveX:Do("CapRawImageToHandle", raw:img, raw:width, raw:height, oWnd:hDC, @handle)
     //formMain.GrFingerXCtrl1.CapRawImageToHandle raw.img, raw.width, raw.height, formMain.hDC, handle
     ActXInvoke( ActXPdisp( oActiveX:hActiveX ), "CapRawImageToHandle", raw:img, raw:width, raw:height, oWnd:hDC, @handle)
     msginfo(Handle)
  End If
  *' draw image on picture box
  If !(handle ==NIL)
      oFoto:Picture = handle
      Msginfo()
      oFoto:Update()
  End If
  RETURN NIL  //End Sub

FUNCTION GrFingerDestroyContext( MyContextID ) 
  lRet := oActiveX:Do( "DestroyContext", MyContextID )
  RETURN lRet

FUNCTION CSTR( string )
  RETURN string

FUNCTION Enroll()
  RETURN .t.

FUNCTION Verify()
  RETURN .t.

FUNCTION Identify()
  RETURN .t.

FUNCTION Extract()
  LOCAL err, lRet:=.F.
  STRUCT raw
         MEMBER img    As STRING LEN 2048
         MEMBER width  As LONG // Image width.
         MEMBER height As LONG // Image height.
         MEMBER res    As LONG // Image resolution.
  ENDSTRUCT
  STRUCT Template
         MEMBER tpt    AS STRING LEN 1000
         MEMBER Size   AS LONG
  ENDSTRUCT
  template:tpt := SPACE(1000)
  template:size:= 500
  raw:img      := oBitMap:hBitmap
  raw:width    := oBitMap:nWidth
  raw:height   := oBitMap:nHeight
  oError := oActiveX:Extract( raw:img, raw:Width, raw:Height, 500, template:tpt, template:size, MyContextID )
  if oError < 0
     oLbx:ADD( "Erro de Extracao "+str(oError,3) )
  endIf
  RETURN .t.

FUNCTION fun()
  RETURN .t.
E fazendo alterações e dando certo por favor POSTe para nóis.

Enviado: 01 Fev 2008 14:08
por rossine
Olá Rochinha,

Está faltando o RC, hehehe

Abs,

Rossine.

Enviado: 01 Fev 2008 14:23
por rossine
Fiz o rc aqui :)

T+

Enviado: 09 Fev 2008 22:31
por Maligno
toya escreveu:Baixem aqui um exemplo disponibilizado pelo nosso colega Giovany Vecchi no Forum Fivewin-Brasil...
http://www.toyanet.com.br/up/grfinger.zip
Comprei o FingerPrint Reader da MS. Baixei, instalei e executei este programa exemplo, mas não deu certo. Desinstalei tudo da MS e reinstalei o Griaule e nada. O programa não reconhece o leitor. Alguma dica?

Aliás, alguém conhece algum outro SDK "multimarcas" fora o Griaule e o Verifinger?

Enviado: 09 Fev 2008 23:30
por alaminojunior
PS: A digitalização é em 3D. Logo, não vale imprimir a impressão num papel. Essa "técnica" só dá certo em filme. :)
E se arrancar o dedo do caboclo ? ´o)