sgcBiometrics 五分钟上手

通过 Windows Biometric Framework,在 Delphi 中实现 Windows Hello 和指纹身份验证。本页启动传感器,验证站在它面前的用户,并识别他们是谁。传感器初始化之后,只需两次方法调用。

Windows Hello 面部识别和指纹识别
仅限 Windows,通过 winbio.dll
一个构建,没有功能层级

第一次检查所需的内容

一个组件,一次调用启动传感器,一次调用提出问题。无需事先配置任何东西。

面部

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 面部登录,组件所需的条件就已具备。

安装并找到组件面板页

请先编译运行时包,再安装设计时包,因为后者引用前者。

1. 解压

将下载文件解压到一个文件夹,下文称之为 {$DIR}。

2. 库路径

依次选择 Tools、Options、Environment Options、Directories。添加 {$DIR}\source,它适用于每个 RAD Studio 版本。

3. 添加 lib 文件夹

同时添加特定版本的文件夹,例如 RAD Studio 13 使用 {$DIR}\libD13\$(Platform),一直到最旧的编译器使用不带平台后缀的 {$DIR}\libD7。

4. 仅限 C++Builder

还要把 lib 文件夹放到 System Include 路径上,并把存放 .bpi 文件的 dcp\$(Platform) 文件夹放到库路径上。

5. 构建包

针对您的 IDE 版本打开 Packages\sgcBiometricsD13.groupproj。先编译 sgcBiometricsD13.dpk,再安装 dclsgcBiometricsD13.dpk。会出现一个名为 SGC Biometrics 的页面,其中包含四个组件。

验证用户,大约十行代码

启动传感器,然后提出两个问题之一:这是不是预期的那个人,或者这个人是谁?两者都直接返回答案。

FFacial.pas
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。

FFacial.pas
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 形式返回账户标识符,没有识别出任何人时为空。两者都接受一个默认为十秒的可选超时。

FFacial.pas
// 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

返回被识别者的账户标识符,没有识别出任何人时返回空字符串。当您需要知道是谁,而不只是知道是否匹配时,请使用它。

OnError

procedure(Sender: TObject; const aError: string; const aCode: Integer = 0)。该代码是 Windows Biometric Framework 的错误代码,当仅凭消息还不够时,您就需要它。

第一次通常会出什么问题

六个问题几乎涵盖了所有第一次尝试的情况。

什么都没有发生,也没有出现错误

传感器会话从未打开。InitializeSensors 返回一个 Boolean,演示在做任何其他事情之前会先检查它。SessionIsOpen 会告诉您会话是否已经存在,这样您就不会再打开第二个。

调用阻塞了用户界面

验证会等待传感器前的人,超时默认为十秒。请传入更短的超时,或者设置 Asynchronous,改用事件来驱动结果。

您在寻找 OnCapture 事件

没有该名称的事件。捕获事件是 OnCaptureSample,并且还有一个配套的 OnCaptureSampleReject,用于传感器拒绝的样本。

事件签名不匹配

这些事件携带 Windows Biometric Framework 的结构,因此参数比您预期的要多。OnVerify 有六个参数,包括身份、子因素和拒绝详情。请让 IDE 生成处理程序,而不要手动输入。

在其他平台上无法编译

无法编译。每个 WinBio 单元都被包裹在 {$IFDEF SGC_WINBIO} 中,而它只在 Windows 编译器块中定义,因此在 Windows 之外,这些单元不包含任何类型。这是一个 Windows 库。

私有池需要管理员权限

使用您自己的模板数据库而不是系统池,是一项特权操作,指纹演示正是因此为它设置了单独的选项卡。

第一次检查之后

四个方向,都在同一个库内。

注册您自己的用户

指纹组件带有完整的注册周期:开始、反复捕获,然后提交。事件会报告刮擦次数以及模板是否为新建。

sgcBiometrics 功能

维护您自己的模板数据库

存储和用户组件实现了私有池,因此模板保存在您自己的文件中,而不是 Windows 系统池中。当同一个身份需要在您控制的多台机器上通用时,这正是您想要的。

sgcBiometrics 功能

监测在场情况,而不仅仅是提示

面部组件可以持续监测谁在摄像头前,在有人到来、被识别或离开时触发事件。这样您就能在操作员走开的那一刻锁定屏幕。

sgcBiometrics 功能

枚举机器上有什么

在提示任何人之前,您可以列出生物识别单元、数据库和现有的注册信息,从而把一个毫无帮助的失败变成关于缺少硬件的明确消息。

版本与打包

参考、演示和文档

下载包内附带两个演示项目,一个用于面部,一个用于指纹。

sgcBiometrics 功能 指纹组件和面部组件各自公开的内容。
版本与打包 产品如何授权,以及每个包包含什么。
产品概览 sgcBiometrics 的用途,以及它适用的场景。
下载试用版 与正式版相同的安装程序,有时间限制。
联系支持 来自编写代码的开发人员的直接电子邮件支持。
所有产品 所有 eSeGeCe 库的价格汇总在一张表中。

sgcBiometrics 仅适用于 Delphi 和 C++Builder,没有 .NET 对应版本。每个产品都有自己的快速入门,列在入门页面上。

sgcBiometrics 快速入门常见问题

Windows Hello 面部识别使用 TsgcWinBioFacial。指纹使用 TsgcWinBioFingerPrint。两者都声明在 sgcBiometrics.pas 中,都位于 SGC Biometrics 组件面板页上,同一页上还有 TsgcWinBioStorageFile 和 TsgcWinBioUsersINI,只有私有池存储才需要后两者。因此一共是四个组件,而不是一个。
在面部组件上,FacialRecognize 返回一个 Boolean,当摄像头前的人匹配成功时为 true。FacialIdentify 返回一个 string,即被识别者的账户标识符,没有识别出任何人时为空字符串。两者都接受一个默认为十秒的可选超时,并且都需要传感器会话,会话通过 InitializeSensors 打开。
不能。每个 WinBio 单元都把它的整个接口和实现部分包裹在 {$IFDEF SGC_WINBIO} 中,该定义只出现在产品自己的 sgcVer.inc 的 Windows 编译器块中,并且每个单元的 uses 子句中都有 Windows。没有该定义时,这些单元完全不包含任何类型。sgcBiometrics 是一个 Windows 库。
不是,它是经典的 Win32 Windows Biometric Framework。库动态加载 winbio.dll 并直接调用它。这有两点意义:不存在由 WinRT 绑定带来的较新 RAD Studio 最低版本要求,并且 API 接口是 Microsoft 记录为 Windows Biometric Framework 的那一套,而不是 WinRT 的那一套。
Delphi 7,以及 Delphi 2007 到 RAD Studio 13,外加相应的 C++Builder 版本。从 Delphi 7 起,每个编译器版本块都定义了 SGC_WINBIO,只有一个例外:Delphi 2006 块只定义了其版本标记,而没有 SGC_WINBIO,因此在这一个编译器上,该产品编译后什么都没有。
代码中没有版本之分。产品的 sgcVer.inc 是一张编译器版本映射表,完全没有 SGC_EDT_* 定义,也没有任何内容按层级限制,因此每个构建都包含每个组件。价格页面上出现的任何层级都只是商业打包方式,而不是不同的库。
不止三个。面部组件发布了十二个,指纹组件发布了十八个。它们携带 Windows Biometric Framework 的结构,因此参数列表比典型的 Delphi 事件更长:OnVerify 有六个参数,OnIdentify 有四个,OnError 有三个。请让 IDE 生成处理程序。请注意没有 OnCapture;捕获事件是 OnCaptureSample。
您需要一个 Windows 已经能识别的生物识别传感器,实际上就是 Windows Hello 在“设置”应用中能够工作。针对系统池进行验证不需要提升权限。使用私有池(即通过 TsgcWinBioStorageFile 维护您自己的模板数据库)则确实需要管理员权限,随包附带的指纹演示正是因此把它分到了单独的选项卡中。
超值之选:All-AccesseSeGeCe 全部产品,含高级支持,每年 €1,059 起。
查看 All-Access 价格

准备好在您的应用中加入 Windows Hello 了吗?

下载试用版,并在已经设置好 Hello 的机器上运行面部演示。