/// <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); }
/// <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); }
/// <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}"); }
/// <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}"); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <summary> /// 释放引擎 /// </summary> public void Dispose() { ASFFunctions.ASFUninitEngine(EngineHandler); }
/// <summary> /// 获取IR活体信息。 /// </summary> /// <returns></returns> public ASF_LivenessInfo GetLivenessScore_IR() { ASFFunctions.ASFGetLivenessScore_IR(EngineHandler, out ASF_LivenessInfo livenessInfo); return(livenessInfo); }
/// <summary> /// 设置遮挡算法检测的阈值。 /// </summary> /// <param name="ShelterThreshhold"></param> /// <returns></returns> public bool SetFaceShelterParam(float ShelterThreshhold) { return(ASFFunctions.ASFSetFaceShelterParam(EngineHandler, ShelterThreshhold) == MResult.MOK); }
/// <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); }