Beispiel #1
0
        private void ImageGrabbedProcess(object sender, EventArgs arg)
        {
            Mat      mat = new Mat();
            DateTime now = DateTime.Now;

            capture.Retrieve(mat);   // 捕获摄像头图片
            bitmap = mat.Bitmap;

            detectandextractfeature = detectAndExtractFeature(bitmap, pictureBox0, true, false, false);

            if (detectandextractfeature.faceflag && addflag)
            {
                pictureBox0.Image        = null;
                facelibrary              = new FaceLibrary();
                facelibrary.face_name    = textBox1.Text.Trim();
                detectandextractfeature  = detectAndExtractFeature(bitmap, pictureBox0, false, true, true);
                facelibrary.face_Feature = detectandextractfeature.face_Feature;
                if (currentfacenum > -1)    //覆盖当前人脸信息
                {
                    listface[currentfacenum] = facelibrary;
                }
                else
                {
                    listface.Add(facelibrary);
                }
                addflag        = false;
                currentfacenum = -1;
                string listfacestr = JsonListToString(listface);
                FileWrite("facelibrary", listfacestr);
                MessageBox.Show("人脸注册成功!");
            }
            else
            {
                if (addflag)
                {
                    MessageBox.Show("未检测到人脸,人脸注册失败!");
                    addflag = false;
                }
            }

            if (detectandextractfeature.faceflag && checkflag)
            {
                detectandextractfeature = detectAndExtractFeature(bitmap, pictureBox0, false, false, true);
                float similar = 0.0f;
                int   num     = -1;
                for (int i = 0; i < listface.Count; i++)
                {
                    float facesimilar = recogitionAndFacePairMatching(listface[i].face_Feature, detectandextractfeature.face_Feature);
                    Console.WriteLine("编号:  " + i + "-------" + "  人脸姓名: " + listface[i].face_name + "-------" + " 相似度: " + facesimilar);
                    if (facesimilar > similar)
                    {
                        similar = facesimilar;
                        num     = i;
                    }
                }

                if (similar > changecheckvalue)
                {
                    setControlText(label1, "识别结果: " + listface[num].face_name);
                }
                else
                {
                    setControlText(label1, "识别结果: " + "无此人");
                }
            }
            else
            {
                if (checkflag)
                {
                    setControlText(label1, "识别结果: " + "未检测到人脸");
                }
            }
            // 设置显示图片
            imageBox0.Image         = mat;
            detectandextractfeature = new DetectAndExtractFeature();
        }
Beispiel #2
0
        //检测人脸、提取特征
        private DetectAndExtractFeature detectAndExtractFeature(Image imageParam, PictureBox picbox, bool drawrectangleflag, bool cutpicboxflag, bool detectandextractflag)
        {
            DetectAndExtractFeature currentdetectandextractfeature = new DetectAndExtractFeature();

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

                if (drawrectangleflag)
                {
                    imageParam = ArcSoft_FACE_API.FSDK_FACE_SHARE.DrawRectangleInPicture2(imageParam, rectArr, Color.Red, 3, DashStyle.Dash);
                }
                else
                {
                    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);
                            if (cutpicboxflag)
                            {
                                picbox.Image = imgResult;
                            }
                            else
                            {
                                picbox.Image = null;
                            }
                        }
                    }
                    else
                    {
                        picbox.Image = null;
                    }
                }

                Console.WriteLine("  EndTime:{0}", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.ffff"));
                Console.WriteLine("############### Face Detect End   #########################");

                if (faceRes.nFace > 0)
                {
                    if (detectandextractflag)
                    {
                        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   #########################");
                        currentdetectandextractfeature.face_Feature = feature;
                    }
                    else
                    {
                        currentdetectandextractfeature.faceflag = true;
                    }
                    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(currentdetectandextractfeature);
        }