Example #1
0
        // run in ui thread
        private void OnFeatureRead(EyeRetrieveResult eyeRetrieveResult, PupilRetrieveResult pupilRetrieveResult)
        {
            double diff = (frameReadTime - startTime).TotalMilliseconds;

            if (startTime.Ticks == 0)
            {
                diff = 0;
            }
            if (diff > 15000)
            {
                Close();
                return;
            }
            double fps = diff.Equals(lastDiff) ? 0 : 1000 / (diff - lastDiff);

            lastDiff = diff;
            resultWindow.UpdateFPS(fps);
            if (eyeRetrieveResult.HasLeftEye)
            {
                double x_rato = (double)pupilRetrieveResult.LeftPupil.X / img_width;
                leftData.Add(x_rato);
                double y_rato = 1 - (double)pupilRetrieveResult.LeftPupil.Y / img_height;
                leftTopData.Add(y_rato);
                OnLeftPupil(diff, x_rato, y_rato);
            }
            if (eyeRetrieveResult.HasRightEye)
            {
                double x_rato = (double)pupilRetrieveResult.RightPupil.X / img_width;
                rightData.Add(x_rato);
                double y_rato = 1 - (double)pupilRetrieveResult.RightPupil.Y / img_height;
                rightTopData.Add(y_rato);
                OnRightPupil(diff, x_rato, y_rato);
            }
        }
        private void FindFaceFeatures()
        {
            Marshal.Copy(grayFrame.DataPointer, grayBytes, 0, img_size);
            FindFaceEyesIrisAsync().ContinueWith((tsk) =>
            {
                RetrieveResult retrieveResult = tsk.Result;
                if (retrieveResult == null)
                {
                    Dispatcher.BeginInvoke((Action)(() =>
                    {
                        BitmapSource grayImage = BitmapSource.Create(
                            img_width, img_height,
                            96.0, 96.0, PixelFormats.Gray8,
                            new BitmapPalette(new System.Windows.Media.Color[] { System.Windows.Media.Color.FromRgb(0, 0, 0), System.Windows.Media.Color.FromRgb(255, 255, 255) }),
                            grayBytes, img_width);
                        resultWindow.SetResult(grayImage, grayImage);
                        lock (_locker)
                        {
                            isReady = true;
                            if ((capture.Grab() == false))
                            {
                                App.Current.Shutdown();
                            }
                        }
                    }), DispatcherPriority.Render);
                    return;
                }

                FaceRetrieveResult faceRetrieveResult   = retrieveResult.Face;
                EyeRetrieveResult eyeRetrieveResult     = retrieveResult.Eye;
                PupilRetrieveResult pupilRetrieveResult = retrieveResult.Pupil;
                Emgu.CV.Structure.MCvScalar whiteColor  = new Emgu.CV.Structure.MCvScalar(100, 255, 255);
                Emgu.CV.Structure.MCvScalar redColor    = new Emgu.CV.Structure.MCvScalar(100, 255, 100);
                if (faceRetrieveResult.HasFace)
                {
                    RECT face = faceRetrieveResult.Face;
                    CvInvoke.Rectangle(cameraFrame, face, whiteColor, 3);
                    if (eyeRetrieveResult.HasLeftEye)
                    {
                        RECT leftEye     = eyeRetrieveResult.LeftEye;
                        CIRCLE leftPupil = pupilRetrieveResult.LeftPupil;
                        CvInvoke.Rectangle(cameraFrame, leftEye, whiteColor, 3);
                        CvInvoke.Circle(cameraFrame, leftPupil.Center, leftPupil.Radius, redColor, 2);
                    }
                    if (eyeRetrieveResult.HasRightEye)
                    {
                        RECT rightEye     = eyeRetrieveResult.RightEye;
                        CIRCLE rightPupil = pupilRetrieveResult.RightPupil;
                        CvInvoke.Rectangle(cameraFrame, rightEye, whiteColor, 3);
                        CvInvoke.Circle(cameraFrame, rightPupil.Center, rightPupil.Radius, redColor, 2);
                    }
                }

                Dispatcher.BeginInvoke((Action)(() =>
                {
                    OnFeatureRead(eyeRetrieveResult, pupilRetrieveResult);
                    BitmapSource grayImage = BitmapSource.Create(
                        img_width, img_height,
                        96.0, 96.0, PixelFormats.Gray8,
                        new BitmapPalette(new System.Windows.Media.Color[] { System.Windows.Media.Color.FromRgb(0, 0, 0), System.Windows.Media.Color.FromRgb(255, 255, 255) }),
                        grayBytes, img_width);
                    BitmapSource resultImage = Bitmap2BitmapImage(cameraFrame.Bitmap);
                    resultWindow.SetResult(grayImage, resultImage);

                    lock (_locker)
                    {
                        isReady = true;
                        if ((capture.Grab() == false))
                        {
                            App.Current.Shutdown();
                        }
                    }
                }), DispatcherPriority.Render);
            });
        }