Delphi指纹识别

1.dll的调用
首先介绍一下在delpi中调用指纹仪开发包中的dll的方法。把开发包中的uruShell.dll放到程序目录下或System目录下。为了清晰明了起见,将DLL的调用声明集中在一个程序单元Shelluru.pas中,在里面把uruShell.dll 的函数导出并作有关的引用声明,具体源码如下: 版权申明:本站文章均来自网络,本站所有转载文章言论不代表本站观点

unit Shelluru; !

interface 。

uses windows, Messages; ..

const
FT_OK = 0; // 成功
FT_ERR_NO_INIT = -1; // 没有初始化
FT_ERR_UNKNOWN_DEVICE = -10; // 未知设备
FT_ERR_DEVICE_CONNECTED = -18; // 设备已连接
FT_ERR_NO_DEVICE_CONNECTED = -19; // 无设备可连接
MAX_REGISTER_COUNT = 8; // 最大可注册数
ERR_REGISTER_FAIL = -110; // 注册失败
ERR_VERIFY_FAIL = -111; // 验证失败
ERR_REGISTER_COUNT = -112; // 注册数

{ 以下下是自定义消息,MSG_FINGER_CAPTURED指纹获取消息;}MSG_WAITING_FOR_IMAGE指纹等待消息。
MSG_FINGER_CAPTURED = WM_USER 80;
MSG_WAITING_FOR_IMAGE = WM_USER 81; 根据专家观察,这样的理论和现象都是值得各位站长深思的,所以希望大家多做研究学习,争取总结出更多更好的经验!

type
PRegisterPixels = ^TRegisterPixels;
TRegisterPixels = array[1..MAX_REGISTER_COUNT] of Pointer; 。

///uru_Init初始化指纹仪,参数:numOfDev返回计算机连接的指纹仪数量;FeatureLen返回指纹数据长度。
function uru_Init(var numOfDev, FeatureLen: integer): integer; stdcall; 。

///uru_Connect连接特定指纹仪。参数:DeviceNo指纹仪号码。
function uru_Connect(DeviceNo: integer): integer; stdcall; ..

///uru_Terminate断开与指纹仪的连接。参数:DeviceNo指纹仪号码。
procedure uru_Terminate(DeviceNo: integer); stdcall; 对真正的成功者来说,不论他的生存条件如何,都不会自我磨灭

///uru_AllocFeature分配指纹数据地址。参数:Feature返回的地址指针。
procedure uru_AllocFeature(var Feature: pointer); stdcall; 对真正的成功者来说,不论他的生存条件如何,都不会自我磨灭

///uru_FreeFeature释放已分配的地址。参数:Feature返回的地址指针。
procedure uru_FreeFeature(var Feature: pointer); stdcall; ..

///uru_GetImageWidth获取指纹图像宽度。
function uru_GetImageWidth: integer; stdcall; 。

///uru_GetImageHeight获取指纹图像高度。
function uru_GetImageHeight: integer; stdcall; ..

///uru_Register指纹注册函数。参数:hwnd窗口句柄,用于消息传送;DevieceNo指纹仪号码;
///fngCount指纹登记次数;Pixels指纹图像连接指针;Features指纹注册数据指针.
function uru_Register(hwnd: HWND; DeviceNo, fngCount: integer;Pixels: PRegisterPixels; Features: pointer): integer; stdcall; 版权申明:本站文章均来自网络.

///uru_AcquireFeatures指纹验证函数。参数:hwnd窗口句柄

,用于消息传送;DevieceNo指纹仪号码.
function uru_AcquireFeatures(hwnd: HWND; DeviceNo: integer; Pixels, Features: pointer): integer; stdcall; .

///uru_verifyFeatures指纹对比函数。参数:srcFeatures需要对比指纹数据;dstFeatures对比的指纹数据。
function uru_verifyFeatures(srcFeatures, dstFeatures: pointer): Boolean; stdcall; 版权申明:本站文章均来自网络,如有侵权,请联系028-********-215,我们收到后立即删除,谢谢!

///dll注册函数
procedure uru_DllRegister; stdcall; ..

///中断特定指纹仪取像函数。参数:DeviceNo指纹仪号码。
Procedure uru_StopGetImage(DeviceNO:Integer);Stdcall; ..

implementation 版权申明:本站文章均来自网络,如有侵权,请联系028-********-215,我们收到后立即删除,谢谢!

const
DLLNAME = ''''uruShell.dll''''; 特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系

{以下为调用uruShell.dll 导出函数的声明}
function uru_Init; external DLLNAME;
function uru_Connect; external DLLNAME;
procedure uru_Terminate; external DLLNAME;










procedure uru_AllocFeature; external DLLNAME;
procedure uru_FreeFeature; external DLLNAME;
function uru_GetImageWidth; external DLLNAME;
function uru_GetImageHeight; external DLLNAME;
function uru_Register; external DLLNAME;
function uru_AcquireFeatures; external DLLNAME;
function uru_verifyFeatures; external DLLNAME;
procedure uru_DllRegister; external DLLNAME;
Procedure uru_StopGetImage;external DLLNAME; ..

end.

完成以上工作以后,则可以在主工程文件中引用Shelluru.pas文件,然后就可以调用Shelluru.pas文件中定义的函数了。 对真正的成功者来说,不论他的生存条件如何,都不会自我磨灭

2.把验证后的指纹数据保存在文件中或数据库中

通过调用以上定义的函数,我们可以实现一个指纹的注册,验证,指纹数据保存,指纹再验证(识别)的指纹识别系统。下面重点介绍一下指纹的注册和验证识别过程的编程实现: .

procedure TForm1.BtnRegisterClick(Sender: TObject); file://注册指纹
var
i:integer;
begin
if UserList.Selected = nil then
begin
MessageBox(Application.Handle, ''''请先选择用户!'''', nil, MB_OK);
Exit;
end;
if UserList.Selected.Data <> nil then
Feature := UserList.Selected.Data file://此时Feature为空
else
uru_AllocFeature(Feature);
if Feature = nil then file://假如指纹特征为空
begin
Status.SimpleText := ''''不能分配Feature内存'''';
Exit;
end;
for i := 1 to 4 do
begin
FillChar(Pixels[i]^, uru_GetImageWidth * uru_GetImageHeight, $FF);
Images[i].Refresh;
end;
Status.SimpleText := ''''开始注册 '''' UserList.Selected.Caption '''' 的指纹...'''';
if uru_Register(Handle, DeviceNo, 4, @Pixels, Feature) = FT_OK then
beg

in
Status.SimpleText := UserList.Selected.Caption '''': 注册成功!'''';
if UserList.Selected.Data = nil then
UserList.Selected.Data := Feature; !
end
else
begin
if UserList.Selected.Data = nil then uru_FreeFeature(Feature);
Status.SimpleText := UserList.Selected.Caption '''': 注册失败!'''';
end;
end;
此函数主要调用了DLL中的uru_Register函数,用来为用户注册指纹,注册指纹是为了提取指纹的特征值,为特征值分配一端内存,用来存储指纹特征值数据,并用一个指针指向这段内存,以便将来可以找回来。注册完成后要立即进行一次验证,确保数据无误,验证过程如下: ...

procedure TForm1.BtnVerifyClick(Sender: TObject); file://验证指纹
var
aFeature: pointer;
i: integer;
fingerpath: string ;
begin
fingerpath:=''''C:\finger'''' Edit9.Text Edit10.Text;//指纹数据存储路径
if UserList.Selected = nil then
begin
MessageBox(Application.Handle, ''''请先选择用户!'''', nil, MB_OK);
Exit;
end;
if UserList.Selected.Data = nil then
begin
MessageBox(Application.Handle, PChar(Format(''''用户 %s 还没有注册指纹,请先注册!'''', [UserList.Selected.Caption])), nil, MB_OK);
Exit;
end;
FillChar(Pixels[5]^, uru_GetImageWidth * uru_GetImageHeight, $FF);
Images[5].Refresh;
Status.SimpleText := ''''开始验证 '''' UserList.Selected.Caption '''' 的指纹...'''';
Feature := UserList.Selected.Data; file://需要对比指纹数据
move(Feature^,byt,len); file://把内存中的一段长为len,从Feature开始的数据移到byte数组中
uru_AllocFeature(aFeature);//分配指纹数据地址
if (uru_AcquireFeatures(handle, DeviceNo, Pixels[5], aFeature) = FT_OK) and uru_verifyFeatures(@byt, aFeature) then ..
file://uru_AcquireFeatures指纹验证
file://uru_verifyFeatures指纹对比
begin
Status.SimpleText := UserList.Selected.Caption '''': 验证成功!'''';
AssignFile(F,fingerpath);//分配文件
ReWrite(F);//重写文件
for i:=0 to len do
Write(F,byt[i]);//把指纹仪数据写入文件
CloseFile(F);//关闭文件
end
else
Status.SimpleText := UserList.Selected.Caption '''': 验证失败!'''';
uru_FreeFeature(aFeature); file://释放内存
end;
以上过程关键在于指纹验证成功后,及时把内存中的指纹数据存到数据文件中,数据文件名最好是用户名加上编号,以便以后验证时方便找到对应的用户指纹数据。最后还要记得把临时分配的内存释放掉。把指纹数据存储到文件,以后就可以通过打开文件的方式,把数据文件调出来,与当前用户进行一个匹配的过程,以便验证用户的正确身份,具体过程如下: .

procedure TForm1.BitBtn2Click(Sender: TObject); file://验证旧用户指纹
var
aFeature1: pointer;
i: integer;
begin
if OpenDialog1.Execute then
begin
AssignFile(G,OpenDialog1.FileName);//指定文件
Reset(G);//重置文件
for i:=0 to len do
Read(G,byt2[i]);//把文

件中的指纹仪数据移到byte2数组中
CloseFile(G);//关闭文件
end;
FillChar(Pixels[5]^, uru_GetImageWidth * uru_GetImageHeight, $FF);
Images[5].Refresh;
Status.SimpleText := ''''开始验证 '''' UserList.Selected.Caption '''' 的指纹...'''';
uru_AllocFeature(aFeature1);//分配指纹数据地址
if (uru_AcquireFeatures(handle, DeviceNo, Pixels[5], aFeature1) = FT_OK) and uru_verifyFeatures(@byt2, aFeature1) then
Status.SimpleText := UserList.Selected.Caption '''': 验证成功!''''
else
Status.SimpleText := UserList.Selected.Caption '''': 验证失败!'''';


版权申明:本站文章均来自网络,如有侵权,请联系028-********-215 ,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。













procedure btnInitClick(Sender: TObject);
procedure ZKFPEngX1Capture(Sender: TObject; ActionResult: WordBool;
ATemplate: OleVariant);
procedure btnSaveImageClick(Sender: TObject);
procedure btnRegClick(Sender: TObject);
procedure ZKFPEngX1FeatureInfo(Sender: TObject; AQuality: Integer);
procedure btnVerifyClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ZKFPEngX1Enroll(Sender: TObject; ActionResult: WordBool;
ATemplate: OleVariant);
procedure ZKFPEngX1ImageReceived(Sender: TObject;
var AImageValid: WordBool);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btnDogReadClick(Sender: TObject);
procedure btnDogWriteClick(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure ZKFPEngX2ImageReceived(Sender: TObject;
var AImageValid: WordBool);
private
{ Private declarations }
FRegTemplate: OleVariant;
FMatchType: Integer;
sRegTemplate: WideString;

FID: Integer;
FFingerName: TStringList;
fpcHandle: Integer;
iOld: DWORD;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.btnInitClick(Sender: TObject);
begin
if ZKFPEngX1.InitEngine = 0 then begin
MessageDlg('初始化成功!', mtInformation, [mbOK], 0);
ClientWidth := ZKFPEngX1.ImageWidth + pnlCommand.Width;
ClientHeight := ZKFPEngX1.ImageHeight;
btnInit.Enabled := False;
FMatchType := 0;
StatusBar.Panels.Items[0].Text := '指纹仪连接';
EDSensorNum.Text := IntToStr(ZKFPEngX1.SensorCount);
EDSensorIndex.Text := IntToStr(ZKFPEngX1.SensorIndex);
EDSensorSN.Text := ZKFPEngX1.SensorSN;
end;
end;

procedure TForm1.ZKFPEngX1Capture(S

ender: TObject; ActionResult: WordBool;
ATemplate: OleVariant);
var
ID, I: Integer;
Score, ProcessNum: Integer;
RegChange: WordBool;
iNew: Integer;
sTemp: string;
begin
StatusBar.Panels.Items[0].Text := '取得指纹特征';
if FMatchType = 1 then begin //1:1
//测试Encode and Decode
sTemp := ZKFPEngX1.EncodeTemplate1(ATemplate);
ATemplate := ZKFPEngX1.DecodeTemplate1(sTemp);

ZKFPEngX1.DecodeTemplate(sRegTemplate, FRegTemplate);

if ZKFPEngX1.VerFinger(FRegTemplate, ATemplate, True, regChange) then
MessageDlg('指纹比对成功!', mtInformation, [mbOK], 0)
else
MessageDlg('指纹比对失败!', mtInformation, [mbOK], 0);
//if ZKFPEngX1.VerRegFingerFile('c:\fingerprint.tpl', ATemplate, False, regChange) then
// MessageDlg('文件指纹比对成功!', mtInformation, [mbOK], 0)
//else
// MessageDlg('文件指纹比对失败!', mtInformation, [mbOK], 0);
end else if FMatchType = 2 then begin //1:N
Score := 8;
ID := ZKFPEngX1.IdentificationInFPCacheDB(fpcHandle, ATemplate, Score, ProcessNum);
iNew := GetTickCount - iOld;
if ID = -1 then
MessageDlg('指纹比对失败!Score = ' + IntToStr(Score) + ' Processed Number = ' + IntToStr(ProcessNum), mtInformation, [mbOK], 0)
else begin
for I := 0 to FFingerName.Count - 1 do
if ID = Integer(FFingerName.Objects[I]) then
MessageDlg(Format('指纹比对成功!Name= %s Score = %d Processed Number = %d time = %d',
[FFingerName.Strings[I], Score, ProcessNum, iNew]), mtInformation, [mbOK], 0)
end;
end;
end;

procedure TForm1.btnSaveImageClick(Sender: TObject);
const
sFileName = 'C:\Fingerprint';
begin
if RGFormat.ItemIndex = 0 then
ZKFPEngX1.SaveBitmap(sFileName + '.bmp')
else if RGFormat.ItemIndex = 1 then
ZKFPEngX1.SaveJPG(sFileName + '.jpg');
MessageDlg('文件保存成功(' + sFileName + ')!', mtConfirmation, [mbOK], 0);
end;

procedure TForm1.btnRegClick(Sender: TObject);
begin
if EDFingerName.Text = '' then begin
MessageDlg('请输入指纹名称标识!', mtInformation, [mbOK], 0);
Exit;
end;
ZKFPEngX1.BeginEnroll;
StatusBar.Panels.Items[0].Text := '开始登记';
end;

procedure TForm1.ZKFPEngX1FeatureInfo(Sender: TObject; AQuality: Integer);
var
sTemp: string;
begin
sTemp := '';
if ZKFPEngX1.IsRegister then
sTemp := '登记状态: 还需要按压' + IntToStr(ZKFPEngX1.EnrollIndex) + '次手指!';
sTemp := sTemp + ' 指纹质量';
if AQuality <> 0 then
sTemp := sTemp + '不合格'
else
sTemp := sTemp + '合格';
StatusBar.Panels.Items[0].Text := sTemp;
end;

procedure TForm1.btnVerifyClick(Sender: TObject);
begin
if ZKFPEngX1.IsRegister then ZKFPEngX1.CancelEnroll;
StatusBar.Panels.Items[0].Text := '

开始比对(1:1)';
FMatchType := 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if ZKFPEngX1.IsRegister then ZKFPEngX1.CancelEnroll;
StatusBar.Panels.Items[0].Text := '开始比对(1:N)';
FMatchType := 2;
end;

procedure TForm1.ZKFPEngX1Enroll(Sender: TObject; ActionResult: WordBool;
ATemplate: OleVariant);
var
i: Integer;
begin
if not ActionResult then
MessageDlg('指纹登记失败!', mtWarning, [mbOK], 0)
else begin
MessageDlg('指纹登记成功!', mtWarning, [mbOK], 0);
//ZKFPEngX1.ModifyTemplate(ATemplate, True);
FRegTemplate := null;
//FRegTemplate := ATemplate;
ZKFPEngX1.EncodeTemplate(ATemplate, sRegTemplate);
i := Length(sRegTemplate);
ZKFPEngX1.SaveTemplate('c:\fingerprint.tpl', ATemplate);
if FID mod 2 = 1 then
ZKFPEngX1.AddRegTemplateToFPCacheDB(fpcHandle, FID, ATemplate)
else
ZKFPEngX1.AddRegTemplateFileToFPCacheDB(fpcHandle, FID, 'c:\fingerprint.tpl');

ZKFPEngX1.RemoveRegTemplateFromFPCacheDB(fpcHandle, FID);
ZKFPEngX1.AddRegTemplateToFPCacheDB(fpcHandle, FID, ATemplate);

FFingerName.AddObject(EDFingerName.Text, TObject(FID));
Inc(FID);
end;
end;

procedure TForm1.ZKFPEngX1ImageReceived(Sender: TObject;
var AImageValid: WordBool);
begin
iOld := GetTickCount;
with ZKFPEngX1 do
PrintImageAt(Self.Canvas.Handle, 0, 0, ImageWidth, ImageHeight);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FID := 1;
FFingerName := TStringList.Create;
fpcHandle := ZKFPEngX1.CreateFPCacheDB;
FRegTemplate := null;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FFingerName.Free;
ZKFPEngX1.FreeFPCacheDB(fpcHandle);
end;

procedure TForm1.btnDogReadClick(Sender: TObject);
var
p1, p2: Integer;
v: OleVariant;
p: array [0..23] of Char;
ap: Pointer;
begin
p1 := 0;
p2 := 23;
ZKFPEngX1.DongleMemRead(p1, p2, v);
ap := VarArrayLock(v);
CopyMemory(@p[0], ap, p2);
p[23] := #0;
EDInfo1.Text := p;
end;

procedure TForm1.btnDogWriteClick(Sender: TObject);
var
p1, p2: Integer;
v: OleVariant;
i: Integer;
s: string;
begin
p1 := 0;
p2 := Length(EDInfo.Text);
s := EDInfo.Text;
v := VarArrayCreate([0, p2 - 1], varByte);
for i := 0 to Length(EDInfo.Text) - 1 do
v[i] := Ord(s[i + 1]);
ZKFPEngX1.DongleMemWrite(p1, p2, v);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ZKFPEngX1.CancelCapture;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
ZKFPEngX1.BeginCapture;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ZKFPEngX1.EndEngine;
btnInit.Enabled := True;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
if ZKFPEngX2.InitEngine = 0 then begin
MessageDlg('初始化成功!', mtInformat

ion, [mbOK], 0);
ClientWidth := ZKFPEngX2.ImageWidth + pnlCommand.Width;
ClientHeight := ZKFPEngX2.ImageHeight;
btnInit.Enabled := False;
FMatchType := 0;
StatusBar.Panels.Items[0].Text := '指纹仪连接';
EDSensorNum.Text := IntToStr(ZKFPEngX2.SensorCount);
EDSensorIndex.Text := IntToStr(ZKFPEngX2.SensorIndex);
EDSensorSN.Text := ZKFPEngX2.SensorSN;
end;
end;

procedure TForm1.ZKFPEngX2ImageReceived(Sender: TObject;
var AImageValid: WordBool);
begin
iOld := GetTickCount;
with ZKFPEngX2 do
PrintImageAt(Self.Canvas.Handle, 0, 0, ImageWidth, ImageHeight);
end;

end.



相关文档
最新文档