public static extern int ExtractFeature(IntPtr engine, ref ImageData imageData, ref FaceFeatureInput faceFeatureInput, out FaceModel pFaceModels);
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(); } } }