Пример #1
0
 public static extern int ExtractFeature(IntPtr engine, ref ImageData imageData, ref FaceFeatureInput faceFeatureInput, out FaceModel pFaceModels);
Пример #2
0
        private void MatchFrame()
        {
            #region 获取图片 1毫秒
            var bitmap = this.VideoPlayer.GetCurrentVideoFrame();
            #endregion


            Stopwatch sw = new Stopwatch();
            sw.Start();
            #region 图片转换 0.7-2微妙
            var bmpData   = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            var imageData = new Face.ImageData
            {
                u32PixelArrayFormat = 513,//Rgb24,
                i32Width            = bitmap.Width,
                i32Height           = bitmap.Height,
                pi32Pitch           = new int[4],
                ppu8Plane           = new IntPtr[4]
            };
            imageData.pi32Pitch[0] = bmpData.Stride;
            imageData.ppu8Plane[0] = bmpData.Scan0;

            sw.Stop();
            _FaceResult.Score = sw.ElapsedTicks;


            #endregion
            try
            {
                #region 人脸检测 5-8毫秒
                var ret = (Face.ErrorCode)Face.Detect.Detection(_FaceDetectEnginer, ref imageData, out pDetectResult);
                if (ret != Face.ErrorCode.Ok)
                {
                    return;
                }
                var detectResult = Marshal.PtrToStructure <Face.DetectResult>(pDetectResult);
                if (detectResult.nFace == 0)
                {
                    return;
                }
                var faceRect = Marshal.PtrToStructure <Face.FaceRect>(detectResult.rcFace);
                _FaceResult.Rectangle = new Rectangle((int)(faceRect.left * _RateW), (int)(faceRect.top * _RateH), (int)((faceRect.right - faceRect.left) * _RateW), (int)((faceRect.bottom - faceRect.top) * _RateH));
                var faceOrient = Marshal.PtrToStructure <int>(detectResult.lfaceOrient);
                #endregion


                #region 性别识别基本准确 年龄识别误差太大,没什么应用场景
                //Face.ExtraFaceInput faceInput = new Face.ExtraFaceInput()
                //{
                //    lFaceNumber = facesDetect.nFace,
                //    pFaceRectArray = Marshal.AllocHGlobal(Marshal.SizeOf(faceRect)),
                //    pFaceOrientArray = Marshal.AllocHGlobal(Marshal.SizeOf(faceOrient))
                //};
                //Marshal.StructureToPtr(faceRect, faceInput.pFaceRectArray, false);
                //Marshal.StructureToPtr(faceOrient, faceInput.pFaceOrientArray, false);

                //var ageResult = Face.Age.ASAE_FSDK_AgeEstimation_Preview(_FaceAgeEngine, ref imageData, ref faceInput, out var pAgeRes);
                //var ages = pAgeRes.pResult.ToStructArray<int>(pAgeRes.lFaceNumber);
                //var genderResult = Face.Gender.ASGE_FSDK_GenderEstimation_Preview(_FaceGenderEngine, ref imageData, ref faceInput, out var pGenderRes);
                //var genders = pGenderRes.pResult.ToStructArray<int>(pGenderRes.lFaceNumber);
                //_FaceResult.Age = ages[0];
                //_FaceResult.Gender = genders[0];

                //Marshal.FreeHGlobal(faceInput.pFaceOrientArray);
                //Marshal.FreeHGlobal(faceInput.pFaceRectArray);
                #endregion

                #region 获取人脸特征 160-180毫秒
                var faceFeatureInput = new Face.FaceFeatureInput
                {
                    rcFace  = faceRect,
                    lOrient = faceOrient
                };

                ret = (Face.ErrorCode)Face.Match.ExtractFeature(_FaceMatchEngine, ref imageData, ref faceFeatureInput, out faceModel);
                #endregion

                if (ret == Face.ErrorCode.Ok)
                {
                    if (_RegisterClicked)
                    {
                        _RegisterFeatureData = new byte[faceModel.lFeatureSize];
                        Marshal.Copy(faceModel.pbFeature, _RegisterFeatureData, 0, faceModel.lFeatureSize);
                    }

                    #region 人脸识别(100张人脸) 17-20毫秒
                    foreach (var item in _FaceLib.Items.OrderByDescending(ii => ii.OrderId))
                    {
                        //Console.WriteLine(item.OrderId);
                        var fm = item.FaceModel;
                        int fb = Face.Match.FacePairMatch(_FaceMatchEngine, ref fm, ref faceModel, out score);
                        //Console.WriteLine(fb);
                        if (score > 0.85)
                        {
                            item.OrderId   = DateTime.Now.Ticks;
                            _FaceResult.ID = item.ID;
                            break;
                        }
                    }
                    #endregion
                }
            }
            finally
            {
                bitmap.UnlockBits(bmpData);
                if (_RegisterClicked)
                {
                    this.pictureBox1.Invoke(new Action(() =>
                    {
                        this.pictureBox1.Image = bitmap;
                    }));
                    _RegisterClicked = false;
                }
                else
                {
                    bitmap.Dispose();
                }
            }
        }