sgcBiometrics 五分钟上手
通过 Windows Biometric Framework,在 Delphi 中实现 Windows Hello 和指纹身份验证。本页启动传感器,验证站在它面前的用户,并识别他们是谁。传感器初始化之后,只需两次方法调用。
通过 Windows Biometric Framework,在 Delphi 中实现 Windows Hello 和指纹身份验证。本页启动传感器,验证站在它面前的用户,并识别他们是谁。传感器初始化之后,只需两次方法调用。
一个组件,一次调用启动传感器,一次调用提出问题。无需事先配置任何东西。
SGC Biometrics 组件面板页上的 TsgcWinBioFacial,声明在 sgcBiometrics.pas 中。这是 Windows Hello 面部识别组件。
TsgcWinBioFingerPrint,位于同一个单元和同一个组件面板页。API 的形式相同,另外还提供注册和模板管理功能。
TsgcWinBioStorageFile 和 TsgcWinBioUsersINI,用于私有池存储,适合您自己维护模板数据库而不使用系统池的情况。
仅限 Windows。库在运行时加载 winbio.dll,并且每个单元都被包裹在 {$IFDEF SGC_WINBIO} 中,因此在任何其他目标上,这些单元编译后什么都没有。
sgcBiometrics 没有功能层级,因此这张表讲的是编译器和操作系统,而不是版本。
| 项目 | 值 |
|---|---|
| IDE | Delphi 7,以及 Delphi 2007 到 RAD Studio 13,外加相应的 C++Builder 版本。除 Delphi 2006 外,每个编译器版本块都定义了 SGC_WINBIO,而 Delphi 2006 只定义了其版本标记,因此在 Delphi 2006 上,该产品编译后什么都没有。 |
| uses 子句 | 演示中写的是 sgcBiometrics_WinBio_Types, sgcBiometrics, sgcBiometrics_WinBio_Storage, sgcBiometrics_WinBio_Storage_File, sgcBiometrics_Classes, sgcBiometrics_Client, sgcBiometrics_WinBio_Client, sgcBiometrics_WinBio_Client_Facial。如果只是简单的验证,需要的要少得多。 |
| 版本 | 没有版本之分。产品自己的 sgcVer.inc 只是一张编译器版本映射表,别无其他,任何地方都没有 SGC_EDT_* 定义。每个构建都包含每个组件。 |
| 使用哪个 Windows API | 经典的 Win32 Windows Biometric Framework,从 winbio.dll 动态加载。它不是 WinRT,因此不存在由 WinRT 绑定带来的较新 RAD Studio 最低版本要求。 |
| 平台 | 仅限 Windows。每个 WinBio 单元都把它的接口和实现部分包裹在 {$IFDEF SGC_WINBIO} 中,并且每个单元的 uses 子句中都有 Windows。没有该定义时,这些单元完全不包含任何类型。 |
| 硬件 | 一个 Windows 已经能识别的生物识别传感器。如果 Windows Hello 在“设置”应用中能够工作,组件就能找到同一个传感器。 |
面部组件使用的在场监测事件属于 API 的 Windows 10 世代。如果该机器上可以使用 Windows Hello 面部登录,组件所需的条件就已具备。
请先编译运行时包,再安装设计时包,因为后者引用前者。
将下载文件解压到一个文件夹,下文称之为 {$DIR}。
依次选择 Tools、Options、Environment Options、Directories。添加 {$DIR}\source,它适用于每个 RAD Studio 版本。
同时添加特定版本的文件夹,例如 RAD Studio 13 使用 {$DIR}\libD13\$(Platform),一直到最旧的编译器使用不带平台后缀的 {$DIR}\libD7。
还要把 lib 文件夹放到 System Include 路径上,并把存放 .bpi 文件的 dcp\$(Platform) 文件夹放到库路径上。
针对您的 IDE 版本打开 Packages\sgcBiometricsD13.groupproj。先编译 sgcBiometricsD13.dpk,再安装 dclsgcBiometricsD13.dpk。会出现一个名为 SGC Biometrics 的页面,其中包含四个组件。
启动传感器,然后提出两个问题之一:这是不是预期的那个人,或者这个人是谁?两者都直接返回答案。
uses
SysUtils, Classes,
// sgc
sgcBiometrics, sgcBiometrics_WinBio_Client,
sgcBiometrics_WinBio_Client_Facial;
procedure TFRMFacial.btnFacialRecognizeClick(Sender: TObject);
begin
if not Facial.SessionIsOpen then
begin
if Facial.InitializeSensors(10000) then
begin
if Facial.FacialRecognize then
DoLog('#Recognized');
end;
end
else
begin
if Facial.FacialRecognize then
DoLog('#Recognized');
end;
end;
InitializeSensors 返回一个 Boolean,并接受以毫秒为单位的超时。SessionIsOpen 可以避免您在已经有会话的传感器上再打开第二个会话。当摄像头前的人匹配成功时,FacialRecognize 返回 True。
procedure TFRMFacial.btnFacialIdentifyClick(Sender: TObject);
begin
if not Facial.SessionIsOpen then
begin
if Facial.InitializeSensors(10000) then
DoLog('#Identified: ' + Facial.FacialIdentify)
end
else
DoLog('#Identified: ' + Facial.FacialIdentify);
end;
这两个调用的区别在于所问的问题。FacialRecognize 问的是“这是不是预期的那个人”,并返回一个 Boolean。FacialIdentify 问的是“这个人是谁”,并以 string 形式返回账户标识符,没有识别出任何人时为空。两者都接受一个默认为十秒的可选超时。
// Three parameters, and the third has a default.
// There is no OnCapture: the capture event is OnCaptureSample.
procedure TFRMFacial.FacialError(Sender: TObject; const aError: string;
const aCode: Integer);
begin
DoLog('Error: ' + aError + ' [' + IntToStr(aCode) + ']');
end;
其他事件携带 Windows Biometric Framework 的结构,因此它们的参数列表比典型的 Delphi 事件更长。OnVerify 有六个参数,OnIdentify 有四个。请通过对象检查器生成它们,而不要手动输入。
这三个选项卡都来自随包附带的演示 Demos\Facial\FFacial.pas,其中保留了日志调用,因为您正是通过它们了解发生了什么。第二个演示 Demos\FingerPrint 涵盖注册、模板管理和私有传感器池。
这两个问题都直接返回一个值,因此您代码的第一个版本根本不需要任何事件处理程序。
InitializeSensors当某个传感器上成功打开了会话时返回 True。这里返回 False 表示没有可以通信的对象,之后的任何调用都不会成功。
FacialRecognize当此人匹配成功时返回 True。对于身份验证提示来说,这一个布尔值就是全部答案。
FacialIdentify返回被识别者的账户标识符,没有识别出任何人时返回空字符串。当您需要知道是谁,而不只是知道是否匹配时,请使用它。
OnErrorprocedure(Sender: TObject; const aError: string; const aCode: Integer = 0)。该代码是 Windows Biometric Framework 的错误代码,当仅凭消息还不够时,您就需要它。
六个问题几乎涵盖了所有第一次尝试的情况。
传感器会话从未打开。InitializeSensors 返回一个 Boolean,演示在做任何其他事情之前会先检查它。SessionIsOpen 会告诉您会话是否已经存在,这样您就不会再打开第二个。
验证会等待传感器前的人,超时默认为十秒。请传入更短的超时,或者设置 Asynchronous,改用事件来驱动结果。
没有该名称的事件。捕获事件是 OnCaptureSample,并且还有一个配套的 OnCaptureSampleReject,用于传感器拒绝的样本。
这些事件携带 Windows Biometric Framework 的结构,因此参数比您预期的要多。OnVerify 有六个参数,包括身份、子因素和拒绝详情。请让 IDE 生成处理程序,而不要手动输入。
无法编译。每个 WinBio 单元都被包裹在 {$IFDEF SGC_WINBIO} 中,而它只在 Windows 编译器块中定义,因此在 Windows 之外,这些单元不包含任何类型。这是一个 Windows 库。
使用您自己的模板数据库而不是系统池,是一项特权操作,指纹演示正是因此为它设置了单独的选项卡。
四个方向,都在同一个库内。
存储和用户组件实现了私有池,因此模板保存在您自己的文件中,而不是 Windows 系统池中。当同一个身份需要在您控制的多台机器上通用时,这正是您想要的。
下载包内附带两个演示项目,一个用于面部,一个用于指纹。
| sgcBiometrics 功能 指纹组件和面部组件各自公开的内容。 | 打开 | |
| 版本与打包 产品如何授权,以及每个包包含什么。 | 打开 | |
| 产品概览 sgcBiometrics 的用途,以及它适用的场景。 | 打开 | |
| 下载试用版 与正式版相同的安装程序,有时间限制。 | 打开 | |
| 联系支持 来自编写代码的开发人员的直接电子邮件支持。 | 打开 | |
| 所有产品 所有 eSeGeCe 库的价格汇总在一张表中。 | 打开 |
sgcBiometrics 仅适用于 Delphi 和 C++Builder,没有 .NET 对应版本。每个产品都有自己的快速入门,列在入门页面上。
TsgcWinBioFacial。指纹使用 TsgcWinBioFingerPrint。两者都声明在 sgcBiometrics.pas 中,都位于 SGC Biometrics 组件面板页上,同一页上还有 TsgcWinBioStorageFile 和 TsgcWinBioUsersINI,只有私有池存储才需要后两者。因此一共是四个组件,而不是一个。
FacialRecognize 返回一个 Boolean,当摄像头前的人匹配成功时为 true。FacialIdentify 返回一个 string,即被识别者的账户标识符,没有识别出任何人时为空字符串。两者都接受一个默认为十秒的可选超时,并且都需要传感器会话,会话通过 InitializeSensors 打开。
{$IFDEF SGC_WINBIO} 中,该定义只出现在产品自己的 sgcVer.inc 的 Windows 编译器块中,并且每个单元的 uses 子句中都有 Windows。没有该定义时,这些单元完全不包含任何类型。sgcBiometrics 是一个 Windows 库。
winbio.dll 并直接调用它。这有两点意义:不存在由 WinRT 绑定带来的较新 RAD Studio 最低版本要求,并且 API 接口是 Microsoft 记录为 Windows Biometric Framework 的那一套,而不是 WinRT 的那一套。
SGC_WINBIO,只有一个例外:Delphi 2006 块只定义了其版本标记,而没有 SGC_WINBIO,因此在这一个编译器上,该产品编译后什么都没有。
sgcVer.inc 是一张编译器版本映射表,完全没有 SGC_EDT_* 定义,也没有任何内容按层级限制,因此每个构建都包含每个组件。价格页面上出现的任何层级都只是商业打包方式,而不是不同的库。
OnVerify 有六个参数,OnIdentify 有四个,OnError 有三个。请让 IDE 生成处理程序。请注意没有 OnCapture;捕获事件是 OnCaptureSample。
TsgcWinBioStorageFile 维护您自己的模板数据库)则确实需要管理员权限,随包附带的指纹演示正是因此把它分到了单独的选项卡中。