65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (20投票s)

2016年11月20日

CPOL

2分钟阅读

viewsIcon

34599

downloadIcon

703

使用您的传感器进行识别和验证

引言

生物特征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。该结构包含来自摄像头的的信息。当ChangeTypeWINBIO_PRESENCE_CHANGE_TYPE_RECOGNIZE时,你将获得一个包含SID的数组。

无法对摄像头调用其他函数(IdentifyVerifyEnroll等)。

使用其他传感器

在我的系统中,有一个“语音”生物特征传感器,但我尚未能够使用它。敬请关注!

历史

  • 2023年6月19日:增强了库,添加了面部识别功能
  • 2018年1月3日:添加了使用系统数据库的选项
  • 2016年11月21日:首次发布
© . All rights reserved.