Ejemplo n.º 1
0
        /// <summary>
        /// 支持单人脸图像质量检测。
        /// </summary>
        /// <param name="image"></param>
        /// <param name="singleFaceInfo"></param>
        /// <returns></returns>
        public float ImageQualityDetect(ImageInfo image, SingleFaceInfo singleFaceInfo)
        {
            if (_version < 4)
            {
                return(1);             //2.x不支持,3.x结构差异大,不做兼容
            }
            var result = ASFFunctions.ASFImageQualityDetect(EngineHandler, image.width, image.height, image.format, image.imgData, singleFaceInfo.ASFSingleFaceInfo, singleFaceInfo.Mask ? 1 : 1, out float confidenceLevel);

            if (result == MResult.MOK)
            {
                return(confidenceLevel);
            }
            return(0);
        }
Ejemplo n.º 2
0
 /// <summary>
 /// 获取人脸是否戴口罩。
 /// <para>仅支持4.0+</para>
 /// </summary>
 /// <returns></returns>
 public int[] GetMask()
 {
     if (_version >= 4)
     {
         var result = ASFFunctions.ASFGetMask(EngineHandler, out ASF_MaskInfo mask);
         if (result == MResult.MOK)
         {
             var _copy = new int[mask.num];
             Marshal.Copy(mask.maskArray, _copy, 0, mask.num);
             return(_copy);
         }
     }
     return(null);
 }
Ejemplo n.º 3
0
        /// <summary>
        /// 离线激活.
        /// </summary>
        /// <param name="activeFile">离线激活文件路径</param>
        /// <returns></returns>
        public static bool OfflineActivation(string activeFile)
        {
            if (!File.Exists(activeFile))
            {
                throw new Exception($"未找到离线激活文件{activeFile}");
            }
            var result = ASFFunctions.ASFOfflineActivation(activeFile);

            if (result == MResult.MOK || result == MResult.MERR_ASF_ALREADY_ACTIVATED)
            {
                return(true);
            }
            throw new Exception($"离线激活错误.{result}");
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 离线激活.将离线激活文件放置到应用程序根目录下并重命名为ArcFacePro.dat
        /// </summary>
        /// <returns></returns>
        public static bool OfflineActivation()
        {
            var activeFile = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "ArcFacePro.dat");

            if (!File.Exists(activeFile))
            {
                throw new Exception($"未找到离线激活文件{activeFile}");
            }
            var result = ASFFunctions.ASFOfflineActivation(activeFile);

            if (result == MResult.MOK || result == MResult.MERR_ASF_ALREADY_ACTIVATED)
            {
                return(true);
            }
            throw new Exception($"离线激活错误.{result}");
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 检测人脸信息。
        /// </summary>
        /// <param name="image"></param>
        /// <param name="process">执行Process方法提取特性</param>
        /// <param name="detectonly">如果只检测人脸信息,不做特征值提取,可以设置为true则不会调用Process方法</param>
        /// <returns></returns>
        public MultiFaceInfo DetectFaces(ImageInfo image, bool process = false, bool detectonly = false)
        {
            var result =
                ASFFunctions.ASFDetectFaces(EngineHandler, image.width, image.height, image.format, image.imgData, out ASF_MultiFaceInfo multiFaceInfo);

            if (result == MResult.MOK)
            {
                var entity = new MultiFaceInfo(multiFaceInfo);
                if (_version >= 4 || process)//4.x需要用到是否带口罩特性
                {
                    if (!detectonly)
                    {
                        var processcombinMask = CombinedMask & ~ASF_Mask.ASF_FACE_DETECT & ~ASF_Mask.ASF_FACERECOGNITION & ~ASF_Mask.ASF_IMAGEQUALITY & ~ASF_Mask.ASF_IR_LIVENESS & ~ASF_Mask.ASF_FACESHELTER & ~ASF_Mask.ASF_UPDATE_FACEDATA;
                        result = ASFFunctions.ASFProcess(EngineHandler, image.width, image.height, image.format, image.imgData, multiFaceInfo, (int)processcombinMask);
                        if (result == MResult.MOK)
                        {
                            if (processcombinMask.HasFlag(ASF_Mask.ASF_AGE) && ASFFunctions.ASFGetAge(EngineHandler, out ASF_AgeInfo ageInfo) == MResult.MOK)
                            {
                                entity.SetAgeInfo(ageInfo);
                            }
                            if (processcombinMask.HasFlag(ASF_Mask.ASF_GENDER) && ASFFunctions.ASFGetGender(EngineHandler, out ASF_GenderInfo genderInfo) == MResult.MOK)
                            {
                                entity.SetGenderInfo(genderInfo);
                            }
                            if (processcombinMask.HasFlag(ASF_Mask.ASF_FACE3DANGLE) && ASFFunctions.ASFGetFace3DAngle(EngineHandler, out ASF_Face3DAngle face3DAngle) == MResult.MOK)
                            {
                                entity.SetFace3DAngle(face3DAngle);
                            }
                            if (processcombinMask.HasFlag(ASF_Mask.ASF_LIVENESS) && ASFFunctions.ASFGetLivenessScore(EngineHandler, out ASF_LivenessInfo livenessInfo) == MResult.MOK)
                            {
                                entity.SetLivenessInfo(livenessInfo);
                            }
                            if (processcombinMask.HasFlag(ASF_Mask.ASF_MASKDETECT) && ASFFunctions.ASFGetMask(EngineHandler, out ASF_MaskInfo maskInfo) == MResult.MOK)
                            {
                                entity.SetMaskInfo(maskInfo);
                            }
                            if (processcombinMask.HasFlag(ASF_Mask.ASF_FACELANDMARK) && ASFFunctions.ASFGetFaceLandMark(EngineHandler, out ASF_LandMarkInfo faceLandmark) == MResult.MOK)
                            {
                                entity.SetFaceLandmark(faceLandmark);
                            }
                        }
                    }
                }
                return(entity);
            }
            return(null);
        }
Ejemplo n.º 6
0
 /// <summary>
 /// 获取额头区域位置。
 /// <para>仅支持4.0+</para>
 /// </summary>
 /// <returns></returns>
 public List <ASF_FaceLandmark> GetFaceLandMark()
 {
     if (_version >= 4)
     {
         var result = ASFFunctions.ASFGetFaceLandMark(EngineHandler, out ASF_LandMarkInfo landMarkInfo);
         if (result == MResult.MOK)
         {
             var faceLandmarks = new List <ASF_FaceLandmark>();
             var size          = Marshal.SizeOf <ASF_FaceLandmark>();
             for (int i = 0; i < landMarkInfo.num; i++)
             {
                 var obj = Marshal.PtrToStructure <ASF_FaceLandmark>(IntPtr.Add(landMarkInfo.point, size * i));
                 faceLandmarks.Add(obj);
             }
         }
     }
     return(null);
 }
Ejemplo n.º 7
0
        /// <summary>
        /// 获取sdk版本信息
        /// </summary>
        /// <returns></returns>
        public SDKVersion GetVersion()
        {
            ASF_VERSION version;

            if (_version > 2 || EngineHandler != IntPtr.Zero)
            {
                if (_version > 2)
                {
                    version = ASFFunctions.ASFGetVersion();
                }
                else
                {
                    var r = ASFFunctions.Compatible.ASFGetVersion(EngineHandler);
                    version = Marshal.PtrToStructure <ASF_VERSION>(r);
                }
                Version = new SDKVersion(version);
            }
            return(Version);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 人脸特征比对,输出比对相似度。
        /// </summary>
        /// <param name="feature1"></param>
        /// <param name="feature2"></param>
        /// <returns></returns>
        public float FaceFeatureCompare(byte[] feature1, byte[] feature2)
        {
            var f1 = new ASF_FaceFeature
            {
                featureSize = feature1.Length
            };
            var f2 = new ASF_FaceFeature
            {
                featureSize = feature2.Length
            };
            var p1 = Marshal.AllocHGlobal(feature1.Length);
            var p2 = Marshal.AllocHGlobal(feature2.Length);

            Marshal.Copy(feature1, 0, p1, feature1.Length);
            Marshal.Copy(feature2, 0, p2, feature2.Length);
            f1.feature = p1;
            f2.feature = p2;
            ASFFunctions.ASFFaceFeatureCompare(EngineHandler, f1, f2, out float score, ASF_CompareModel.ASF_LIFE_PHOTO);
            Marshal.FreeHGlobal(p1);
            Marshal.FreeHGlobal(p2);
            return(score);
        }
Ejemplo n.º 9
0
 /// <summary>
 /// 释放引擎
 /// </summary>
 public void Dispose()
 {
     ASFFunctions.ASFUninitEngine(EngineHandler);
 }
Ejemplo n.º 10
0
 /// <summary>
 /// 获取IR活体信息。
 /// </summary>
 /// <returns></returns>
 public ASF_LivenessInfo GetLivenessScore_IR()
 {
     ASFFunctions.ASFGetLivenessScore_IR(EngineHandler, out ASF_LivenessInfo livenessInfo);
     return(livenessInfo);
 }
Ejemplo n.º 11
0
 /// <summary>
 /// 设置遮挡算法检测的阈值。
 /// </summary>
 /// <param name="ShelterThreshhold"></param>
 /// <returns></returns>
 public bool SetFaceShelterParam(float ShelterThreshhold)
 {
     return(ASFFunctions.ASFSetFaceShelterParam(EngineHandler, ShelterThreshhold) == MResult.MOK);
 }
Ejemplo n.º 12
0
 /// <summary>
 /// 人脸特征比对,输出比对相似度。
 /// </summary>
 /// <param name="feature1"></param>
 /// <param name="feature2"></param>
 /// <param name="compareModel"></param>
 /// <returns></returns>
 public float FaceFeatureCompare(ASF_FaceFeature feature1, ASF_FaceFeature feature2, ASF_CompareModel compareModel = ASF_CompareModel.ASF_LIFE_PHOTO)
 {
     ASFFunctions.ASFFaceFeatureCompare(EngineHandler, feature1, feature2, out float score, compareModel);
     return(score);
 }