让虹软人证核验SDK支持活体检测(C#)

虹软开放平台提供的免费SDK很香,只是人证核验的版本仅为2.0,从2.1开始才有RGB活体检测,我又不希望工程里要包含两套功能重复的SDK,于是开始了歪门邪道。

分析SDK

分别下载2.0版本人证SDK与2.1版本人脸SDK,对比差异。
上2.1,下2.1
可以看到人证SDK只比一般的SDK多一个dll文件,大胆猜测这个dll只是对算法加了一层封装,于是尝试将项目中原来的libarcsoft_face.dlllibarcsoft_face_engine.dll替换为2.1版本,然后遇到了无法激活的问题,把SDK_KEY替换为2.1版本后解决,自此这个缝合的SDK拥有了完整的功能。

导出接口

这个步骤费了我很多精力,之前没有接触过C#与C混合编程,调接口属实痛苦。还好虹软官方给出了人证SDK接口的C#实现,参照这个实现,我导出了如下几个接口

class ASFaceFunctions
{
    public const string Dll_PATH = "libarcsoft_face_engine.dll";
    public const int ASF_LIVENESS = 0x00000080; //检测活体

    //检测时候 Orientation 优先级别
    public enum OrientPriority
    {
        ASF_OP_0_ONLY = 0x1,            // 0, 0, ...
        ASF_OP_90_ONLY = 0x2,           // 90, 90, ...
        ASF_OP_270_ONLY = 0x3,          // 270, 270, ...
        ASF_OP_180_ONLY = 0x4,          // 180, 180, ...
        ASF_OP_0_HIGHER_EXT = 0x5,      // 0, 90, 270, 180, 0, 90, 270, 180, ...
    };

    /// <summary>
    /// 激活
    /// </summary>
    /// <param name="appId">APPID</param>
    /// <param name="sdkKey">SDKKEY</param>
    /// <returns>激活结果</returns>
    [DllImport(Dll_PATH, CallingConvention = CallingConvention.Cdecl)]
    public static extern int ASFActivation(string appId, string sdkKey);


    /// <summary>
    /// 初始化人脸检测引擎
    /// </summary>
    /// <param name="detectMode">0:视频模式;-1:照片模式</param>
    /// <param name="priority">角度优先度</param>
    /// <param name="detectFaceScaleVal">用于数值化表示的最小人脸尺寸,推荐值16</param>
    /// <param name="detectFaceMaxNum">最大需要检测的人脸个数</param>
    /// <param name="combinedMask">用户选择需要检测的功能组合,可单个或多个</param>
    /// <param name="pEngine">返回引擎handle</param>
    /// <returns>初始化结果</returns>
    [DllImport(Dll_PATH, CallingConvention = CallingConvention.Cdecl)]
    public static extern int ASFInitEngine(
        uint detectMode, 
        int priority, 
        int detectFaceScaleVal,
        int detectFaceMaxNum,
        int combinedMask,
        out IntPtr pEngine
        );


    [DllImport(Dll_PATH, CallingConvention = CallingConvention.Cdecl)]
    public static extern int ASFProcess(
        IntPtr pEngine, 
        int width, 
        int height, 
        int format, 
        IntPtr imgData, 
        ref ASF_MultiFaceInfo detectFaces,
        int combineMask
        );

    /// <summary>
    /// 活体检测函数
    /// </summary>
    /// <param name="appId">SDK对应的AppID</param>
    /// <param name="sdkKey">SDK对应的SDKKey</param>
    /// <returns>调用结果</returns>
    [DllImport(Dll_PATH, CallingConvention = CallingConvention.Cdecl)]
    public static extern int ASFGetLivenessScore(IntPtr pEngine, out ASF_LivenessInfo info);
}

用到的结构体

    /// <summary>
    /// 多人脸信息
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    struct ASF_MultiFaceInfo
    {
        //人脸框
        public IntPtr faceRect;  //官方代码包含的单人脸框结构体的定义,用Marshall类转换为指针
        //角度
        public IntPtr faceOrient;//整数数组
        //数量
        public int faceNum;
    }

接口的详细描述请看官方给的头文件和文档,我给的实现只能说能用。
注意人证引擎和人脸引擎要分别初始化,人证引擎并未开启相关功能。

最终效果如下图

posted @ 2020-08-07 15:05  Melodic  阅读(748)  评论(0编辑  收藏  举报