
Uso del SDK grFinger de Griaule
#1
Escrito 12 agosto 2009 - 05:27
Hace tiempo que me perdí, pero he regresado a dar vida al foro... eso si, con preguntas xD
Resulta que me compré un lector de huellas dactilares, el microsoft fingerprint reader, leyendo llegué a la conclusión de que el mejor SDK es el de griaule, el grFinger, lo he bajado, instalado, etc
Este tiene un ActiveX que hay que instalar como componente, lo hice a duras penas con ayudas y todo (como siempre)
Bueno, he probado su ejemplo que viene en su página web, un ejemplo para delphi6 pero que compiló sin problemas con el delphi 2009 que uso.
Ahora tengo la idea de hacer mis primeras pruebas, supongo que será lo más sencillo del mundo, lo básico, poder reconocer una huella a que persona corresponde, ahí estoy trancado, no sé por donde empezar, mirando la doc no pillo como hacerlo, como es algo nuevo para mi esto se me hace complicado, como cualquier cosa nueva para uno.
El problema es que no se que datos capturar del lector, la imágen, genera algun hash de acuerdo a la imágen o huella? Si es así cual me serviría para comparar ?
Cómo obtengo ambas cosas o si tiene mas cosas igual.. cómo obtenerlas, una ves hecho esto guardaré en un DB ese "algo" capturado, si es un hash (string) tengo que compararlo con el de la DB previamente guardado ? O esto lo hace el SDK ?
Aquí yo creo que lo usaron algunas personas y me gustaría saber como funciona y que mejor un pequeño ejemplo de como hacerlo.
He visto igual el componente GHFingReader7 de un compañero del foro, pero que está para delphi6 y además creo que usa otra DB a la que yo quiero usar, MySQL, entre otras cosas que no logro entender.
Espero me puedan ayudar a resolver este problema, desde ya muchas gracias y espero dar un paso más allá y continuar con mi pequeña aplicación.
Saludos!
#2
Escrito 12 agosto 2009 - 05:39

Saludos.
#3
Escrito 13 agosto 2009 - 04:00
Pues claro, puedes tomarte todo el tiempo que necesites

que aún sigo sin poder avanzar en esto y te pone medio mal no saber algo que debe ser muy fácil una ves aprendido.
Toca seguir esperando, muchas gracias
Saludos!
#4
Escrito 13 agosto 2009 - 05:15

Saludos.
#5
Escrito 14 agosto 2009 - 08:23
Pues no sé, yo a tu dicho, cuando quieras puedes empezar tu, que yo ya he puesto mi duda en el primer post y sigo con la misma

Saludos!
PD he puesto en la conf de mi perfil que me llegue mail avisando que tengo nueva respuesta y no me ha llegado en ninguna de las anteriores.

#6
Escrito 14 agosto 2009 - 08:40
Pues bien volviendo a tus dudas del primer post, con el componente GHFingerReader7, se hace todo el trabajo y es muy sencillo de usar y es compatible con Delphi 7, le puedes configurar con cualquiera BD que quieras, yo usé Firebird (pero puedes usar Access, SQL, MySQL, Interbase, etc etc), las huellas se graban en un campo memo en forma de Hash (una imagen en un campo blob o memo), cuando se verifica hace la comparación con la imagen capturada y la imagen guardada en la base, si hay una similitud de más del 70% pues nos indica que es correcto la comparación.
Ahora mismo estoy en el office y no me traje la aplicación por lo que no te he podido presentar un ejemplo.
Saludos.
#7
Escrito 14 agosto 2009 - 12:25
#8
Escrito 14 agosto 2009 - 12:31
Hola a todos, que modelo de lector de huellas estan utilizando? y estas librerias para integrarlos con el sistema las venden???
Yo utilizo los lectores U.Are.U 4000B de DigitalPersona y MagicTrax de Hit Corporation que vienen siendo lo mismo, cada uno trae su propio SDK pero es más engorroso, con el grFinger y el componente GHFingerReader7 tienes la mayor parte del trabajo hecho

Saludos.
#9
Escrito 14 agosto 2009 - 02:30
Hola a todos, que modelo de lector de huellas estan utilizando? y estas librerias para integrarlos con el sistema las venden???
Hola
Hace tiempo que me perdí, pero he regresado a dar vida al foro... eso si, con preguntas xD
Resulta que me compré un lector de huellas dactilares, el microsoft fingerprint reader, leyendo llegué a la conclusión de que el mejor SDK es el de griaule, el grFinger..........
Eso, si te referías a mí con la pregunta

Y si, son de pago esas librerías y el SDK y todo xD
Ahora con respecto a mi duda, te comenté que he visto igual el componente ese, pero es para delphi 7 y yo tengo delphi 2009, y hasta ahora no he podido instalar un componente desde un simple .pas
Lo que yo quiero hacer es usando el SDK este, bastante tengo con hacer este puente entre mi dispositivo y mi app, y no quisiera meter uno mas, que si hay un error no sabré por donde tocar.
Bueno como bien dice el post, saber cómo funciona el SDK y algún ejemplo de su uso, seguiré mirando el ejemplo que viene para delphi 6
Espero el ejemplo para mysql y ver como lo haces, por cierto, si uso librerías para mysql como MyDAC tendría que cambiar mucho ? o es que lo haces usando ADO (si es que a lo que me refiero se llama así xD)
Saludos

#10
Escrito 14 agosto 2009 - 04:10
Saludos.
#11
Escrito 15 agosto 2009 - 06:59
Pues ya ves, estoy usando MyDac para las conexión a la DB, pero igual he usado Zeos, osea que no me costará mucho trabajo pasarlo para usar mi componente, desde ya muchas gracias
Saludos!
#12
Escrito 18 agosto 2009 - 03:06
#13
Escrito 18 agosto 2009 - 03:21
Perdon por insistir, pero me gustaria informacion de las SDK, y los componentes de Delphi que menciona enecumene, alguien conoce la pagina de donde lo pueda descargar y ver los precios?
Hola
este es el SDK que estamos usando para interactuar con el lector de hellas dactilares, como podrás ver soporta varias marcas:
http://www.griaulebi...fingerprint_sdk
y el componente que nombre el compañero es Zeos DB, para conectarse a varios motores sin usar ADO, son libres y muy buenos, los recomiendo

http://sourceforge.n...ojects/zeoslib/
bueno, yo sigo esperando el ejemplo con mysql, que aún sigo peleando con esto pero ya lo voy a sacar

Saludos!
#14
Escrito 18 agosto 2009 - 06:14
Bueno, creo que mi problema era que no me quería enfrentar a algo que no conocía, pero metiendo mano ayer y ahora he logrado modificar el código que viene un demo en delphi usando este SDK para uasrlo con MySQL ya que viene para acces usando ADO, he usando componentes comerciales, pero tranquilamente se puede modificar para usarlo con los ZeosLib que igual son buenos, será cambiar unas 4 palabras nada mas, el nombre de la clase en si

Aquí pongo mi código que es el mismo del demo pero modificado por mi, he dejado comentado como era antes la cosa, espero no haber dejado pasar algo y tenga problemas después, he probado y funciona como antes, a los más entendidos en el tema espero me puedan corregir posibles errores.
A continuación pongo el código funcional para alguno mas que tenga este problema ya que en la red no he encontrado nada usando delphi y mysql.
unit uDBClass; interface uses DB, DBAccess, Uni, MySQLUniProvider, ADODB, classes, SysUtils, GrFingerXLib_TLB, ActiveX; const // the database we'll be connecting to DBFile = 'DB\GrFingerSample.mdb'; ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DBFile; type // Class TTemplate // Define a type to temporary storage of template TTemplate = class public // Template data. tpt: PSafeArray; // Template size size: Integer; // Template ID (if retrieved from DB) id: Integer; // Allocates space to template constructor Create; // clean-up destructor Destroy; override; end; TDBClass = class private // a data set to mantain all templates of database dsTemplates: TUniQuery; query: TUniQuery; //dsTemplates: TADODataSet; // the connection object connection: TUniConnection; // Template object used to get a template from database. tptBlob: TTemplate; public function openDB(): boolean; procedure closeDB(); procedure clearDB(); function addTemplate(template: TTemplate): Integer; procedure getTemplates(); function getTemplate(id: Integer) : TTemplate; function getNextTemplate(): TTemplate; end; implementation // Default constructor constructor TTemplate.Create(); var Bounds: array[0..0] of TSafeArrayBound; begin // Allocate memory for template and initialize its size to 0 Bounds[0].lLbound := 0; Bounds[0].cElements := GR_MAX_SIZE_TEMPLATE; tpt := SafeArrayCreate(VT_UI1, 1, Bounds); size := 0; end; // Default destructor destructor TTemplate.Destroy(); begin // free resources FreeMemory(tpt); end; // Open connection function TDBClass.openDB(): boolean; begin try dsTemplates := TUniQuery.Create(nil); tptBlob := TTemplate.Create(); connection := TUniConnection.Create(nil); with connection do begin LoginPrompt := false; Database := 'biocontrol'; Password := 'j0rg3'; Port := 3306; ProviderName := 'MySQL'; Server := 'localhost'; Username := 'root'; Connected := True; end; dsTemplates.Connection := connection; //connection := TADOConnection.Create(nil); //connection.ConnectionString := ConnectionString; //connection.Open(); Result := true; except Result := false; end; end; // Close conection procedure TDBClass.closeDB(); begin dsTemplates.Close(); dsTemplates.Free(); tptBlob.Free(); connection.Close(); connection.Free(); connection := nil; end; // Clear the database procedure TDBClass.clearDB(); begin // run "clear" query query := TUniQuery.Create(nil); query.Connection := connection; query.SQL.Clear; query.SQL.Append('DELETE FROM enroll'); query.Execute; query.Close; query.Free; //connection.Execute('DELETE FROM enroll'); end; // Add template to database. Returns added template ID. function TDBClass.addTemplate(template: TTemplate): Integer; var //rs: TADODataSet; sql: TUniQuery; tptStream: TMemoryStream; id: Integer; p: PChar; begin sql := TUniQuery.Create(nil); sql.Connection := connection; sql.SQL.Append('INSERT INTO enroll (nombre, template) VALUES (:nom, :tem)'); sql.ParamByName('nom').AsString := 'Jorge'; // get DB data and append one row //rs := TDataSet.Create(nil); //rs.Connection := connection; //rs.CursorType := ctStatic; //rs.LockType := ltOptimistic; //rs.CommandText := 'SELECT * FROM enroll'; //rs.Open(); //rs.Append(); tptStream := TMemoryStream.Create(); // write template data to memory stream. SafeArrayAccessData(template.tpt, Pointer(p)); tptStream.write(p^, template.size); SafeArrayUnaccessData(template.tpt); // save template data from memory stream to database. sql.ParamByName('tem').LoadFromStream(tptStream, ftBlob); //(rs.FieldByName('template') as TBlobField).LoadFromStream(tptStream); // update the database with added template. sql.Execute; //rs.post(); // get the ID of enrolled template. sql.SQL.Clear; sql.SQL.Append('SELECT MAX(id) AS lastID FROM enroll'); //sql.SQL.Append('SELECT LAST(id) AS lastID FROM enroll'); sql.Open; id := sql.FieldByName('lastID').AsInteger; //id := rs.FieldByName('ID').AsInteger; // close connection tptStream.Free(); sql.Close; sql.Free; //rs.Close(); //rs.Free(); addTemplate := id; end; // Start fetching all enrolled templates from database. procedure TDBClass.getTemplates(); begin dsTemplates.Close; dsTemplates.SQL.Clear; dsTemplates.SQL.Append('SELECT * FROM enroll'); dsTemplates.Open; { dsTemplates.Close(); dsTemplates.CacheSize := 15000; dsTemplates.CursorLocation := clUseClient; dsTemplates.CursorType := ctOpenForwardOnly; dsTemplates.LockType := ltReadOnly; dsTemplates.Connection := connection; dsTemplates.CommandText := 'SELECT * FROM enroll'; dsTemplates.Open(); dsTemplates.BlockReadSize := 15000; } end; // Returns template with supplied ID. function TDBClass.getTemplate(id: Integer): TTemplate; Var template: TTemplate; begin dsTemplates.Close; dsTemplates.SQL.Clear; dsTemplates.SQL.Append('SELECT * FROM enroll WHERE ID = ' + IntToStr(id)); dsTemplates.Open; template := getNextTemplate(); Result := template; {dsTemplates.Close(); dsTemplates.Connection := connection; dsTemplates.CursorType := ctDynamic; dsTemplates.LockType := ltReadOnly; dsTemplates.CommandText := 'SELECT * FROM enroll WHERE ID = ' + IntToStr(id); // Get query response dsTemplates.Open(); // Deserialize template and return it template := getNextTemplate(); dsTemplates.Close(); getTemplate := template; } end; // Return next template from dataset function TDBClass.getNextTemplate(): TTemplate; Var tmp: String; p: PChar; begin // No results? if dsTemplates.Eof then begin tptBlob.size := -1; getNextTemplate := tptBlob; end else begin // Get template ID from database tptBlob.id := dsTemplates.FieldByName('id').AsInteger; // Get template data from database as string. tmp := dsTemplates.FieldByName('template').AsString; // Get template size from database. tptBlob.size := length(tmp); // Move template data from temporary string // to template object. SafeArrayAccessData(tptBlob.tpt, Pointer(p)); Move(PChar(tmp)^, p^, tptBlob.size); SafeArrayUnaccessData(tptBlob.tpt); // move foward in the list of templates dsTemplates.Next(); getNextTemplate := tptBlob; end; end; end.
Adiós
#15
Escrito 18 agosto 2009 - 06:45

Saludos.
#16
Escrito 18 agosto 2009 - 07:12
Salud OS
#17
Escrito 18 agosto 2009 - 07:41
Bueno, pero de que manera estabas haciéndolo ?
puede que la tuya sea mejor o más fácil, me gustaría saber alguna otra forma
adios
#18
Escrito 18 agosto 2009 - 07:45
Que bien, muchas gracias por el code amigo BlackDaemon, parece que saldrá algo muy interesante de esto.
Salud OS
De nada, para eso está el foro.
Y bueno, primero voy a hacer una aplicación para autenticar usuarios y cuando tenga algo hecho pondré aquí el código para que a más de uno se pueda servir, que al menos yo aprendo mucho mirando código ajeno.
adiós
#19
Escrito 18 agosto 2009 - 08:22
Hola
Bueno, pero de que manera estabas haciéndolo ?
puede que la tuya sea mejor o más fácil, me gustaría saber alguna otra forma
adios
Intentaba hacerlo fuera del ejemplo, ya que limita mucho a la hora de utilizar los componentes, ya que todo lo crea en memoria y luego se destruye. Pero bueno, por lo que veo me tomará más tiempo hacerlo a mi manera, más fácil y más entendible.
Saludos
#20
Escrito 18 agosto 2009 - 08:59
Hola
Bueno, pero de que manera estabas haciéndolo ?
puede que la tuya sea mejor o más fácil, me gustaría saber alguna otra forma
adios
Bueno, pero no hay apuro, yo seguiré esperando tu ejemplo hehe.
Eso lo de destruir es verdad, pero se podría modificar para que no pase esto, solo en la comparación de huellas o no sé, soy nuevo en esto.
Saludos!
Intentaba hacerlo fuera del ejemplo, ya que limita mucho a la hora de utilizar los componentes, ya que todo lo crea en memoria y luego se destruye. Pero bueno, por lo que veo me tomará más tiempo hacerlo a mi manera, más fácil y más entendible.
Saludos