让虹软人证核验SDK支持活体检测(C#)
虹软开放平台提供的免费SDK很香,只是人证核验的版本仅为2.0,从2.1开始才有RGB活体检测,我又不希望工程里要包含两套功能重复的SDK,于是开始了歪门邪道。
分析SDK
分别下载2.0版本人证SDK与2.1版本人脸SDK,对比差异。
可以看到人证SDK只比一般的SDK多一个dll文件,大胆猜测这个dll只是对算法加了一层封装,于是尝试将项目中原来的libarcsoft_face.dll
、libarcsoft_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;
}
接口的详细描述请看官方给的头文件和文档,我给的实现只能说能用。
注意人证引擎和人脸引擎要分别初始化,人证引擎并未开启相关功能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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语句:使用策略模式优化代码结构