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);
        }