/// <summary> /// 创建一个FaceEngine实例 /// </summary> /// <param name="registerOrNot"></param> /// <param name="sdkversion"></param> public FaceEngine(ASF_RegisterOrNot registerOrNot, int sdkversion) { if (sdkversion < 2 || sdkversion > 4) { throw new ArgumentOutOfRangeException("sdkversion", sdkversion, "不支持的sdk版本"); } _version = sdkversion; GetVersion(); RegisterOrNot = registerOrNot; }
/// <summary> /// 提取人脸特征,多人脸默认取第一个人脸特征 /// </summary> /// <param name="pEngine">引擎Handle</param> /// <param name="image">图像</param> /// <param name="thresold">图像质量检测阈值</param> /// <returns>保存人脸特征结构体指针</returns> public static FaceFeature ExtractFeature(FaceEngine faceEngine, Image image, float thresoldImg, float thresoleImgMask, ASF_RegisterOrNot registerOrNot, out SingleFaceInfo singleFaceInfo, out bool isMask, ref string featureResult, out int retCode, int faceIndex = 0) { FaceFeature faceFeature = new FaceFeature(); singleFaceInfo = new SingleFaceInfo(); isMask = false; retCode = -1; try { if (image == null) { return(faceFeature); } MultiFaceInfo multiFaceInfo; //人脸检测 retCode = faceEngine.ASFDetectFacesEx(image, out multiFaceInfo); if (retCode != 0 || multiFaceInfo.faceNum <= 0) { featureResult = string.Format("{1},接口返回值:{0}", retCode, retCode != 0 ? "人脸检测失败" : "检测到的人脸数为0"); return(faceFeature); } singleFaceInfo.faceOrient = multiFaceInfo.faceOrients[faceIndex]; singleFaceInfo.faceRect = multiFaceInfo.faceRects[faceIndex]; singleFaceInfo.faceDataInfo = multiFaceInfo.faceDataInfoList[faceIndex]; //口罩检测 MaskInfo maskInfo = MaskEstimation(faceEngine, image, singleFaceInfo, out retCode); if (retCode != 0 || maskInfo.maskArray == null || maskInfo.maskArray.Length <= 0) { featureResult = string.Format("{1},接口返回值:{0}", retCode, retCode != 0 ? "口罩检测失败" : "检测到的口罩结果为空"); return(faceFeature); } isMask = maskInfo.maskArray[0].Equals(1); //图像质量检测 float confidenceLevel = 0.0f; retCode = faceEngine.ASFImageQualityDetectEx(image, multiFaceInfo, out confidenceLevel, faceIndex, isMask); if (retCode != 0 || confidenceLevel < (isMask ? thresoleImgMask : thresoldImg)) { featureResult = string.Format("{1},接口返回值:{0}", retCode, retCode != 0 ? "图像质量检测失败" : "图像质量过低"); return(faceFeature); } //特征提取 retCode = faceEngine.ASFFaceFeatureExtractEx(image, multiFaceInfo, registerOrNot, out faceFeature, faceIndex, isMask); if (retCode != 0) { featureResult = string.Format("特征提取失败,接口返回值:{0}", retCode); } } catch (Exception ex) { LogUtil.LogInfo(typeof(FaceUtil), ex); } return(faceFeature); }
public static extern int ASFFaceFeatureExtractEx(IntPtr hEngine, IntPtr imgData, IntPtr faceInfo, ASF_RegisterOrNot registerOrNot, int mask, IntPtr feature);
public static extern int ASFFaceFeatureExtract(IntPtr pEngine, int width, int height, int format, IntPtr imgData, IntPtr faceInfo, ASF_RegisterOrNot registerOrNot, int mask, IntPtr faceFeature);
public static extern MResult ASFFaceFeatureExtractEx(IntPtr hEngine, ASVLOFFSCREEN imgData, ASF_SingleFaceInfo faceInfo, ASF_RegisterOrNot registerOrNot, int mask, out ASF_FaceFeature feature);
public static extern MResult ASFFaceFeatureExtract(IntPtr hEngine, int width, int height, int format, IntPtr imgData, ASF_SingleFaceInfo faceInfo, ASF_RegisterOrNot registerOrNot, int mask, out ASF_FaceFeature feature);
/// <summary> /// 提取特征值 /// </summary> /// <param name="image"></param> /// <param name="singleFaceInfo"></param> /// <param name="registerOrNot"></param> /// <returns></returns> public FaceFeaturePro FaceFeatureExtractEx(ImageInfo image, SingleFaceInfo singleFaceInfo, ASF_RegisterOrNot registerOrNot) { if (_version == 2) { return(FaceFeatureExtract(image, singleFaceInfo)); } MResult result = MResult.MOK; ASF_FaceFeature feature = new ASF_FaceFeature { }; if (_version >= 4) { result = ASFFunctions.ASFFaceFeatureExtractEx(EngineHandler, image.ASFImageData, singleFaceInfo.ASFSingleFaceInfo, registerOrNot, singleFaceInfo.Mask ? 1 : 0, out feature); } else { result = ASFFunctions.Compatible.ASFFaceFeatureExtractEx(EngineHandler, image.ASFImageData, singleFaceInfo.ASFSingleFaceInfo, out feature); } if (result == MResult.MOK) { var entity = new FaceFeaturePro(); entity.Size = feature.featureSize; var buffers = new byte[feature.featureSize]; Marshal.Copy(feature.feature, buffers, 0, feature.featureSize); entity.Buffers = buffers; entity.ASFFaceFeature = feature; return(entity); } return(null); }