Ir al contenido


Foto

Uso del SDK grFinger de Griaule


  • Por favor identifícate para responder
27 respuestas en este tema

#1 BlackDaemon

BlackDaemon

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 12 agosto 2009 - 05:27

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, 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!
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 12 agosto 2009 - 05:39

Hola Black, hace un tiempo usé ese SDK con un lector U.are.U Personna 4000B y me fue genial, muy sencillo usando ese componente que mencionas, ahora mismo no recuerdo como trabaja, si me das un tiempecito para buscar esa apliación que hice para poder ayudarte ;).

Saludos.
  • 0

#3 BlackDaemon

BlackDaemon

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 13 agosto 2009 - 04:00

Hola

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!
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 13 agosto 2009 - 05:15

Vale amigo BlackDaemon, ya tengo mi aplicación, cuando quieras podemos empezar, con gusto te ayudo ;).

Saludos.
  • 0

#5 BlackDaemon

BlackDaemon

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 14 agosto 2009 - 08:23

Hola

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. :(
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 14 agosto 2009 - 08:40

Porque creaste el tema antes de configurar esa opción, si quieres que te lleguen al mail las respuestas de éste Tema, sólo ve al final de la página y presionas el botón Notificar, con eso se resuelve.

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.
  • 0

#7 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 14 agosto 2009 - 12:25

Hola a todos, que modelo de lector de huellas estan utilizando? y estas librerias para integrarlos con el sistema las venden???
  • 0

#8 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

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.
  • 0

#9 BlackDaemon

BlackDaemon

    Member

  • Miembros
  • PipPip
  • 22 mensajes

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 ;)


  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 14 agosto 2009 - 04:10

Para MySQL utilizo ZEOS porque se conecta directo a la BD, con ADO tendrí­a que usar ODBC y se torna lento en un momento determinado. No sabí­a que estabas usando D2009, veré si te hago un ejemplo usando el SDK de grFinger.

Saludos.
  • 0

#11 BlackDaemon

BlackDaemon

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 15 agosto 2009 - 06:59

Hola

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!
  • 0

#12 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 18 agosto 2009 - 03:06

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?
  • 0

#13 BlackDaemon

BlackDaemon

    Member

  • Miembros
  • PipPip
  • 22 mensajes

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!
  • 0

#14 BlackDaemon

BlackDaemon

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 18 agosto 2009 - 06:14

Hola

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.


delphi
  1. unit uDBClass;
  2.  
  3. interface
  4.  
  5. uses
  6.   DB, DBAccess, Uni, MySQLUniProvider,
  7.   ADODB, classes, SysUtils, GrFingerXLib_TLB, ActiveX;
  8.  
  9. const
  10.   // the database we'll be connecting to
  11.   DBFile = 'DB\GrFingerSample.mdb';
  12.   ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + DBFile;
  13.  
  14. type
  15.   // Class TTemplate
  16.   // Define a type to temporary storage of template
  17.   TTemplate = class
  18.     public
  19.       // Template data.
  20.       tpt:        PSafeArray;
  21.       // Template size
  22.       size:      Integer;
  23.       // Template ID (if retrieved from DB)
  24.       id:        Integer;
  25.  
  26.       // Allocates space to template
  27.       constructor Create;
  28.       // clean-up
  29.       destructor Destroy; override;
  30.   end;
  31.  
  32.   TDBClass = class
  33.   private
  34.     // a data set to mantain all templates of database
  35.     dsTemplates: TUniQuery;
  36.     query: TUniQuery;
  37.     //dsTemplates: TADODataSet;
  38.     // the connection object
  39.     connection: TUniConnection;
  40.     // Template object used to get a template from database.
  41.     tptBlob: TTemplate;
  42.   public
  43.     function openDB(): boolean;
  44.     procedure closeDB();
  45.     procedure clearDB();
  46.     function addTemplate(template: TTemplate): Integer;
  47.     procedure getTemplates();
  48.     function getTemplate(id: Integer) : TTemplate;
  49.     function getNextTemplate(): TTemplate;
  50.  
  51.   end;
  52.  
  53. implementation
  54.  
  55. // Default constructor
  56. constructor TTemplate.Create();
  57. var
  58.   Bounds: array[0..0] of TSafeArrayBound;
  59. begin
  60.   // Allocate memory for template and initialize its size to 0
  61.   Bounds[0].lLbound := 0;
  62.   Bounds[0].cElements := GR_MAX_SIZE_TEMPLATE;
  63.   tpt := SafeArrayCreate(VT_UI1, 1, Bounds);
  64.   size := 0;
  65. end;
  66.  
  67. // Default destructor
  68. destructor TTemplate.Destroy();
  69. begin
  70.   // free resources
  71.   FreeMemory(tpt);
  72. end;
  73.  
  74. // Open connection
  75. function TDBClass.openDB(): boolean;
  76. begin
  77.   try
  78.   dsTemplates := TUniQuery.Create(nil);
  79.   tptBlob := TTemplate.Create();
  80.  
  81.   connection := TUniConnection.Create(nil);
  82.  
  83.   with connection do
  84.   begin
  85.     LoginPrompt := false;
  86.     Database := 'biocontrol';
  87.     Password := 'j0rg3';
  88.     Port := 3306;
  89.     ProviderName := 'MySQL';
  90.     Server := 'localhost';
  91.     Username := 'root';
  92.     Connected := True;
  93.   end;
  94.  
  95.   dsTemplates.Connection := connection;
  96.     //connection := TADOConnection.Create(nil);
  97.     //connection.ConnectionString := ConnectionString;
  98.     //connection.Open();
  99.     Result := true;
  100.   except
  101.     Result := false;
  102.   end;
  103. end;
  104.  
  105. // Close conection
  106. procedure TDBClass.closeDB();
  107. begin
  108.  
  109.   dsTemplates.Close();
  110.   dsTemplates.Free();
  111.  
  112.   tptBlob.Free();
  113.   connection.Close();
  114.   connection.Free();
  115.   connection := nil;
  116. end;
  117.  
  118. // Clear the database
  119. procedure TDBClass.clearDB();
  120. begin
  121.   // run "clear" query
  122.   query := TUniQuery.Create(nil);
  123.   query.Connection := connection;
  124.   query.SQL.Clear;
  125.   query.SQL.Append('DELETE FROM enroll');
  126.   query.Execute;
  127.   query.Close;
  128.   query.Free;
  129.   //connection.Execute('DELETE FROM enroll');
  130. end;
  131.  
  132. // Add template to database. Returns added template ID.
  133. function TDBClass.addTemplate(template: TTemplate): Integer;
  134. var
  135.   //rs: TADODataSet;
  136.   sql: TUniQuery;
  137.   tptStream: TMemoryStream;
  138.   id: Integer;
  139.   p: PChar;
  140. begin
  141.   sql := TUniQuery.Create(nil);
  142.   sql.Connection := connection;
  143.   sql.SQL.Append('INSERT INTO enroll (nombre, template) VALUES (:nom, :tem)');
  144.   sql.ParamByName('nom').AsString := 'Jorge';
  145.  
  146.   // get DB data and append one row
  147.   //rs := TDataSet.Create(nil);
  148.   //rs.Connection := connection;
  149.   //rs.CursorType := ctStatic;
  150.   //rs.LockType := ltOptimistic;
  151.   //rs.CommandText := 'SELECT * FROM enroll';
  152.   //rs.Open();
  153.   //rs.Append();
  154.   tptStream := TMemoryStream.Create();
  155.   // write template data to memory stream.
  156.   SafeArrayAccessData(template.tpt, Pointer(p));
  157.   tptStream.write(p^, template.size);
  158.   SafeArrayUnaccessData(template.tpt);
  159.   // save template data from memory stream to database.
  160.   sql.ParamByName('tem').LoadFromStream(tptStream, ftBlob);
  161.   //(rs.FieldByName('template') as  TBlobField).LoadFromStream(tptStream);
  162.  
  163.   // update the database with added template.
  164.   sql.Execute;
  165.   //rs.post();
  166.  
  167.   // get the ID of enrolled template.
  168.   sql.SQL.Clear;
  169.   sql.SQL.Append('SELECT MAX(id) AS lastID FROM enroll');
  170.   //sql.SQL.Append('SELECT LAST(id) AS lastID FROM enroll');
  171.   sql.Open;
  172.   id := sql.FieldByName('lastID').AsInteger;
  173.   //id := rs.FieldByName('ID').AsInteger;
  174.   // close connection
  175.   tptStream.Free();
  176.   sql.Close;
  177.   sql.Free;
  178.   //rs.Close();
  179.   //rs.Free();
  180.   addTemplate := id;
  181. end;
  182.  
  183. // Start fetching all enrolled templates from database.
  184. procedure TDBClass.getTemplates();
  185. begin
  186.   dsTemplates.Close;
  187.   dsTemplates.SQL.Clear;
  188.   dsTemplates.SQL.Append('SELECT * FROM enroll');
  189.   dsTemplates.Open;
  190. {
  191.   dsTemplates.Close();
  192.   dsTemplates.CacheSize := 15000;
  193.   dsTemplates.CursorLocation := clUseClient;
  194.   dsTemplates.CursorType := ctOpenForwardOnly;
  195.   dsTemplates.LockType := ltReadOnly;
  196.   dsTemplates.Connection := connection;
  197.   dsTemplates.CommandText := 'SELECT * FROM enroll';
  198.   dsTemplates.Open();
  199.   dsTemplates.BlockReadSize := 15000;  }
  200. end;
  201.  
  202. // Returns template with supplied ID.
  203. function TDBClass.getTemplate(id: Integer): TTemplate;
  204. Var
  205.   template: TTemplate;
  206. begin
  207.   dsTemplates.Close;
  208.   dsTemplates.SQL.Clear;
  209.   dsTemplates.SQL.Append('SELECT * FROM enroll WHERE ID = ' + IntToStr(id));
  210.   dsTemplates.Open;
  211.   template := getNextTemplate();
  212.   Result := template;
  213.   {dsTemplates.Close();
  214.   dsTemplates.Connection := connection;
  215.   dsTemplates.CursorType := ctDynamic;
  216.   dsTemplates.LockType := ltReadOnly;
  217.   dsTemplates.CommandText := 'SELECT * FROM enroll WHERE ID = ' + IntToStr(id);
  218.   // Get query response
  219.   dsTemplates.Open();
  220.   // Deserialize template and return it
  221.   template := getNextTemplate();
  222.   dsTemplates.Close();
  223.   getTemplate := template;                }
  224. end;
  225.  
  226. // Return next template from dataset
  227. function TDBClass.getNextTemplate(): TTemplate;
  228. Var
  229.   tmp: String;
  230.   p: PChar;
  231. begin
  232.   // No results?
  233.   if dsTemplates.Eof then
  234.   begin
  235.     tptBlob.size := -1;
  236.     getNextTemplate := tptBlob;
  237.   end else
  238.   begin
  239.     // Get template ID from database
  240.     tptBlob.id := dsTemplates.FieldByName('id').AsInteger;
  241.     // Get template data from database as string.
  242.     tmp := dsTemplates.FieldByName('template').AsString;
  243.     // Get template size from database.
  244.     tptBlob.size := length(tmp);
  245.     // Move template data from temporary string
  246.     // to template object.
  247.     SafeArrayAccessData(tptBlob.tpt, Pointer(p));
  248.     Move(PChar(tmp)^, p^, tptBlob.size);
  249.     SafeArrayUnaccessData(tptBlob.tpt);
  250.     // move foward in the list of templates
  251.     dsTemplates.Next();
  252.     getNextTemplate := tptBlob;
  253.   end;
  254. end;
  255.  
  256. end.




Adiós
  • 0

#15 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 18 agosto 2009 - 06:45

Ah vaya, yo intentaba hacerlo de una manera propia, pero por alguna u otra razón no lograba encender el bendito Sensor :@.

Saludos.
  • 0

#16 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 18 agosto 2009 - 07:12

Que bien, muchas gracias por el code amigo BlackDaemon, parece que saldrá algo muy interesante de esto.

Salud OS
  • 0

#17 BlackDaemon

BlackDaemon

    Member

  • Miembros
  • PipPip
  • 22 mensajes

Escrito 18 agosto 2009 - 07:41

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
  • 0

#18 BlackDaemon

BlackDaemon

    Member

  • Miembros
  • PipPip
  • 22 mensajes

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
  • 0

#19 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

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
  • 0

#20 BlackDaemon

BlackDaemon

    Member

  • Miembros
  • PipPip
  • 22 mensajes

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


  • 0




IP.Board spam blocked by CleanTalk.