让虹软人证核验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#实现,参照这个实现,我导出了如下几个接口

Copy
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); }

用到的结构体

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

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

最终效果如下图

posted @   Melodic  阅读(793)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示