/// <summary> /// 人脸识别特征码提取 /// </summary> /// <param name="image"></param> /// <param name="rect"></param> /// <param name="orient"></param> private byte[] RecognizeFace(Bitmap image, MRECT rect, int orient) { IntPtr offInputPtr = ArcFaceDetection.MakeImageInput_ASVLOFFSCREEN(image); AFR_FSDK_FACEINPUT faceInput = new AFR_FSDK_FACEINPUT(); faceInput.lOrient = orient; faceInput.rcFace = rect; //入参 IntPtr faceInputPtr = Marshal.AllocHGlobal(Marshal.SizeOf(faceInput)); Marshal.StructureToPtr(faceInput, faceInputPtr, false); AFR_FSDK_FACEMODEL faceModel = new AFR_FSDK_FACEMODEL(); IntPtr faceModelPtr = Marshal.AllocHGlobal(Marshal.SizeOf(faceModel)); int ret = AFRFunction.AFR_FSDK_ExtractFRFeature(this.faceRecognition.rEngine, offInputPtr, faceInputPtr, faceModelPtr); if (ret == 0) { faceModel = (AFR_FSDK_FACEMODEL)Marshal.PtrToStructure(faceModelPtr, typeof(AFR_FSDK_FACEMODEL)); Marshal.FreeHGlobal(faceModelPtr); byte[] featureContent = new byte[faceModel.lFeatureSize]; Marshal.Copy(faceModel.pbFeature, featureContent, 0, faceModel.lFeatureSize); return(featureContent); } return(null); }
public static AFR_FSDK_FACEMODEL extractFRFeature(IntPtr hFREngine, ASVLOFFSCREEN inputImg, FaceInfo faceInfo) { AFR_FSDK_FACEINPUT faceinput = new AFR_FSDK_FACEINPUT(); faceinput.lOrient = faceInfo.orient; faceinput.rcFace.left = faceInfo.left; faceinput.rcFace.top = faceInfo.top; faceinput.rcFace.right = faceInfo.right; faceinput.rcFace.bottom = faceInfo.bottom; AFR_FSDK_FACEMODEL faceFeature = new AFR_FSDK_FACEMODEL(IntPtr.Zero, 0); IntPtr ret = AFR_FSDKLibrary.AFR_FSDK_ExtractFRFeature(hFREngine, ref (inputImg), ref (faceinput), ref (faceFeature)); if (ret.ToInt64() != 0) { Console.WriteLine(String.Format("AFR_FSDK_ExtractFRFeature ret 0x{0:x}", ret)); return(new AFR_FSDK_FACEMODEL(IntPtr.Zero, 0)); } try { return(faceFeature.deepCopy()); } catch (Exception e) { Console.WriteLine(e.ToString()); return(new AFR_FSDK_FACEMODEL(IntPtr.Zero, 0)); } }
public FaceModel(byte[] data) { Data = data; MatchFaceModel = new AFR_FSDK_FACEMODEL { lFeatureSize = data.Length, pbFeature = Marshal.AllocHGlobal(data.Length) }; Marshal.Copy(data, 0, MatchFaceModel.pbFeature, data.Length); }
public static float compareFaceSimilarity(IntPtr hFDEngine, IntPtr hFREngine, ASVLOFFSCREEN inputImgA, ASVLOFFSCREEN inputImgB) { // Do Face Detect FaceInfo[] faceInfosA = doFaceDetection(hFDEngine, inputImgA); if (faceInfosA.Length < 1) { Console.WriteLine("no face in Image A "); return(0.0f); } FaceInfo[] faceInfosB = doFaceDetection(hFDEngine, inputImgB); if (faceInfosB.Length < 1) { Console.WriteLine("no face in Image B "); return(0.0f); } // Extract Face Feature AFR_FSDK_FACEMODEL faceFeatureA = extractFRFeature(hFREngine, inputImgA, faceInfosA[0]); if (faceFeatureA.pbFeature == IntPtr.Zero) { Console.WriteLine("extract face feature in Image A failed"); return(0.0f); } AFR_FSDK_FACEMODEL faceFeatureB = extractFRFeature(hFREngine, inputImgB, faceInfosB[0]); if (faceFeatureB.pbFeature == IntPtr.Zero) { Console.WriteLine("extract face feature in Image B failed"); faceFeatureA.freeUnmanaged(); return(0.0f); } // calc similarity between faceA and faceB float fSimilScore = 0.0f; IntPtr ret = AFR_FSDKLibrary.AFR_FSDK_FacePairMatching(hFREngine, ref (faceFeatureA), ref (faceFeatureB), ref (fSimilScore)); faceFeatureA.freeUnmanaged(); faceFeatureB.freeUnmanaged(); if (ret.ToInt64() != 0) { Console.WriteLine(String.Format("AFR_FSDK_FacePairMatching failed:ret 0x{0:x}", ret)); return(0.0f); } return(fSimilScore); }
/// <summary> /// 检测特征是否已存在 /// </summary> /// <param name="featureContent"></param> /// <returns></returns> private Tuple <bool, string> IsMatchFeature(byte[] featureContent) { if (this.faceFeatures == null) { this.LoadFaceFeatures(); } //待比较的特征数据 IntPtr f2Ptr = Marshal.AllocHGlobal(featureContent.Length); Marshal.Copy(featureContent, 0, f2Ptr, featureContent.Length); AFR_FSDK_FACEMODEL model2 = new AFR_FSDK_FACEMODEL(); model2.lFeatureSize = featureContent.Length; model2.pbFeature = f2Ptr; IntPtr model2Ptr = Marshal.AllocHGlobal(Marshal.SizeOf(model2)); Marshal.StructureToPtr(model2, model2Ptr, false); foreach (var feature in this.faceFeatures) { //已有的特征数据 IntPtr f1Ptr = Marshal.AllocHGlobal(feature.Feature.Length); Marshal.Copy(feature.Feature, 0, f1Ptr, feature.Feature.Length); AFR_FSDK_FACEMODEL model1 = new AFR_FSDK_FACEMODEL(); model1.lFeatureSize = feature.Feature.Length; model1.pbFeature = f1Ptr; IntPtr model1Ptr = Marshal.AllocHGlobal(Marshal.SizeOf(model1)); Marshal.StructureToPtr(model1, model1Ptr, false); float score = 0; int ret = AFRFunction.AFR_FSDK_FacePairMatching(faceRecognition.rEngine, model1Ptr, model2Ptr, ref score); Console.WriteLine("score:{0}", score); //相似度因子:0.75 if (ret == 0 && score >= 0.75f) { return(new Tuple <bool, string>(true, feature.FileName)); } } return(new Tuple <bool, string>(false, string.Empty)); }