Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Trucos (https://www.clubdelphi.com/foros/forumdisplay.php?f=52)
-   -   Manejo Biometrico con Verifinger Sdk v4.2 Standard (https://www.clubdelphi.com/foros/showthread.php?t=80844)

fredo 09-02-2008 04:45:18

Manejo Biometrico con Verifinger Sdk v4.2 Standard
 
bueno, hace ya tempo que no ocupo estos componentes que desarrolle para algunas aplicaciones de huellas digitales.

Las desarrolle debido a que el uso de un lector biometrico es medio engorroso y las funciones son siempre las mismas, por ello tam,bien invito a mejorar el codigo, debido que aunque se POO el desarrollo aun se puede mejorar, espero que esas mejoras tambien sean posteadas.

Las unit faltantes vienen todas con las SDK's

Slds desde chile

PD:ojalá les sea de utilidad.



Código Delphi [-]
unit BioLector;

interface

uses
  SysUtils, Classes,VFImage,VFControls,VFOptions,VFFeatures,VFinger,ScanMan,UIDHuella,Dialogs,DB;

type
  TOn_Captura = procedure(ScannerID: string; Width,Height: Integer; Image: PByte; Resolution: Integer)of object;
  TON_CambioEstado = procedure(ScannerID: string; State: LongWord) of object;

  TBioLector = class(TComponent)
  private
    { Private declarations }
        FActive:Boolean;
        FN_Scaner:Integer;
        FIds:TStringList;
        FImage,FImageAfter:TVFImage;
        FResolucion:Integer;
        FScannerID: string;
        FFingerID: string;
        FView:TVFView;
        FOn_Captura:TOn_Captura;
        FON_CambioEstado:TON_CambioEstado;
        Features:TVFFeatures;
        FTipo_Scaner:String;
        procedure SetActive(Estado:Boolean);
        procedure SetIDScaner(Scaner:Integer);
        procedure SetTipoScaner(Tipo:String);
  protected
    { Protected declarations }
  public
    { Public declarations }
        property Active:Boolean read FActive write SetActive;
        property Huella:TVFFeatures read Features;
        constructor Create(AOwner: TComponent);override;
        destructor Destroy;override;
        procedure OnScannerImage(ScannerID: string; Width,Height: Integer; Image: PByte; Resolution: Integer);
        procedure OnScannerState(ScannerID: string; State: LongWord);
        procedure AsignaHuella(var PHuella:TVFFeatures);
        function comparar(huella_externa:TVFFeatures):boolean;
        function Buscar_en_DataSet(Dataset:TDataSet;campo:String;buscado:TVFFeatures):boolean;
        function Asignar_a_Blob(var campo:TBlobFIeld):boolean;
  published
    { Published declarations }
       property N_Scaner:Integer read FN_Scaner write SetIDScaner;
       property View:TVFView read fView write FView;
       property On_Captura:TOn_Captura read FOn_Captura write FOn_Captura;
       property ON_CambioEstado:TON_CambioEstado read FON_CambioEstado write FON_CambioEstado;
       property TipoScaner:String read FTipo_Scaner write SetTipoScaner;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('BioPack', [TBioLector]);
end;

procedure TBioLector.SetTipoScaner(Tipo:String);
Begin
     if uppercase(Tipo) <> FTipo_Scaner
     then
     begin
          if Tipo = 'GENERICO'
          then  VFSetParameter(VFP_MODE, LongWord(VF_MODE_GENERAL),nil)
          else
          if Tipo = 'U.ARE.U'
          Then VFSetParameter(VFP_MODE, LongWord(VF_MODE_DIGITALPERSONA_URU),nil)
          else
          if Tipo = 'BIOMETRIKAFX2000'
          Then VFSetParameter(VFP_MODE, LongWord(VF_MODE_BIOMETRIKA_FX2000),nil)
          else
          if Tipo = 'KEYTRONIC_SECUREDESKTOP'
          Then VFSetParameter(VFP_MODE, LongWord(VF_MODE_KEYTRONIC_SECUREDESKTOP),nil)
          else
          if Tipo = 'IDENTIX_TOUCHVIEW'
          Then VFSetParameter(VFP_MODE, LongWord(VF_MODE_IDENTIX_TOUCHVIEW),nil)
          else
          if Tipo = 'PRECISEBIOMETRICS_100CS'
          Then VFSetParameter(VFP_MODE, LongWord(VF_MODE_PRECISEBIOMETRICS_100CS),nil)
          else
          if Tipo = 'STMICROELECTRONICS_TOUCHCHIP'
          Then VFSetParameter(VFP_MODE, LongWord(VF_MODE_STMICROELECTRONICS_TOUCHCHIP),nil)
          else
          if Tipo = 'IDENTICATORTECHNOLOGY_DF90'
          Then VFSetParameter(VFP_MODE, LongWord(VF_MODE_IDENTICATORTECHNOLOGY_DF90),nil)
          else
          if Tipo = 'AUTHENTEC_AFS2'
          Then VFSetParameter(VFP_MODE, LongWord(VF_MODE_AUTHENTEC_AFS2),nil)
          else
          if Tipo = 'AUTHENTEC_AES4000'
          Then VFSetParameter(VFP_MODE, LongWord(VF_MODE_AUTHENTEC_AES4000),nil)
          else
          if Tipo = 'ATMEL_FINGERCHIP'
          Then VFSetParameter(VFP_MODE, LongWord(VF_MODE_ATMEL_FINGERCHIP),nil)
          else
          if Tipo = 'BMF_BLP100'
          Then VFSetParameter(VFP_MODE, LongWord(VF_MODE_BMF_BLP100),nil)
          else
          if Tipo = 'SECUGEN_HAMSTER'
          Then VFSetParameter(VFP_MODE, LongWord(VF_MODE_SECUGEN_HAMSTER),nil)
          else
          if Tipo = 'ETHENTICA'
          Then VFSetParameter(VFP_MODE, LongWord(VF_MODE_ETHENTICA),nil)
          else
          if Tipo = 'CROSSMATCH_VERIFIER300'
          Then VFSetParameter(VFP_MODE, LongWord(VF_MODE_CROSSMATCH_VERIFIER300),nil)
          else VFSetParameter(VFP_MODE, LongWord(VF_MODE_GENERAL),nil);

          FTipo_Scaner:=Tipo;

     end;

end;

function TBioLector.Buscar_en_DataSet(Dataset:TDataSet;campo:String;buscado:TVFFeatures):boolean;
var encontrado:Boolean;
    MD: TVFMatchDetails;
    Stream: TStream;
    PLEIDO,PBUSCADO:array[0..VF_MAX_FEATURES_SIZE] of Byte;
    size,resultado:Integer;

Begin
     encontrado:=false;
     if buscado <> nil
     then
     Begin
          buscado.GetData(@PBUSCADO[0]);
     end
        else Features.GetData(@PBUSCADO[0]);
     MD.Size := SizeOf(MD);
     Dataset.First;
     while (not Dataset.Eof) and (Not encontrado) do
     Begin
          TRY
             Stream:=dataset.CreateBlobStream(dataset.Fieldbyname(campo), bmRead);
             Size := Stream.Read(PLeido[0], VF_MAX_FEATURES_SIZE);
             resultado:=VFVerify(@PLeido[0],@PBUSCADO[0], @MD, nil);
             if  VFSucceeded(Resultado) or (Resultado = VFE_FAILED)
             then
             begin
                  if Resultado <> VFE_FAILED
                  then
                  Begin
                       encontrado:=true;
                  end;
             end;
           FINALLY
                  Stream.Free;
           END;
           if not encontrado then Dataset.Next;
     end;
     result:=encontrado;
end;

function TBioLector.Asignar_a_Blob(var campo:TBlobFIeld):boolean;
var  Stream: TStream;
     x:array[0..VF_MAX_FEATURES_SIZE] of Byte;

Begin
     result:=false;
     if (campo.DataSet.State = dsInsert) or (campo.DataSet.State = dsEdit)
     then
     Begin
          try
             stream:=campo.DataSet.CreateBlobStream(campo,bmWrite);
             Features.GetData(@x[0]);
             Stream.Write(x, Sizeof(x));
             result:=true;
          finally
             Stream.Free;
          end;
     end;
end;
//****************************************

procedure SMImageProc(const ScannerID: PAnsiChar; Width, Height: Integer;
  const Image: PByte; Resolution: Integer; Param: Pointer); stdcall;
begin
     TBioLector(Param).OnScannerImage(ScannerID, Width, Height, Image, Resolution);
end;

procedure SMStateProc(const ScannerID: PAnsiChar; State: LongWord; Param: Pointer); stdcall;
begin
     TBioLector(Param).OnScannerState(ScannerID, State);
end;

//****************************************

function TBioLector.comparar(huella_externa:TVFFeatures):boolean;
var MD: TVFMatchDetails;
    uno,dos:array[0..VF_MAX_FEATURES_SIZE] of Byte;
    resultado:Integer;
Begin
     try
     MD.Size := SizeOf(MD);
     Features.GetData(@dos[0]);
     huella_externa.GetData(@uno[0]);
     resultado:=VFVerify(@uno[0],@dos[0], @MD, nil);
     if  VFSucceeded(Resultado) or (Resultado = VFE_FAILED)
     then
     begin
          Result:= (Resultado <> VFE_FAILED);
     end
        else Result:=false;
     except
           showmessage('Datos a comparar Vacios!');
           Result:=false;
     end;
end;

//****************************************

procedure TBioLector.OnScannerState(ScannerID: string; State: LongWord);
begin
     if Assigned(ON_CambioEstado)
     then ON_CambioEstado(ScannerID,State);
end;


procedure TBioLector.OnScannerImage(ScannerID: string; Width,
  Height: Integer; Image: PByte; Resolution: Integer);
var huella:array[0..VF_MAX_FEATURES_SIZE] of Byte;
    FFeaturesSize: LongWord;

begin
     FScannerID := ScannerID;
     FResolucion := Resolution;
     FFingerID := EmptyStr;
     FImage.Assign(Width, Height, Image);

     VFExtract(FImage.Width, FImage.Height,FImage.bits,Resolution,@huella[0],FFeaturesSize, nil);
     if Features = nil
     then Features:=TVFFeatures.CreateFromData(@huella[0])
     else Features.SetData(@huella[0]);

     if Assigned(FView)
     then
     BEGIN
          FView.Resolution:=Resolution;

          if FView.Features <> nil
          then FView.Features.SetData(@huella[0])
          else FView.Features:=Features;

          if FView.Image = nil
          then FView.Image:=TVFImage.Create;
          FView.Image.Assign(FImage);
          FView.UpdateImage;
     END;

     if Assigned(On_Captura)
     then On_Captura(ScannerID,Width,Height,Image,Resolution);
end;

procedure TBioLector.SetActive(Estado:Boolean);
Begin
     if fActive <> Estado then
     Begin
          fActive:=Estado;
          if (fActive) and (FN_Scaner > 0)
          then
          Begin
               VFCheckResult(VFInitialize);
               SMCheckResult(SMInitialize);
               SMGetScannerIds(FIds);
               try
                  SMStartCapturing(FIDs[FN_Scaner-1], SMImageProc, SMStateProc,Self);
               except
                     SMCheckResult(SMFinalize);
                     VFCheckResult(VFFinalize);
               end;
          end
             else
          Begin
               SMCheckResult(SMFinalize);
               VFCheckResult(VFFinalize);
          end;
     end;
end;

procedure TBioLector.SetIDScaner(Scaner:Integer);
Begin
     if (Scaner <> FN_Scaner) and (Scaner >= 0) and (Scaner < 3)
     then
     Begin
          FN_Scaner:=Scaner;
     end;
end;

//***************************************************

procedure TBioLector.AsignaHuella(var PHuella:TVFFeatures);
var Dato:array[0..VF_MAX_FEATURES_SIZE] of Byte;
Begin
     Features.GetData(@Dato[0]);
     if PHuella = nil
     then PHuella:=TVFFeatures.CreateFromData(@Dato[0]);
end;

//***************************************************


constructor TBioLector.Create(AOwner: TComponent);
Begin
     inherited;
     FIds:=TStringList.Create;
     fActive:=false;
     FImage:=TVFImage.Create;
     Features:=TVFFeatures.Create;
     FTipo_Scaner:='GENERICO';
end;

destructor TBioLector.Destroy;
Begin
     FIds.Free;
     FImage.Free;
     FImageAfter.Free;
     if FActive
     then
     Begin
          Active:=false;
     end;
     inherited;
end;


end.




fredo 14-03-2008 22:08:31

varios me han preguntado por que no les funciona estas rutina, en el fondo este componente hace de interfase entre el el lector y el programa, la respuesta es sencilla, actualicen los drivers de su lector y eso basta, lo primero a hacer es compilar la demo que trae el SDK, si funciona ok entonces no tocar nada, si no, pueden bajar la demo de la pagina oficial de veryfinguer, para obtener la ultima version de verifinguer y asi poder utilizarlo, lo que pasa es que desde que actualizaron a servipack 2, que hay que actualizar el driver...

eso. yo tengo este componente andando en delphi 7, solo hay que hacerle un pequeño cambio en donde marca el error.

Sld2 y suerte!!!!

federicorl 21-03-2008 01:20:58

Cual es el pequeño cambio donde marca el error?

fredo 24-03-2008 20:16:30

Es solo cambiar el nombre de la unit en el IF... debes poner el nombre que tiene esa unidad en delphi 7, ese codigo no lo puedo publicar por que no es de mi propiedad.

sl2

fredo 24-03-2008 20:16:41

Es solo cambiar el nombre de la unit en el IF... debes poner el nombre que tiene esa unidad en delphi 7, ese codigo no lo puedo publicar por que no es de mi propiedad.

sl2

marinaAv 24-04-2013 22:37:58

hola buen dia estoy haciendo un reloj checador y buscando me encontre con este codigo pero mi pregunta es: seria copiar todo asi como esta o tengo que hacer alguna modificacion.. yo tengo DelphiXe2 en windows 8 ... y aun no encuentro la manera de guardar mi huella digital
espero su respuesta gracias
oo espero no eestar haciendo dos preguntas a la ves

rretamar 25-04-2013 14:56:59

Hace un tiempo (alrededor de cuatro años) estuve involucrado en un prototipo de software de reconocimiento de personas por huella dactilar. Al final no se llegó a implementar (aunque el prototipo funcionaba muy bien). En las pruebas evalué varios sensores (me quedé con el U-Are-U de Digital Persona) y un par de SDKs. De estos últimos el que mejor funcionó es el de Neurotechnologies, que si bien era muy preciso y soportaba sensores de varias marcas, el costo era elevadísimo (y prohibitivo). Como conclusión sacamos que no es algo que convenga desarrollar para pocas unidades, porque los costos son importantes, sobre todo el de la licencia del SDK. Además ya venían relojes chequeadores basado en huella dactilar, por lo que fue casi reinventar la rueda para algo que ya existía en el mercado.

En aquel entonces la huella la guardábamos en una base de datos, se generaba un "HASH" en forma de cadena de texto alfanumérica. El mismo SDK la generaba y luego hacía las comparaciones. Recuerdo que era tan bueno que se podía girar el dedo incluso 180 grados o colocarlo inclinado, y a la huella la detectaba igual. El problema que también encontramos (en aquel entonces era importante, supongo que hoy en día será más problemático aún, por la cuesta abajo en popularidad que tiene Delphi) es que no todos los SDK soportaban Delphi directamente.

marinaAv 25-04-2013 18:48:02

si pues existen ya los checadores pero a mi me toco hacer uno :( y pues estoy haciendo todo lo que puedo solo que pues la huella digital me esta dando problemas porqe jamas lo he hecho y no tengo ni la menor idea de como hacerlo :(

genyus00 12-02-2016 20:31:04

Manejo Biometrico con Verifinger Sdk v4.2 Standard
 
Buenas, recién encuentro con este tema, el cual estaré probando y verificando funcionamiento, recientemente he desarrollado una aplicación con el SDK FREE de Neurotechnology basándome en el demo que incluyen para Delphi; Mi duda al respecto es relacionada al tema de licencia, dado que he creado mi aplicación con el SDK que viene como DEMO y solo permite el registro de 10 personas y una huella por cada uno, la verdad es que para mi caso el SDK FREE me sirve sin problemas, ahora para el tema de la empresa que utilice el software, requieren comprar el SDK completo? siendo que solo con la funcionalidad del SDK Free le vale para lo que necesitan?

Aun cuando no he probado funcionamiento de estos componentes, pienso que la solución es muy buena y si funcionan como espero, procederé a completarlos incluyendo mis rutinas actuales. Gracias. :)

genyus00 12-02-2016 20:37:55

Manejo Biometrico con Verifinger Sdk v4.2 Standard
 
Buenas, donde se pueden encontrar las siguiente unidades o como se pueden reemplazar, ya que sin estas la solución realmente no es una solución, solo un código mas
sin ningún funcionamiento. :confused: Gracias.

VFImage,VFControls,VFOptions,VFFeatures,VFinger,ScanMan,UIDHuella :confused:

fredo 23-03-2016 18:16:42

vienen en la demo que trae vfinguer


La franja horaria es GMT +2. Ahora son las 21:26:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi