Esempio n. 1
0
        /// <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);
        }
Esempio n. 3
0
        /// <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);
        }