fingerPrint-指纹(生物)识别-C++/C#实现Windows

本文档介绍了如何在Windows环境中使用C++/C#实现指纹识别功能,包括调用Windows自带的API接口winbio.h,详细解析了winBioEnumBiometricUnits、WinBioOpenSession、WinBioLocateSensor、WinBioEnrollBegin、WinBioEnrollCapture等关键接口的用法,以及指纹录入和识别的过程。同时,提到了使用默认数据库可能遇到的问题,如指纹与系统解锁关联等。

一、背景

        自己想做一个c#实现的指纹识别登录的功能,发现相关内容有点少,要没就是调用收费的sdk的。要么就是内容不全的。 

二、调用SDK

        C#有个zkFinger的指纹识别sdk提供,不过是收费的好像。Windows有专用的API接口,在winbio.h下,可以直接搜索到。不过是英文的,机翻怪难懂的。今天主要讲解下相关的一些接口以及参数的作用。

三、接口及参数

          首先,相关接口信息在这边:winBioIdentify 函数 (winbio.h) - Win32 apps | Microsoft Learn      。官网也有将使用的代码放在函数下面,可以直接copy。讲一下指纹识别要用的几个接口函数。

首先是指纹传感器的,winBioEnumBiometricUnits这个接口

HRESULT WinBioEnumBiometricUnits(
  [in]  WINBIO_BIOMETRIC_TYPE Factor,
  [out] WINBIO_UNIT_SCHEMA    **UnitSchemaArray,
  [out] SIZE_T                *UnitCount
);

里面有三个参数,第一个参数Factor是传的生物识别类型,如面部或者指纹,不过文档说目前只支持指纹的,所以填WINBIO_TYPE_FINGERPRINT。然后会返回传感器的数组数量。这个可以用来判断是否支持指纹识别

        这是相关的一些参数,下面有用到

HRESULT hr = S_OK;
WINBIO_IDENTITY identity = {0};
WINBIO_SESSION_HANDLE sessionHandle = NULL;
WINBIO_UNIT_ID unitId = 0;
WINBIO_REJECT_DETAIL rejectDetail = 0;
BOOLEAN isNewTemplate = TRUE;

        然后就是注册功能相关的。首先。你需要用WinBioOpenSession打开一个生物识别的会话,这个会话在后续登录也同样要先打开,才能使用。

HRESULT WinBioOpenSession(
  [in]  WINBIO_BIOMETRIC_TYPE Factor,
  [in]  WINBIO_POOL_TYPE      PoolType,
  [in]  WINBIO_SESSION_FLAGS  Flags,
  [in]  WINBIO_UNIT_ID        *UnitArray,
  [in]  SIZE_T                UnitCount,
  [in]  GUID                  *DatabaseId,
  [out] WINBIO_SESSION_HANDLE *SessionHandle
);

        这个基本照官方的去创建就行,解释在代码里面

hr = WinBioOpenSession( 
            WINBIO_TYPE_FINGERPRINT,    // 生物识别类型
            WINBIO_POOL_SYSTEM,         // 生物单元池
            WINBIO_FLAG_DEFAULT,        // Configuration and access
            NULL,                       // Array of biometric unit IDs
            0,                          // Count of biometric unit IDs
            NULL,                       // 数据库id,NULL好像是Default
            &sessionHandle              // [out] 会话
            );

        创建完之后要定位传感器,通过WinBioLocateSensor去调用,调用后要你去触摸下指纹录入器触发。

hr = WinBioLocateSensor( sessionHandle, &unitId);

        后面就是捕获指纹了。要通过两个函数WinBioEnrollBeginWinBioEnrollCapture。第一个是告知系统开始执行录入,第二个是不断去捕获,多次捕获之后失败即丢弃,成功则成功。此时只是形成模板,还需要录入数据库。

hr = WinBioEnrollBegin(
            sessionHandle,      // 处理会话
            subFactor,          // 指纹类型
            unitId              // 生物单元id
            );
if (FAILED(hr)) {}

// 开始捕捉
for (int swipeCount = 1;; ++swipeCount)
{
    hr = WinBioEnrollCapture(
           sessionHandle,  // Handle to open biometric session
           &rejectDetail   // [out] Failure information
           );

    if (hr == WINBIO_I_MORE_DATA)
    {
         // 请继续按压
         continue;
    }
    if (FAILED(hr))
    {
        if (hr == WINBIO_E_BAD_CAPTURE)
        {
            // 这次数据不太好,请继续按压
            continue;
        }
        else
        {
            // 捕捉失败
            break;
        }
    }
    else
    {
        // 捕捉完成
        break;
    }
}

        录入数据库的时候,你如果一开始是用的默认数据库,那么要注意了,他会和你windows系统的数据库关联,即你在该程序下录入的指纹,也可以解锁系统。具体我也不知道怎么解决。并且不能录入相同的指纹。录入的函数是WinBioEnrollCommit

hr = WinBioEnrollCommit( 
                sessionHandle,      // Handle to open biometric session
                &identity,          // WINBIO_IDENTITY object for the user
                &isNewTemplate);    // Is this a new template

丢弃模板的函数是  WinBioEnrollDiscard

hr = WinBioEnrollDiscard( sessionHandle );

        后续就是识别了,主要是用winbioIdentify。注意要先opensession

hr = WinBioIdentify( 
            sessionHandle,              // Session handle
            &unitId,                    // Biometric unit ID
            &identity,                  // User SID
            &subFactor,                 // Finger sub factor
            &rejectDetail               // Rejection information
            );

初稿,写着玩。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值