Delphi指纹识别

更新时间:2023-07-31 21:10:53 阅读: 评论:0

1.dll的调用
首先介绍一下在delpi中调用指纹仪开发包中的dll的方法。把开发包中的uruShell.dll放到程序目录下或System目录下。为了清晰明了起见,将DLL的调用声明集中在一个程序单元Shelluru.pas中,在里面把uruShell.dll 的函数导出并作有关的引用声明,具体源码如下: 版权申明:本站文章均来自网络,本站所有转载文章言论不代表本站观点
unit Shelluru; !
interface 。
us 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 UrList.Selected = nil then
begin
MessageBox(Application.Handle, ''''请先选择用户!'''', nil, MB_OK);
Exit;
end;
if UrList.Selected.Data <> nil then
Feature := UrList.Selected.Data file://此时Feature为空
el
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 := ''''开始注册 '''' UrList.Selected.Caption '''' 的指纹...'''';
if uru_Register(Handle, DeviceNo, 4, @Pixels, Feature) = FT_OK then
beg
in
Status.SimpleText := UrList.Selected.Caption '''': 注册成功!'''';
if UrList.Selected.Data = nil then
UrList.Selected.Data := Feature; !
end
el
begin
if UrList.Selected.Data = nil then uru_FreeFeature(Feature);
Status.SimpleText := UrList.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 UrList.Selected = nil then
begin
MessageBox(Application.Handle, ''''请先选择用户!'''', nil, MB_OK);
Exit;
end;
if UrList.Selected.Data = nil then
begin
MessageBox(Application.Handle, PChar(Format(''''用户 %s 还没有注册指纹,请先注册!'''', [UrList.Selected.Caption])), nil, MB_OK);
Exit;烟花英语
end;
FillChar(Pixels[5]^, uru_GetImageWidth * uru_GetImageHeight, $FF);
Images[5].Refresh;
Status.SimpleText := ''''开始验证 '''' UrList.Selected.Caption '''' 的指纹...'''';
Feature := UrList.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 := UrList.Selected.Caption '''': 验证成功!'''';
AssignFile(F,fingerpath);//分配文件
ReWrite(F);//重写文件
for i:=0 to len do
Write(F,byt[i]);//把指纹仪数据写入文件
CloFile(F);//关闭文件
end
el
Status.SimpleText := UrList.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);//指定文件
Ret(G);//重置文件
for i:=0 to len do
Read(G,byt2[i]);//把文
件中的指纹仪数据移到byte2数组中
CloFile(G);//关闭文件宜兴竹海
end;
FillChar(Pixels[5]^, uru_GetImageWidth * uru_GetImageHeight, $FF);
Images[5].Refresh;
Status.SimpleText := ''''开始验证 '''' UrList.Selected.Caption '''' 的指纹...'''';
uru_AllocFeature(aFeature1);//分配指纹数据地址
if (uru_AcquireFeatures(handle, DeviceNo, Pixels[5], aFeature1) = FT_OK) and uru_verifyFeatures(@byt2, aFeature1) then
Status.SimpleText := UrList.Selected.Caption '''': 验证成功!''''
el
Status.SimpleText := UrList.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 := Fal;
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)
el
MessageDlg('指纹比对失败!', mtInformation, [mbOK], 0);
//if ZKFPEngX1.VerRegFingerFile('c:\fingerprint.tpl', ATemplate, Fal, regChange) then
//  MessageDlg('文件指纹比对成功!', mtInformation, [mbOK], 0)
/
/el
//  MessageDlg('文件指纹比对失败!', mtInformation, [mbOK], 0);
end el 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) + ' Procesd Number = ' + IntToStr(ProcessNum), mtInformation, [mbOK], 0)
el begin
for I := 0 to FFingerName.Count - 1 do
if ID = Integer(FFingerName.Objects[I]) then
MessageDlg(Format('指纹比对成功!Name= %s Score = %d Procesd 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')
el 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 + '不合格'
el
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 := '

本文发布于:2023-07-31 21:10:53,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1125096.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:指纹   数据   验证   文件
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图