/// <summary> /// 红外活体检测 /// </summary> /// <param name="pEngine">引擎Handle</param> /// <param name="imageInfo">图像数据</param> /// <param name="singleFaceInfo">单人脸信息</param> /// <returns>活体检测结果</returns> public static LivenessInfo LivenessInfo_IR(FaceEngine faceEngine, Image image, SingleFaceInfo singleFaceInfo, out int retCode) { LivenessInfo livenessInfo = new LivenessInfo(); retCode = -1; try { MultiFaceInfo multiFaceInfo = new MultiFaceInfo(); multiFaceInfo.faceNum = 1; multiFaceInfo.faceOrients = new int[1]; multiFaceInfo.faceOrients[0] = singleFaceInfo.faceOrient; multiFaceInfo.faceRects = new MRECT[1]; multiFaceInfo.faceRects[0] = singleFaceInfo.faceRect; multiFaceInfo.faceDataInfoList = new FaceDataInfo[1]; multiFaceInfo.faceDataInfoList[0] = singleFaceInfo.faceDataInfo; //人脸信息处理 retCode = faceEngine.ASFProcessEx_IR(image, multiFaceInfo, FaceEngineMask.ASF_IR_LIVENESS); if (retCode == 0) { //获取IR活体检测结果 retCode = faceEngine.ASFGetLivenessScore_IR(out livenessInfo); } } catch (Exception ex) { LogUtil.LogInfo(typeof(FaceUtil), ex); } return(livenessInfo); }
/// <summary> /// 获取IR活体结果 /// </summary> /// <param name="livenessInfo">IR活体结果</param> /// <returns>返回0表示正常;返回负数请根据ErrorCodeUtil类注释查看;其他值请在官网-帮助中心查询</returns> public int ASFGetLivenessScore_IR(out LivenessInfo livenessInfo) { int retCode = -1; livenessInfo = new LivenessInfo(); IntPtr pLiveness = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASF_LivenessInfo>()); //调用SDK接口 retCode = ASFFunctions.ASFGetLivenessScore_IR(pEngine, pLiveness); if (retCode != 0) { MemoryUtil.Free(pLiveness); return(retCode); } //转化结果 ASF_LivenessInfo asfLivenessInfo = new ASF_LivenessInfo(); asfLivenessInfo = MemoryUtil.PtrToStructure <ASF_LivenessInfo>(pLiveness); livenessInfo.num = asfLivenessInfo.num; if (asfLivenessInfo.num > 0) { livenessInfo.isLive = new int[asfLivenessInfo.num]; Marshal.Copy(asfLivenessInfo.isLive, livenessInfo.isLive, 0, asfLivenessInfo.num); } MemoryUtil.FreeArray(pLiveness); return(retCode); }
/// <summary> /// 判断是否为活体 /// </summary> /// <param name="idCardEngine">引擎</param> /// <param name="faceRes">人脸信息</param> /// <param name="bitmapRgb">RGB摄像头图片</param> /// <param name="bitmapIr">IR摄像头图片</param> /// <param name="livennessResultStr">活体检测字符串</param> /// <returns></returns> public static bool IsLiveness(IdCardEngine idCardEngine, FaceRes faceRes, Bitmap bitmapRgb, Bitmap bitmapIr, ref string livennessResultStr) { bool retRgb = false; bool retIr = false; StringBuilder builder = new StringBuilder(); if (faceRes.nFace > 0) { //判断RGB活体 if (bitmapRgb != null && idCardEngine.ArcSoft_FIC_Process(bitmapRgb, faceRes).Equals(0)) { LivenessInfo liveness = null; idCardEngine.ArcSoft_FIC_GetLivenessInfo(out liveness); retRgb = liveness.isLive.Equals(1); builder.AppendFormat(",RGB:{0}", TransLivenessResult(liveness.isLive)); } //判断IR活体 if (bitmapIr != null && idCardEngine.ArcSoft_FIC_Process_IR(bitmapIr, faceRes).Equals(0)) { LivenessInfo livenessIR = null; idCardEngine.ArcSoft_FIC_GetLivenessInfo_IR(out livenessIR); retIr = livenessIR.isLive.Equals(1); builder.AppendFormat(",IR:{0}", TransLivenessResult(livenessIR.isLive)); } } livennessResultStr = builder.ToString(); return(retRgb && (retIr || bitmapIr == null)); }
/// <summary> /// 获取IR活体结果 /// </summary> /// <param name="livenessInfo">IR活体结果</param> /// <returns>接口返回码,返回0表示正常,返回其他值请在开发者中心-帮助中心查询</returns> public int ArcSoft_FIC_GetLivenessInfo_IR(out LivenessInfo livenessInfo) { livenessInfo = new LivenessInfo(); int retCode = -1; IntPtr plivenessInfo = MemoryUtil.Malloc(MemoryUtil.SizeOf <AFICFSDKLivenessInfo>()); //调用SDK retCode = FICFunctions.ArcSoft_FIC_GetLivenessInfo_IR(pEngine, plivenessInfo); if (!retCode.Equals(0)) { MemoryUtil.Free(plivenessInfo); return(retCode); } AFICFSDKLivenessInfo slivenessInfo = MemoryUtil.PtrToStruct <AFICFSDKLivenessInfo>(plivenessInfo); livenessInfo.isLive = MemoryUtil.PtrToStruct <int>(slivenessInfo.isLive); livenessInfo.num = slivenessInfo.num; MemoryUtil.Free(plivenessInfo); return(retCode); }