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