private void ImageGrabbedProcess(object sender, EventArgs arg) { Mat mat = new Mat(); DateTime now = DateTime.Now; capture.Retrieve(mat); // 捕获摄像头图片 //if (index++ < 10) //{ // mat.Bitmap.Save("C:\\face"+index+".bmp"); //} //else { // Application.Exit(); //} //return; #region 检查人脸 Bitmap bitmap = mat.Bitmap; int width = 0; int height = 0; int pitch = 0; byte[] imageDataX = ArcSoft_FACE_API.FSDK_FACE_SHARE.ReadBmpToByte(bitmap, ref width, ref height, ref pitch); IntPtr imageDataPtrX = Marshal.AllocHGlobal(imageDataX.Length); Marshal.Copy(imageDataX, 0, imageDataPtrX, imageDataX.Length); ArcSoft_FACE_API.FSDK_FACE_SHARE.ASVLOFFSCREEN offInputX = new ArcSoft_FACE_API.FSDK_FACE_SHARE.ASVLOFFSCREEN(); offInputX.u32PixelArrayFormat = 513; offInputX.ppu8Plane = new IntPtr[4]; offInputX.ppu8Plane[0] = imageDataPtrX; offInputX.i32Width = width; offInputX.i32Height = height; offInputX.pi32Pitch = new int[4]; offInputX.pi32Pitch[0] = pitch; IntPtr offInputPtrX = Marshal.AllocHGlobal(Marshal.SizeOf(offInputX)); Marshal.StructureToPtr(offInputX, offInputPtrX, false); ArcSoft_FACE_API.FSDK_FACE_DETECTION.AFD_FSDK_FACERES faceResX = new ArcSoft_FACE_API.FSDK_FACE_DETECTION.AFD_FSDK_FACERES(); IntPtr faceResPtrX = Marshal.AllocHGlobal(Marshal.SizeOf(faceResX)); int detectResult = ArcSoft_FACE_API.FSDK_FACE_DETECTION.AFD_FSDK_StillImageFaceDetection(ArcSoft_FACE_API.FSDK_FACE_SHARE.detectEngine, offInputPtrX, ref faceResPtrX); if (detectResult == 0) { faceResX = (ArcSoft_FACE_API.FSDK_FACE_DETECTION.AFD_FSDK_FACERES)Marshal.PtrToStructure(faceResPtrX, typeof(ArcSoft_FACE_API.FSDK_FACE_DETECTION.AFD_FSDK_FACERES)); #region 绘制人脸框 ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT[] rectArr = new ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT[faceResX.nFace]; long longPtrX = faceResX.rcFace.ToInt64(); for (int i = 0; i < rectArr.Length; i++) { IntPtr rectPtrX = new IntPtr(longPtrX); var a = Marshal.PtrToStructure(rectPtrX, typeof(ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT)); var b = (ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT)a; rectArr[i] = b; longPtrX += Marshal.SizeOf(typeof(ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT)); } ArcSoft_FACE_API.FSDK_FACE_SHARE.DrawRectangleInPicture2(bitmap, rectArr, Color.Red, 2, DashStyle.Dash); if (pictureflag || personflag) { captureFeature = detectAndExtractFeature(bitmap, pictureBox0); float similar = 0; if (pictureflag) { similar = recogitionAndFacePairMatching(pictureFeature, captureFeature); pictureflag = false; } else { similar = recogitionAndFacePairMatching(personFeature, captureFeature); personflag = false; } setControlText(label1, "相似度结果: " + similar.ToString()); timer1.Start(); //pictureBox0.Image = null; //pictureBox1.Image = null; //pictureBox2.Image = null; pictureFeature = null; captureFeature = null; } #endregion } // 设置显示图片 imageBox1.Image = mat; Marshal.FreeHGlobal(imageDataPtrX); //Marshal.FreeHGlobal(faceResPtrX); //Marshal.FreeHGlobal(offInputPtrX); #endregion }
//检测人脸、提取特征 private byte[] detectAndExtractFeature(Image imageParam, PictureBox picbox) { Byte[] feature = null; try { Console.WriteLine(); Console.WriteLine("############### Face Detect Start #########################"); int width = 0; int height = 0; int pitch = 0; Bitmap bitmap = new Bitmap(imageParam); byte[] imageData = ArcSoft_FACE_API.FSDK_FACE_SHARE.ReadBmpToByte(bitmap, ref width, ref height, ref pitch); IntPtr imageDataPtr = Marshal.AllocHGlobal(imageData.Length); Marshal.Copy(imageData, 0, imageDataPtr, imageData.Length); //Marshal.StructureToPtr(imageData, imageDataPtr, false); ArcSoft_FACE_API.FSDK_FACE_SHARE.ASVLOFFSCREEN offInput = new ArcSoft_FACE_API.FSDK_FACE_SHARE.ASVLOFFSCREEN(); offInput.u32PixelArrayFormat = 513; offInput.ppu8Plane = new IntPtr[4]; offInput.ppu8Plane[0] = imageDataPtr; offInput.i32Width = width; offInput.i32Height = height; offInput.pi32Pitch = new int[4]; offInput.pi32Pitch[0] = pitch; IntPtr offInputPtr = Marshal.AllocHGlobal(Marshal.SizeOf(offInput)); Marshal.StructureToPtr(offInput, offInputPtr, false); ArcSoft_FACE_API.FSDK_FACE_DETECTION.AFD_FSDK_FACERES faceRes = new ArcSoft_FACE_API.FSDK_FACE_DETECTION.AFD_FSDK_FACERES(); IntPtr faceResPtr = Marshal.AllocHGlobal(Marshal.SizeOf(faceRes)); Console.WriteLine("StartTime:{0}", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff")); Stopwatch watchTime = new Stopwatch(); watchTime.Start(); //人脸检测 int detectResult = ArcSoft_FACE_API.FSDK_FACE_DETECTION.AFD_FSDK_StillImageFaceDetection( ArcSoft_FACE_API.FSDK_FACE_SHARE.detectEngine, offInputPtr, ref faceResPtr ); watchTime.Stop(); Console.WriteLine(String.Format("检测耗时:{0}ms", watchTime.ElapsedMilliseconds)); /* #region 原始方法1 * long longPtr = faceRes.rcFace.ToInt64(); * for (int i = 0; i < rectArr.Length; i++) * { * IntPtr rectPtr = new IntPtr(longPtr); * var a = Marshal.PtrToStructure(rectPtr, typeof(ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT)); * var b = (ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT)a; * rectArr[i] = b; * longPtr += Marshal.SizeOf(typeof(ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT)); * } * imageParam = ArcSoft_FACE_API.FSDK_FACE_SHARE.DrawRectangleInPicture2(imageParam, rectArr, Color.Red, 2, DashStyle.Dash); * if (rectArr.Length > 0) * { * ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT rect = rectArr[0]; * Image imgResult = ArcSoft_FACE_API.FSDK_FACE_SHARE.CutFace((Bitmap)imageParam, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); * picbox.Image = imgResult; * } * else * { * picbox.Image = null; * } #endregion */ /* #region 原始方法2 * faceRes = (ArcSoft_FACE_API.FSDK_FACE_DETECTION.AFD_FSDK_FACERES)Marshal.PtrToStructure(faceResPtr, typeof(ArcSoft_FACE_API.FSDK_FACE_DETECTION.AFD_FSDK_FACERES)); * Console.WriteLine(" Face Count: " + faceRes.nFace); * for (int i = 0; i < faceRes.nFace; i++) * { * ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT rect = (ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT)Marshal.PtrToStructure(faceRes.rcFace + Marshal.SizeOf(typeof(ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT)) * i, typeof(ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT)); * int orient = (int)Marshal.PtrToStructure(faceRes.lfaceOrient + Marshal.SizeOf(typeof(int)) * i, typeof(int)); * if (i == 0) * { * Image image = ArcSoft_FACE_API.FSDK_FACE_SHARE.CutFace(bitmap, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); * picbox.Image = image; * } * Console.WriteLine("left:" + rect.left + "\n" + "top:" + rect.top + "\n" + "right:" + rect.right + "\n" + "bottom:" + rect.bottom + "\n" + "orient:" + orient); * * } #endregion */ #region 自己修改 faceRes = (ArcSoft_FACE_API.FSDK_FACE_DETECTION.AFD_FSDK_FACERES)Marshal.PtrToStructure(faceResPtr, typeof(ArcSoft_FACE_API.FSDK_FACE_DETECTION.AFD_FSDK_FACERES)); ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT[] rectArr = new ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT[faceRes.nFace]; for (int j = 0; j < rectArr.Length; j++) { rectArr[j] = (ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT)Marshal.PtrToStructure(faceRes.rcFace + Marshal.SizeOf(typeof(ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT)) * j, typeof(ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT)); } imageParam = ArcSoft_FACE_API.FSDK_FACE_SHARE.DrawRectangleInPicture2(imageParam, rectArr, Color.Red, 3, DashStyle.Dash); if (rectArr.Length > 0) { for (int j = 0; j < rectArr.Length; j++) { ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT rect = rectArr[0]; Image imgResult = ArcSoft_FACE_API.FSDK_FACE_SHARE.CutFace((Bitmap)imageParam, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); picbox.Image = imgResult; } } else { picbox.Image = null; } #endregion Console.WriteLine(" EndTime:{0}", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff")); Console.WriteLine("############### Face Detect End #########################"); if (faceRes.nFace > 0) { Console.WriteLine("############### Face Recognition Start #########################"); ArcSoft_FACE_API.FSDK_FACE_RECOGNITION.AFR_FSDK_FACEINPUT faceResult = new ArcSoft_FACE_API.FSDK_FACE_RECOGNITION.AFR_FSDK_FACEINPUT(); int orient = (int)Marshal.PtrToStructure(faceRes.lfaceOrient, typeof(int)); faceResult.lfaceOrient = orient; faceResult.rcFace = new ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT(); ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT rect = (ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT)Marshal.PtrToStructure(faceRes.rcFace, typeof(ArcSoft_FACE_API.FSDK_FACE_SHARE.MRECT)); faceResult.rcFace = rect; IntPtr faceResultPtr = Marshal.AllocHGlobal(Marshal.SizeOf(faceResult)); Marshal.StructureToPtr(faceResult, faceResultPtr, false); ArcSoft_FACE_API.FSDK_FACE_RECOGNITION.AFR_FSDK_FACEMODEL localFaceModels = new ArcSoft_FACE_API.FSDK_FACE_RECOGNITION.AFR_FSDK_FACEMODEL(); IntPtr localFaceModelsPtr = Marshal.AllocHGlobal(Marshal.SizeOf(localFaceModels)); //Marshal.StructureToPtr(localFaceModels, localFaceModelsPtr, false); watchTime.Start(); int extractResult = ArcSoft_FACE_API.FSDK_FACE_RECOGNITION.AFR_FSDK_ExtractFRFeature(ArcSoft_FACE_API.FSDK_FACE_SHARE.recogitionEngine, offInputPtr, faceResultPtr, localFaceModelsPtr); Marshal.FreeHGlobal(faceResultPtr); Marshal.FreeHGlobal(offInputPtr); watchTime.Stop(); Console.WriteLine(String.Format("抽取特征耗时:{0}ms", watchTime.ElapsedMilliseconds)); localFaceModels = (ArcSoft_FACE_API.FSDK_FACE_RECOGNITION.AFR_FSDK_FACEMODEL)Marshal.PtrToStructure(localFaceModelsPtr, typeof(ArcSoft_FACE_API.FSDK_FACE_RECOGNITION.AFR_FSDK_FACEMODEL)); Marshal.FreeHGlobal(localFaceModelsPtr); Console.WriteLine("" + localFaceModels.lFeatureSize); feature = new byte[localFaceModels.lFeatureSize]; Marshal.Copy(localFaceModels.pbFeature, feature, 0, localFaceModels.lFeatureSize); localFaceModels = new ArcSoft_FACE_API.FSDK_FACE_RECOGNITION.AFR_FSDK_FACEMODEL(); Console.WriteLine("############### Face Recognition End #########################"); } bitmap.Dispose(); imageData = null; Marshal.FreeHGlobal(imageDataPtr); offInput = new ArcSoft_FACE_API.FSDK_FACE_SHARE.ASVLOFFSCREEN(); faceRes = new ArcSoft_FACE_API.FSDK_FACE_DETECTION.AFD_FSDK_FACERES(); } catch (Exception e) { Console.WriteLine(e.Message + e.StackTrace); } return(feature); }