//获取相似度
        private float recogitionAndFacePairMatching(byte[] firstFeature, byte[] secondFeature)
        {
            float similar = 0f;

            ArcSoft_FACE_API.FSDK_FACE_RECOGNITION.AFR_FSDK_FACEMODEL firstFaceModels = new ArcSoft_FACE_API.FSDK_FACE_RECOGNITION.AFR_FSDK_FACEMODEL();
            IntPtr firstFeaturePtr = Marshal.AllocHGlobal(firstFeature.Length);

            Marshal.Copy(firstFeature, 0, firstFeaturePtr, firstFeature.Length);
            firstFaceModels.lFeatureSize = firstFeature.Length;
            firstFaceModels.pbFeature    = firstFeaturePtr;
            IntPtr firstPtr = Marshal.AllocHGlobal(Marshal.SizeOf(firstFaceModels));

            Marshal.StructureToPtr(firstFaceModels, firstPtr, false);


            ArcSoft_FACE_API.FSDK_FACE_RECOGNITION.AFR_FSDK_FACEMODEL secondFaceModels = new ArcSoft_FACE_API.FSDK_FACE_RECOGNITION.AFR_FSDK_FACEMODEL();
            IntPtr secondFeaturePtr = Marshal.AllocHGlobal(secondFeature.Length);

            Marshal.Copy(secondFeature, 0, secondFeaturePtr, secondFeature.Length);
            secondFaceModels.lFeatureSize = secondFeature.Length;
            secondFaceModels.pbFeature    = secondFeaturePtr;
            IntPtr secondPtr = Marshal.AllocHGlobal(Marshal.SizeOf(secondFaceModels));

            Marshal.StructureToPtr(secondFaceModels, secondPtr, false);

            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();
            int result = ArcSoft_FACE_API.FSDK_FACE_RECOGNITION.AFR_FSDK_FacePairMatching(ArcSoft_FACE_API.FSDK_FACE_SHARE.recogitionEngine, firstPtr, secondPtr, ref similar);

            stopwatch.Stop();
            //Console.WriteLine("相似度:" + similar.ToString() + " 耗时:" + stopwatch.ElapsedMilliseconds.ToString() + "ms");

            firstFaceModels  = new ArcSoft_FACE_API.FSDK_FACE_RECOGNITION.AFR_FSDK_FACEMODEL();
            secondFaceModels = new ArcSoft_FACE_API.FSDK_FACE_RECOGNITION.AFR_FSDK_FACEMODEL();
            Marshal.FreeHGlobal(firstFeaturePtr);
            Marshal.FreeHGlobal(secondFeaturePtr);
            Marshal.FreeHGlobal(firstPtr);
            Marshal.FreeHGlobal(secondPtr);
            return(similar);
        }
        //检测人脸、提取特征
        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);
        }