FingerPrintf:一个用于快速使用生物特征API、指纹和摄像头的轻量级库






4.86/5 (20投票s)
使用您的传感器进行识别和验证
引言
生物特征API有点令人困惑。为什么不创建一个单一的类来让你使用它呢?
此演示允许应用程序使用任何可用的生物特征传感器。
fingerprintf.hpp是你需要在自己的项目中包含的全部内容。该仓库包含一个开箱即用的解决方案。
使用系统数据库的指纹读取器
FINGERPRINTF fp;
// Enumerate all
fp.Enun();
// Pick the fingerprint
for (size_t i = 0 ; i < fp.GetUnits().size() ; i++)
{
auto& u = fp.GetUnits()[i];
if (u.BiometricFactor == WINBIO_TYPE_FINGERPRINT)
{
fp.SetType(u.BiometricFactor);
fp.Open(i);
break;
}
}
这将使用系统数据库(Windows设置中已注册的指纹)打开指纹读取器。
让用户触摸设备
WINBIO_UNIT_ID u = 0;
auto hr = fp.Locate(u); // Accepts a WINBIO_UNIT_ID& and, on success,
// returns the ID of the device touched.
执行身份识别
AddMessage( L"Please swipe your finger");
auto ide = fp.Identify(Unit);
if (FAILED(std::get<0>(ide)))
{
auto str = ConvertRejectDetailToString(std::get<1>(ide));
}
else
{
LastID = std::get<3>(ide);
LastSub = std::get<2>(ide);
auto str = displayIdentity(&std::get<3>(ide), std::get<2>(ide));
}
如果成功,你将获得一个WINBIO_IDENTITY
结构,在这种情况下,它包含一个SID
。
要将指纹与已知的指纹进行验证,例如,上次的身份识别
auto e = fp.Verify(LastID, LastSub);
if (FAILED(std::get<0>(e)))
{
auto str = ConvertRejectDetailToString(std::get<1>(e));
}
else
{
// OK
}
}
以异步模式使用库
fp.SetAsync(1);
这一次,当你调用fp.Open()
时,你传递一个HWND
和一个消息,该消息将在发生某些事情时发布。此消息包含一个 WINBIO_ASYNC_RESULT 作为lParam
,你可以测试返回值。
使用私有数据库
如果你愿意,你可以安装一个私有数据库。文件存储在C:\windows\system32\WinBioDatabase中,并且你必须以管理员身份注册数据库
fp.Register(Unit);
使用你想要注册的单元的索引。这还会重启Windows生物特征服务,使数据库可见。你可以使用Unregister()
方法来删除注册。
将指纹注册到该私有
数据库
UCHAR s = 0;
if (LW == 230)
s = WINBIO_ANSI_381_POS_RH_THUMB;
if (LW == 231)
s = WINBIO_ANSI_381_POS_RH_INDEX_FINGER;
if (LW == 232)
s = WINBIO_ANSI_381_POS_RH_MIDDLE_FINGER;
if (LW == 233)
s = WINBIO_ANSI_381_POS_RH_RING_FINGER;
if (LW == 234)
s = WINBIO_ANSI_381_POS_RH_LITTLE_FINGER;
if (LW == 235)
s = WINBIO_ANSI_381_POS_LH_THUMB;
if (LW == 236)
s = WINBIO_ANSI_381_POS_LH_INDEX_FINGER;
if (LW == 237)
s = WINBIO_ANSI_381_POS_LH_MIDDLE_FINGER;
if (LW == 238)
s = WINBIO_ANSI_381_POS_LH_RING_FINGER;
if (LW == 239)
s = WINBIO_ANSI_381_POS_LH_LITTLE_FINGER;
auto cb = [](SIZE_T, HRESULT hrt, WINBIO_REJECT_DETAIL) -> HRESULT
{
if (FAILED(hrt))
return hrt;
if (SUCCEEDED(hr))
AddMessage(L"Sample captured");
if (hrt == WINBIO_I_MORE_DATA)
AddMessage( L"More data required. Please reswipe");
return hrt;
};
AddMessage( L"Please swipe your finger");
auto enr = fp.Enroll(false,s,Unit,cb);
if (fp.IsAsync())
return 0;
if (FAILED(std::get<0>(enr)))
{
AddMessage( L"Enroll failed");
auto str = ConvertRejectDetailToString(std::get<1>(enr));
AddMessage( str);
}
else
{
AddMessage( L"Enroll completed");
auto str = displayIdentity(&std::get<3>(enr),s);
LastID = std::get<3>(enr);
LastSub = s;
AddMessage( str.c_str());
}
使用摄像头
文档说明仅支持指纹,但摄像头也可以工作。使用WINBIO_TYPE_FACIAL_FEATURES
打开库会自动设置异步模式,并且只能与系统数据库一起使用(你无法自己创建数据库)。打开设备后,库会自动调用WinBioMonitorPresence。
你必须有一个兼容Windows-hello
的网络摄像头。
摄像头会发布包含WINBIO_OPERATION_MONITOR_PRESENCE
结构的WINBIO_ASYNC_RESULT
结构,该结构来自WINBIO_PRESENCE。该结构包含来自摄像头的的信息。当ChangeType
是WINBIO_PRESENCE_CHANGE_TYPE_RECOGNIZE
时,你将获得一个包含SID
的数组。
无法对摄像头调用其他函数(Identify
、Verify
、Enroll
等)。
使用其他传感器
在我的系统中,有一个“语音”生物特征传感器,但我尚未能够使用它。敬请关注!
历史
- 2023年6月19日:增强了库,添加了面部识别功能
- 2018年1月3日:添加了使用系统数据库的选项
- 2016年11月21日:首次发布