2024年1月14日发(作者:)

首先请在“没有连接指纹仪的情况下”安装指纹仪驱动程序。

驱动程序安装完毕请重新启动计算机,再插入指纹仪到计算机的USB接口上。

1、拷贝下面文件到 Windows 系统目录(c:windowssystem):

控件库文件

许可文件

2、注册控件 :

c: c:

3、ActiveX控件参考

Biosdk SDK 3.5分为1:1和1:N两个控件,其中接口属性和方法基本相同,而接口方法只有涉及1:N比对部分不同,因此以下综合说明两个控件,不同之处将分别标出和说明。

以下都采用VB语法说明,其中指纹模板Variant变量代表一维字节数组。

1.1属性

1.1.1 Active as Boolean

Read only

当前SensorIndex设定的指纹采集器是否准备就绪。

1.1.2 EngineValid as Boolean

Read only

指纹识别系统是否正常工作。调用过函数initEngine后会返回有效结果

1.1.3 EnrollIndex As Long

Read only

登记指纹时取样的序号,即表示当前手指登记已经取到的有效次数。

1.1.4 EnrollCount As Long

登记指纹时取样的次数,取值范围为1-4次

1.1.5 FPEngineVersion AS String

read only

指纹识别系统版本号

1.1.6 ImageHeight AS integer

Read only

指纹图像的高度

1.1.7 ImageWidth AS integer

Read only

指纹图像的宽度

1.1.8 IsRegister As Boolean

Read only

是否正登记指纹

1.1.9 OneToOneThreshold As Boolean

设定Biosdk低速指纹1:1比对的识别阀值分数(1-100),默认为10,值越大,误判率越低同时拒绝率变大

注意:1:1控件没有这个属性

1.1.10 RegTplFileName As String

设置当事件OnEnrollToFile发生时,保存指纹登记模版的文件名称。

1.1.11 SensorCount As Long

Read only

当前连接到计算记得指纹采集器的个数,当EngineValid无效时,返回0

1.1.12 SensorIndex AS Long

连接多个指纹采集器时,选择指纹头的序号,从0开始;小于零时指纹采集器不工作。

1.1.13 SensorSN As String

指纹采集器的硬件序列号

1.1.14 TemplateLen As Long

Read only

指纹登记模版的字节长度。

注意:1:N时模板长度为1152字节,1:1时模板长度为310字节。

1.1.15 Threshold As Long

设定指纹识别系统比对识别阀值分数(1-100),默认为10,值越大,误判率越低同时拒绝率变大

1.1.16 VerTplFileName As String

设置当事件OnCaptureToFile发生时,保存指纹验证模版的文件名称。

1.2 方法

1.2.1 1:1和1:N控件接口相同的方法:

1.2.1.1 Sub BeginEnroll()

开始登记指纹,登记结束后发生OnEnroll事件。

1.2.1.2 Sub CancelEnroll()

取消当前的指纹登记状态,即由 BeginEnroll开始的操作可由此函数中断。

1.2.1.3 Function DongleIsExist As Boolean

检查加密狗是否存在。

1.2.1.4 Function DongleSeed(Byval lp2 As Long, Byval p1, p2, p3, p4 As

Integer) As Boolean

得到种子码lp2的四个16位整数(p1,p2,p3,p4)返回值,加密狗可以通过内部算法计算一个种子码,得到四个返回码。种子码算法是不公开的,可以通过检查返回码是否是期望的值来检查加密狗是否存在。

1.2.1.5 Function DongleUserID As Long

读出加密狗中的用户ID,用户ID不会重复相同。保存在加密狗内部特定位置。

1.2.1.6 Function DongleMemRead(Byval p1, p2 As Integer, buf) As Boolean

读出加密狗内存区位置p1开始的p2个字节到Variant变量buf(一维字节数组)。内存区共有24个字节,位置为0-23

1.2.1.7 Function DongleMemWrite(Byval p1, p2 As Integer, buf) As Boolean

写入Variant变量buf(一维字节数组)到加密狗内存区位置p1开始的p2个字节内。内存区共有24个字节,位置为0-23

1.2.1.8 Function GetTemplate()

得到最近一次获得的指纹模板。

1.2.1.9 Function GetFingerImage(Byval AFingerImage) As Boolean

得到最近一次获得的指纹图像(BMP 格式)。

1.2.1.10 Function InitEngine() As Long

初始化指纹识别系统。SensorCount、SensorSN、EngineValid、ImageHeight、ImageWidth等属性需在该函数被调用后才能返回正确结果。返回值:

0 初始化成功

1 指纹识别驱动程序加载失败

2 没有连接指纹识别仪

3 属性SensorIndex指定的指纹仪不存在(注意:在调用之前设置属性SensorIndex)

可以使用方法EndEngine释放指纹设备系统

1.2.1.11 Function VerFinger(byval regTemplate, verTemplate, AdoLearning

As Boolean, byval AregFeatureChanged As Boolean) As Boolean

比对两枚指纹的特征模版是否匹配。其中regTemplate表示指纹登记特征模版,verTemplate表示现场采集的指纹验证特征模版,AdoLearning表示是否进行指纹特征模版学习更新。AregFeatureChanged表示登记模版regTemplate是否改变,两枚指纹匹配时返回 True,不匹配时返回 False

说明:

手指特征随时间可能会发生一定程度的变化,通常不会影响指纹的比对,但通过进行指纹特征模版学习更新,系统会综合得到新的模版,从而可以降低拒绝率。

1.2.1.12 Function VerFingerFromFile(regTemplateFile As String,

verTemplateFile As String, AdoLearning As Boolean, byval

AregFeatureChanged As Boolean) As Boolean

比对两枚指纹的特征模版文件是否匹配。其中regTemplateFile表示指纹登记特征模版文件,verTemplateFile表示现场采集的指纹验证特征模版文件,AdoLearning表示是否进行指纹特征模版学习更新。AregFeatureChanged表示登记模版文件regTemplateFile是否改变。两枚指纹匹配时返回 True,不匹配

时返回 False

1.2.1.13 Function VerRegFingerFile(RegTemplateFile As String, verTemplate,

AdoLearning As Boolean, byval AregFeatureChanged As Boolean) As

Boolean

比对两枚指纹的特征模版是否匹配。其中regTemplate表示由 FileName

指定文件中的以前登记指纹特征模版,verTemplate表示现场采集的指纹的特征模版,AdoLearning表示是否进行指纹特征模版学习更新。AregFeatureChanged表示登记模版文件regTemplateFile是否改变。两枚指纹匹配时返回 True,不匹配时返回 False

1.2.1.14 Sub PrintImageAt(HDC As OLE_HANDLE, X As Long, Y As Long,

aWidth As Long, aHeight As Long)

在由(x,y)指定的位置上按照(aWidth, aHeight)指定的大小显示指纹图像,HDC表示要显示指纹的窗口的设备描述表句柄

1.2.1.15 Sub PrintImageEllipseAt(HDC As OLE_HANDLE, X As Long, Y As

Long, aWidth As Long, aHeight As Long, bkColor As OLE_COLOR)

在由(x,y)指定的位置上按照(aWidth, aHeight)指定的大小显示指纹图像,HDC表示要显示指纹的窗口的设备描述表句柄。这里的指纹图像被一椭圆形包围。

1.2.1.16 Sub SaveBitmap(FileName As String)

保存最后一次采集到的指纹的图像到 FileName 指定的位图文件中。

1.2.1.17 Sub SaveJPG(FileName As String)

保存最后一次采集到的指纹的图像到 FileName 指定的Jpeg文件中。

1.2.1.18 Function SaveTemplate(FileName As String, Template) As Boolean

保存Template指纹的特征模版到 FileName 指定的文件中。

1.2.1.19 function EncodeTemplate(ASour, var ADest As String) As Boolean

将控件使用的Variant模板ASour转换为BASE64格式的模板字符串ADest。

1.2.1.20 function DecodeTemplate(const ASour As String, ADest) As

Boolean

将BASE64格式的模板字符串ASour转换为控件使用的Variant类型ADset模板。

以上两个方法主要用于模板的数据库保存,Variant类型模板是以二进制格式数组方式存放,在PB, VB等语言中操作比较困难,方法EncodeTemplate可以将Variant类型编码转换为字符串类型,方法DecodeTemplate可以将字符串类型编码转换为Variant类型,需要注意的是,模板变量BASE64编码为字符串后,模板长度将变长。

1.2.1.21 function EncodeTemplate1(ASour) As String

将控件使用的Variant模板ASour转换为BASE64格式的模板字符串。参考EncodeTemplate,主要方便PB, VC中调用

1.2.1.22 function DecodeTemplate1(const ASour As String) As Variant

将BASE64格式的模板字符串ASour转换为控件使用的Variant类型模板。参考DecodeTemplate,主要方便PB, VC中调用

1.2.1.23 Sub BeginCapture()

设置当前指纹设备开始取像,可以使用方法CanncelCapture禁止当前指纹设备取像。

1.2.1.24 Sub EndEngine()

释放由方法InitEngine初始化的指纹设备,可以使用方法InitEngine重新初始化指纹设备,在退出系统时,推荐不要调用。

1.2.1.25 function VerFingerFromStr(regTemplateStr As String,

verTemplateStr As String, AdoLearning As Boolean, byval

AregFeatureChanged As Boolean) As Boolean

比对两枚指纹的特征模版是否匹配。其中regTemplateStr表示指纹登记特征模版(BASE64格式的字符串),verTemplateStr表示现场采集的指纹验证特征模版(BASE64格式的字符串),AdoLearning表示是否进行指纹特征模版

学习更新。AregFeatureChanged表示登记模版文件regTemplateFile是否改变。两枚指纹匹配时返回 True,不匹配时返回 False

1.2.1.26 function GetTemplateAsString() As String

得到最近一次获得的指纹验证或者登记模板,可以在OnCapture,OnEnroll, OnCaptureToFile, OnEnrollToFile事件中调用,和GetTemplate方法功能类似,区别在于本方法返回为转换为BASE64格式的模板字符串。

1.2.2 1:N控件接口方法:

1.2.2.1 Function AddRegTemplateToFPCacheDB(fpcHandle As Long, FPID

As Long, pRegTemplate) As Long

添加指纹登记模板pRegTemplate到指纹识别高速缓冲空间fpcHandle,FPID是要添加登记模板的标识。

1.2.2.2 Function AddRegTemplateFileToFPCacheDB(fpcHandle As Long,

FPID As Long, pRegTemplateFile As String) As Long

添加由 pRegTemplateFile指定文件中的以前指纹登记特征模版到指纹识别高速缓冲空间fpcHandle,FPID是要添加登记模板的标识,必须>=0。返回值为1表示成功,0表示失败

1.2.2.3 Function CreateFPCacheDB As Long

创建指纹识别高速缓冲空间,进行1:N识别时必须首先调用该函数得到指纹识别缓冲空间句柄。

说明:

由于Biosdk 1:1低速比对速度比较慢(在PII 233大约30ms),所以使用AddRegTemplateToFPCache 函数加入到缓冲中的1:1指纹不能太多,否则影响比对速度。

通过IsOneToOneTemplate可以判断是否属于1:1指纹

可以同时创建多个缓冲区,用于分组比对等。

1.2.2.4 Sub FlushFPImages ()

清空当前指纹设备中的缓冲图像。

1.2.2.5 Sub FreeFPCacheDB( fpcHandle As Long)

释放指纹识别高速缓冲空间,fpcHandle是调用该函数CreateFPCacheDB得到指纹识别缓冲空间句柄。

1.2.2.6 Function IdentificationFromFileInFPCacheDB (fpcHandle As Long,

pVerTemplateFile As String, Byval Score As Long, Byval

ProcessedFPNumber As Long) As Long

将指纹验证模板文件pVerTemplateFile和指纹识别高速缓冲空间fpcHandle中所有登记模板进行比对,Score传出ProcessedFPNumber次比对中的最高分数,ProcessedFPNumber传出比对的次数,当识别成功时返回值指纹标识,失败返回-1。

注意:

在识别过程中如果比对分数大于等于属性Threshold,则认为比对成功,不再和缓冲空间中剩余的指纹登记模板进行比对,函数返回匹配成功的指纹登记模板的指纹标识;

当指纹验证模板和指纹识别高速缓冲空间中所有指纹登记模板进行比对的分数都没有超过设定的Threshold,但同时比对的最高分数大于等于Score,则认为比对也是匹配成功,函数返回比对最高分数的指纹登记模板的标识,推荐设定为9;

1.2.2.7 Function IdentificationInFPCacheDB (fpcHandle As Long,

pVerTemplate, Byval Score As Long, Byval ProcessedFPNumber As Long)

As Long

将指纹验证模板pVerTemplate和指纹识别高速缓冲空间fpcHandle中所有登记模板进行比对,Score传出ProcessedFPNumber次比对中的最高分数,ProcessedFPNumber传出比对的次数,当识别成功时返回值指纹标识,失败返回-1。

注意:

在识别过程中如果比对分数大于等于属性Threshold,则认为比对成功,不再和缓冲空间中剩余的指纹登记模板进行比对,函数返回匹配成功的指纹登记模板的指纹标识;

当指纹验证模板和指纹识别高速缓冲空间中所有指纹登记模板进行比对

的分数都没有超过设定的Threshold,但同时比对的最高分数大于等于Score,则认为比对也是匹配成功,函数返回比对最高分数的指纹登记模板的标识,推荐设定为9;

1.2.2.8 Function IsOneToOneTemplate (ATemplate) As Boolean

判断当前指纹特征模版Atemplate是否为Biosdk 1:1低速比对特征模版。

1.2.2.9 Function ModifyTemplate(byval Atemplate, AOneToOne As Boolean)

As Boolean

根据AOneToOne修改指纹特征模版Atemplate为Biosdk 1:1低速比对特征模版或者高速比对特征模版。

1.2.2.10 Function RemoveRegTemplateFromFPCacheDB (fpcHandle As

Long, FPID As Long) As Long

删除指纹识别高速缓冲空间fpcHandle中,指纹标识为FPID的指纹登记模板。返回值为1表示成功,0表示失败

1.2.2.11 Sub CancelCapture()

禁止当前指纹设备取像,可以使用方法BeginCapture使指纹设备开始取像。

1.2.2.12 Function AddRegTemplateStrToFPCacheDB(fpcHandle As Long,

FPID As Long, ARegTemplateStr As String) As Long

添加BASE64格式的字符串ARegTemplateStr指纹登记特征模版到指纹识别高速缓冲空间fpcHandle,FPID是要添加登记模板的标识,必须>=0。返回值为1表示成功,0表示失败

1.2.2.13 Function IdentificationFromStrInFPCacheDB (fpcHandle As Long,

AVerTemplateStr As String, Byval Score As Long, Byval

ProcessedFPNumber As Long) As Long

将指纹验证模板AverTemplateStr(BASE64格式的字符串)和指纹识别高速缓冲空间fpcHandle中所有登记模板进行比对,Score传出ProcessedFPNumber次比对中的最高分数,ProcessedFPNumber传出比对的次数,当识别成功时返回值指纹标识,失败返回-1。

注意:

在识别过程中如果比对分数大于等于属性Threshold,则认为比对成功,不再和缓冲空间中剩余的指纹登记模板进行比对,函数返回匹配成功的指纹登记模板的指纹标识;

当指纹验证模板和指纹识别高速缓冲空间中所有指纹登记模板进行比对的分数都没有超过设定的Threshold,但同时比对的最高分数大于等于Score,则认为比对也是匹配成功,函数返回比对最高分数的指纹登记模板的标识,推荐设定为9;

1.2.2.14 Sub SetAutoIdentifyPara(AutoIdentify As Boolean, fpcHandle As

Long, Score As Long)

设置内部高速比对需要的比对方式AutoIdentify、高速缓冲句柄fpcHandle和最低阀值分数Score, Score可以参考方法IdentificationFromInFPCacheDB。当AutoIdentify = True时, 按压指纹激活OnCapture事件,提取到指纹比对模板后,控件内部直接调用优化的高速比对功能进行比对,比对结果可以通过OnCapture的参数ATemplate或者GetTemplate得到,此时不需要再调用IdentificationINFPCahceDB函数进行比对。

请参考OnCapture事件。

1.2.3 1:1控件接口方法:

1.2.3.1 Function AddBitmap(BitmapHandle As OLE_HANDLE, ValidRectX1

As Long, ValidRectY1 As Long, ValidRectX2 As Long, ValidRectY2 As Long,

DPI As Long) As Boolean

使用由BitmapHandle指定的位图进行登记或比对。ValidRectX1、ValidRectY1、 ValidRectX2、ValidRectY2四个参数指定了图像的有效区域,如果指定的图像区域无效,将取图像取全部区域,DPI指定了图像的分辨率大小。

1.2.3.2 Function AddImageFile(FileName As String, DPI As Long) As

Boolean

使用由FileName指定的指纹图像文件(支持BMP,TIFF,JPG,GIF等格式)进行登记或比对。DPI指定了图像的分辨率大小。

1.3 事件

1.3.1 OnCapture(ActionResult AS Boolean, ATemplate)

AutoIdentify = False时,取到用于比对的指纹验证模板ATemplate,

ActionResult =true 表示成功取到指纹模版;False 表示失败。

AutoIdentify = True时,返回指纹比对结果(一维数组),请参考下面定义:

ATemplate[0] 代表ID值 -1代表查找失败

ATemplate[1] 返回1:N比对分数 即原来Identification函数中的Score参数

ATemplate[2] 1:N指纹比对数

ATemplate[3] 1:1指纹比对数

请参考SetAutoIdentifyPara方法。

1.3.2 OnCaptureToFile(ActionResult AS Boolean)

取到用于比对的指纹验证模板,模版保存到文件中,文件名称为属性VerTplFileName设置, ActionResult =true 表示成功取到指纹模版;False 表示失败, 如果VerTplFileName没有设置或者为空,则不产生保存文件,但本事件仍然会触发。

1.3.3 OnEnroll(ActionResult AS Boolean, ATemplate)

用户登记指纹结束时调用该事件, ActionResult =true 表示成功登记,用pTemplate属性可取得指纹特征模版;False 表示失败。

1.3.4 OnEnrollToFile(ActionResult AS Boolean)

用户登记指纹结束时调用该事件, ActionResult =true 表示成功登记,指纹特征模板保存到文件中,文件名称为属性RegTplFileName设置;False 表示失败,如果RegTplFileName没有设置或者为空,则不产生保存文件,但本事件仍然会触发。。

1.3.5 OnFeatureInfo(AQuality As Long)

取得指纹初始特征,Quality表示该指纹特征的质量,有如下可能值:

0: 好的指纹特征

1: 特征点不够

2: 其它原因导致不能取到指纹特征

1.3.6 OnImageReceived(byval AImageValid As Boolean)

设备取到指纹图像或者通过AddImageFile和AddBitmap加入指纹图像时调用该事件,AImageValid表示是否进行模板提取,设置为False后,系统在取到指纹图像后返回,不进行模板提取。

1.3.7 OnFingerTouching

当手指按压指纹取像设备时调用该事件。

1.3.8 OnFingerLeaving

当手指移开指纹取像设备时调用该事件。

2、工作流程说明

BeginEnroll

OnImageReceived

OnFeatureInfo

1-4次

OnEnroll

OnEnrollToFile

Image

Template

IsRegister = True

IsRegister = False

BeginCapture

OnImageReceived

OnFeatureInfo

OnCapture

OnCaptureToFile

Image

Template

工作流程说明:

指纹仪初始化进入工作状态后,调用BeginEnroll处于登记指纹状态,调用BeginCapture处于指纹验证状态。控件的工作方式是基于事件驱动,触发事件的顺序参考上面示意图。

指纹登记一般需要按同一手指1-4次,然后由识别系统综合处理得到一个指纹登记模板,按压登记指纹次数由控件属性EnrollCount设置,达到设定次数后会触发OnEnroll和OnEnrollToFile事件。

指纹验证时,按压手指后会触发OnCapture和OnCaptureToFile事件,此时可以调用VerFinger或者IdentificationInFPCacheDB进行1:1或者1:N比对。

需要注意每次按压手指都会触发OnFeatureInfo事件,如果按压手指的指纹模板质量不合格,则本次取像无效,需要重新按压手指

3、常见问题说明

3.1 1:1和1:N控件区别

1:1控件主要用于需要进行1:1验证的开发项目,一般需要预先输入当前验证客户的标识,然后得到他已经登记的一个或几个模板进行验证;而1:N控件主要用于不输入客户标识,直接通过客户指纹从已经登记的指纹模板中找出自己。

1:1控件主要目标是高的通过率和相对高的准确率;1:N控件主要目标是高的比对速度和相对高的准确率.。

1:1控件的最大模板长度只有310字节,而1:N控件的最大模板长度是1152字节,由于1:N需要进行高速比对,而且要求对误判率要求很高,所以需要保存较多的模板特征信息。

3.2 数据库中指纹模板写入和读出

SDK中指纹模板是以Vairant变量的方式保存和传递,其存储的是一维二进制字节数组,不能像字符串一样直接用SQL语句写入和读出,有下面处理方法:

1、 EncodeTemplate和DecodeTemplate方法可以在Variant变量和字符串变量之间互相进行BASE64编码转换,缺点是转换为字符串后,模板长度会增加大约1/3。

2、 在OnEnroll事件和OnCapture事件中直接调用GetTemplateAsString方法得到相应字符串形式的登记模板和比对模板。

3、直接操作Variant变量,下面是操作示例:

Delphi, CB:

procedure Data(AQuery: TADOQuery; AFingerID: Integer; AFPData:

OleVariant);

var

pData: PChar;

begin

with AQuery do begin

Close;

;

('SELECT * FROM zkFingerPrint WHERE FingerID = ' + IntToStr(AFingerID));

Open;

if IsEmpty then

Append

else

Edit;

FieldByName('FingerID').Value := AFingerID;

//保存指纹模板

with TBlobStream(CreateBlobStream(FieldByName('Template'), bmWrite)) do begin

pData := VarArrayLock(AFPData);

try

Write(pData^, VarArrayHighBound(AFPData, 1) - VarArrayLowBound(AFPData, 1) + 1);

finally

VarArrayUnlock(AFPData);

end;

Free;

end;

Post;

Close;

end;

end;

procedure ata(AQuery: TADOQuery; AFingerID: Integer; var AFPData:

OleVariant);

var

pData: PChar;

begin

with AQuery do begin

Close;

;

('SELECT * FROM zkFingerPrint WHERE FingerID = ' + IntToStr(AFingerID));

Open;

//读取数据

if not IsEmpty then

with TBlobStream(CreateBlobStream(FieldByName('Template'), bmRead)) do begin

AFPData := VarArrayCreate([0, Size + 1], varByte);

pData := VarArrayLock(AFPData);

try

Read(pData^, Size);

finally

VarArrayUnlock(AFPData);

end;

Free;

end;

Close;

end;

end;

3.3 软件加密狗和授权许可文件

SDK运行必须需要软件加密狗或者授权许可文件,软件加密狗和授权许可文件的区别在于软件加密狗和使用的指纹仪无关,而授权许可文件是和指纹仪相对应的,即软件加密狗可以和所有指纹仪一起使用,而授权许可文件只能和授权许可的指纹仪一起使用。

授权许可文件()内容是文本方式,可以存放多个指纹仪的许可,每行代表一个指纹仪的许可。需要注意需要将拷贝到Windows的系统目录下。

3.4 1:N高速缓冲空间的使用

在1:N比对时,需要对比对模板进行分类,同时为了得到最高速度,SDK需要创建内存空间,然后将已登记指纹加入到内存空间,高速缓冲空间实际上是内存空间,使用时需要首先用方法CreateFPCahceDB创建,然后用

方法AddRegTemplateToFPCahceDB,RemoveRegTemplateFromFPCacheDB等加入或者删除指纹登记模板,最后可以使用方法FreeFPCacheDB释放内存空间。

可以同时创建多个高速缓冲空间以用于实现分组查询等功能。

3.5 使用平面指纹图像

在使用1:1控件的项目中,很多时候要求保存指纹图像,或者从扫描仪直接扫描得到平面指纹图像,因此1:1控件SDK提供方法AddImageFile等可以直接从平面指纹图像得到指纹登记模板的方法,但需要注意必须将图像的分辨率则正确传入此方法,要求不能低于350DPI。

注意,在普通版中SDK不提供此方法。

3.6 指纹识别阀值的设定

在1:1控件中,属性Threshold推荐值为10,此时误判率大约0.01%,拒绝率大约1.5-2%之间。

在1:N控件中,属性Threshold推荐值为10,此时误判率大约0.001%,拒绝率大约3%,属性OneToOneThreshold的推荐值为10。

3.7 1:N识别中低质量指纹模板的处理方法

在1:N控件中,在指纹登记时系统自动将指纹模板按照质量的好坏分类标识和保存在模板中,质量差的登记模板称为Biosdk 1:1低速比对特征模版,这里的1:1和1:1控件中的1:1是两个概念,不要混淆;质量好的登记模板称为Biosdk 高速比对特征模版。

在一般的应用环境中,大约有5%的登记指纹模板会被标识为低速比对特征模板,可以用方法IsOneToOneTemplate判断是否是低速比对特征模版,用方法ModifyTemplate可以人为强行改变质量的好坏分类标识。

由于Biosdk 1:1低速比对速度比较慢(在PII 233大约30ms),所以使用方法AddRegTemplateToFPCache 加入到高速缓冲空间中的低速比对特征模版不能太多,否则影响比对速度。

在1:N控件中,使用IdentificationInFPCacheDB进行指纹识别的流程如下图:

IdentificationFromFileInFPCacheDB (fpcHandle As Long, pVerTemplateFile As String,

Byval Score As Long, Byval ProcessedFPNumber As Long) As Long

比对模板 模板分类

根据分类查找高速缓冲中指纹

比对指纹

比对分数>=Threshold

比对分数>=3

全部比对

可疑指纹最高分>=Score

保存到

可疑指纹

列表

对可疑指纹1:1低速比对

比对结果

FALSE

全部比对

TRUE

对高速缓冲中低速指纹1:1比对

比对结果

FALSE

全部比对

TRUE

识别失败

返回结果

识别成功

3.8 连接多个指纹仪

窗口中一个控件对应一个指纹仪,使用SensorIndex设置不同指纹仪,指纹仪个数通过属性SensorCount得到,如果需要区分各个指纹仪,使用属性SensorSN,每个指纹仪的SensorSN是唯一的。

3.9 模板操作的文件/字符串/变体变量方法

为了在不同开发语言中,方便操作模板的登记,比对等,可以选择文件方式、字符串和变体变量等三种方式进行。

以下分别列出,请参考:

模板Variant和String之间的转换

EncodeTemplate, EncodeTemplate1 : Variant -> String

DecodeTemplate, DecodeTemplate1 : String -> Variant

添加模板到高速缓冲区

AddRegTemplateToFPCacheDB Variant

AddRegTemplateStrToFPCacheDB String

AddRegTemplateFileToFPCacheDB File

在高速缓冲识别指纹

IdentificationFromInFPCacheDB Variant

IdentificationFromStrInFPCacheDB String

IdentificationFromFileCacheDB File

1:1比对模板

VerFinger Variant

VerFingerFromStr String

VerFingerFromFile File

4、DEMO程序说明

以下使用1:N控件的VB例子程序进行说明(1:1控件使用基本相似)。

首先确认已经注册1:N控件,已经安装指纹仪驱动程序。

运行VB 的Demo显示如下界面:

窗口指纹控件名称为ZKFPEngX1。

首先,点击《初始化》按钮初始化指纹仪,如果成功会显示成功的提示信息。

初始化代码如下:

If gine = 0 Then

MessageBox 0, "初始化成功!", "提示信息", 0

n = "指纹仪连接"

= Count & ""

= Index & ""

= SN

d = False

FMatchType = 0

End If

点击《登记指纹》按钮进入指纹登记状态,代码如下:

If Trim() = "" Then

MessageBox 0, "请输入指纹名称标识!", "错误", 0

Exit Sub

End If

nroll

n = "开始登记"

此时指纹仪会处于登记状态,每次按压指纹会触发OnImageReceived(显示图像),OnFeatureInfo(判断指纹质量是否合格)事件。按压1-4有效次数手指(指纹质量不合格的不算次数),会触发OnEnroll,OnEnrollToFile事件,具体按压次数由属性EnrollCount设置。OnEnroll代码如下:

Dim i As Long

If Not ActionResult Then

MessageBox 0, "指纹登记失败!", "警告", 0

Else

MessageBox 0, "指纹登记成功!", "信息", 0

FRegTemplate = ATemplate

mplate "c:", ATemplate

TemplateFileToFPCacheDB fpcHandle, FingerCount,

"c:"

ReDim Preserve FFingerNames(FingerCount + 1)

FFingerNames(FingerCount) =

FingerCount = FingerCount + 1

End If

参数ActionResult=True代表登记成功,参数Atemplate为指纹登记模板,否则登记失败。

点击《比对指纹》按钮进入指纹比对状态,指纹仪会处于验证状态,按手指

会触发触发OnImageReceived(显示图像),OnFeatureInfo(判断指纹质量是否合格)事件,如果指纹质量合格会触发OnCapture,OnCaptureToFile(调用比对方法进行比对)事件。

OnCapture代码如下:

Dim fi As Long, i As Long

Dim Score As Long, ProcessNum As Long

Dim RegChanged As Boolean

n = "取得指纹特征"

If FMatchType = 1 Then '1:1

If ger(FRegTemplate, ATemplate, False, RegChanged)

Then

MessageBox 0, "指纹比对成功!", "信息提示", 0

Else

MessageBox 0, "指纹比对失败!", "信息提示", 0

End If

'If FingerFile("c:", ATemplate) Then

' MessageBox 0, "文件指纹比对成功!", "信息提示", 0

'Else

' MessageBox 0, "文件指纹比对失败!", "信息提示", 0

'End If

ElseIf FMatchType = 2 Then '1:N

Score = 8

fi = ficationInFPCacheDB(fpcHandle, ATemplate, Score,

ProcessNum)

If fi = -1 Then

MessageBox 0, "指纹比对失败!", "信息提示", 0

Else

MessageBox 0, "指纹比对成功!Name=" & FFingerNames(fi) & "

Score = " & Score & " Processed Number = " & ProcessNum, "信息提示", 0

End If

End If

OnImageReceived事件代码(显示指纹图像):

mageAt hDC, + 6,

, idth, eight

OnFeatureInfo事件代码(判断指纹质量):

Dim sTemp As String

sTemp = ""

If ster Then

sTemp = "登记状态: 还需要按压" & Index & "次手指!"

End If

sTemp = sTemp & " 指纹质量"

If AQuality <> 0 Then

sTemp = sTemp & "不合格: " & AQuality

Else

sTemp = sTemp & "合格"

End If

n = sTemp