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