private void InitializeWallCheck() { Debug.Log(transform.rotation.eulerAngles.y); //facing forward: looking for 0 if (transform.rotation.eulerAngles.y >= 0f && transform.rotation.eulerAngles.y <= 10f) { myDirection = EyeDirection.Forward; } //facing left: looking for 90 if (transform.rotation.eulerAngles.y >= 80f && transform.rotation.eulerAngles.y <= 100f) { myDirection = EyeDirection.Left; } //facing backward: looking for 180 if (transform.rotation.eulerAngles.y >= 170f && transform.rotation.eulerAngles.y <= 190f) { myDirection = EyeDirection.Backward; } //facing right: looking for 270 if (transform.rotation.eulerAngles.y >= 260f && transform.rotation.eulerAngles.y <= 280f) { myDirection = EyeDirection.Right; } }
public static string ToDisplay(this EyeDirection eyeDirection) { switch (eyeDirection) { case EyeDirection.right: return("Looking right"); case EyeDirection.center: return("Looking center"); case EyeDirection.left: return("Looking left"); default: return("Unknown"); } }
private async Task ProcessCameraCapture(ImageAnalyzer e) { if (e == null) { this.ViewModel.Update(ShoppingScreenState.Choice); this.isProcessingPhoto = false; return; } await e.DetectFacesAsync(); EyeDirection gaze = EyeDirection.None; if (e.DetectedFaces.Any() && eyeTracker != null) { // Send to gaze service for detection gaze = await eyeTracker.RequestEyesDirection(e.Data); if (gaze == EyeDirection.Left) { this.ViewModel.Update(ShoppingScreenState.Selected, ShoppingChoice.TopLeft); this.isProcessingPhoto = false; return; } else if (gaze == EyeDirection.Right) { this.ViewModel.Update(ShoppingScreenState.Selected, ShoppingChoice.TopRight); this.isProcessingPhoto = false; return; } } else { // don't bother if no face } this.ViewModel.Update(ShoppingScreenState.Choice); this.isProcessingPhoto = false; }
private void GetLandmarks(OpenCvSharp.Mat frame, OpenCvSharp.Rect face, List <System.Drawing.Rectangle> rfaces) { EyePoints rightEye = new EyePoints(leftEye: true); EyePoints leftEye = new EyePoints(leftEye: false); ShapePredictor predictor = ShapePredictor.Deserialize(shapePredictorDataFile); //Scalar eyecolor = new Scalar(0, 0, 255); Array2D <byte> gray = ConvertMatToDlib2DArray(frame); FullObjectDetection landmarks = predictor.Detect(gray, ConvertToDlib(face)); InitializeEyes(landmarks, leftEye, rightEye); //DrawEye(que, landmarks, leftEye); //DrawEye(que, landmarks, rightEye); Rect leftboundingBox = BoundingBoxAroundEye(leftEye, 0); rfaces.Add(FromOpenCvRect(leftboundingBox)); //DrawRect(frame, leftboundingBox); OpenCvSharp.Point centerOfLeftEye = DetectCenterOfEye(frame, leftboundingBox); centerOfLeftEye.X += leftboundingBox.X; Rect rightboundingBox = BoundingBoxAroundEye(rightEye, 0); rfaces.Add(FromOpenCvRect(rightboundingBox)); //DrawRect(frame, rightboundingBox); OpenCvSharp.Point centerOfRightEye = DetectCenterOfEye(frame, rightboundingBox); centerOfRightEye.X += rightboundingBox.X; EyeDirection leftEyeDirection = leftEye.GetEyePosition(centerOfLeftEye); EyeDirection rightEyeDirection = rightEye.GetEyePosition(centerOfRightEye); //EyeDirection eyeDirection = EyeDirection.unknown; //if (leftEyeDirection == EyeDirection.center || rightEyeDirection == EyeDirection.center) eyeDirection = EyeDirection.center; //else if (leftEyeDirection == EyeDirection.left) eyeDirection = EyeDirection.left; //else if (rightEyeDirection == EyeDirection.right) eyeDirection = EyeDirection.right; //OpenCvSharp.Point position = new OpenCvSharp.Point(50, 50); //Cv2.PutText(img: frame, text: eyeDirection.ToDisplay(), org: position, fontFace: HersheyFonts.HersheySimplex, fontScale: 2, new Scalar(0, 0, 255)); }
private void StartWebCam(BackgroundWorker worker = null) { if (cap == null) { cap = new VideoCapture(0); } if (!cap.Open(0)) { return; } OpenCvSharp.Cv2.NamedWindow("Video", WindowMode.AutoSize); int cnt = 0; Mat frame = new Mat(); EyePoints rightEye = new EyePoints(true); EyePoints leftEye = new EyePoints(false); IsRunning = true; while (IsRunning) { bool result = cap.Read(frame); if (!result) { worker.CancelAsync(); IsRunning = false; } if (frame != null && (frame.Rows * frame.Cols > 0)) { cnt++; if (cnt % frameskip == 0) { FrameQueue.Enqueue(frame); cnt = 0; } } while (FrameQueue.Count > 0) { Mat que = FrameQueue.Dequeue(); Rect[] faces = GetFaces(que, 1); for (int i = 0; i < faces.Length; i++) { //GetFaceInRect(faces[i], que, i); Scalar eyecolor = new Scalar(0, 0, 255); Array2D <byte> gray = ConvertMatToDlib2DArray(que); FullObjectDetection landmarks = predictor.Detect(gray, ConvertToDlib(faces[i])); InitializeEyes(landmarks, leftEye, rightEye); //DrawEye(que, landmarks, leftEye); //DrawEye(que, landmarks, rightEye); Rect leftboundingBox = BoundingBoxAroundEye(leftEye, 0); DrawRect(que, leftboundingBox); OpenCvSharp.Point centerOfLeftEye = DetectCenterOfEye(que, leftboundingBox); centerOfLeftEye.X += leftboundingBox.X; Rect rightboundingBox = BoundingBoxAroundEye(rightEye, 0); DrawRect(que, rightboundingBox); OpenCvSharp.Point centerOfRightEye = DetectCenterOfEye(que, rightboundingBox); centerOfRightEye.X += rightboundingBox.X; EyeDirection leftEyeDirection = leftEye.GetEyePosition(centerOfLeftEye); EyeDirection rightEyeDirection = rightEye.GetEyePosition(centerOfRightEye); EyeDirection eyeDirection = EyeDirection.unknown; if (leftEyeDirection == EyeDirection.center || rightEyeDirection == EyeDirection.center) { eyeDirection = EyeDirection.center; } else if (leftEyeDirection == EyeDirection.left) { eyeDirection = EyeDirection.left; } else if (rightEyeDirection == EyeDirection.right) { eyeDirection = EyeDirection.right; } OpenCvSharp.Point position = new OpenCvSharp.Point(50, 50); Cv2.PutText(img: que, text: eyeDirection.ToDisplay(), org: position, fontFace: HersheyFonts.HersheySimplex, fontScale: 2, new Scalar(0, 0, 255)); } //BitmapImage bmi = ConvertToBMI(frame, cnt, "D:/junk/TestCamImages"); if (worker != null) { //worker.ReportProgress(cnt, bmi); try { OpenCvSharp.Cv2.ImShow("Video", que); int key = Cv2.WaitKey(10); // as in 10 milliseconds if (key == 27) { worker.CancelAsync(); IsRunning = false; } } catch (Exception ex) { string msg = ex.Message; } } if (worker.CancellationPending) { Cv2.DestroyWindow("Video"); break; } } } }
private void StartWebCam() { bool useHaarcascade = true; if (cap == null) { cap = new VideoCapture(0); } if (!cap.Open(0)) { return; } OpenCvSharp.Cv2.NamedWindow("Video", WindowMode.AutoSize); EyePoints rightEye = new EyePoints(true); EyePoints leftEye = new EyePoints(false); IsRunning = true; while (IsRunning) { frame = new Mat(); bool result = cap.Read(frame); if (!result) { IsRunning = false; break; } Rect[] faces = useHaarcascade ? GetHaarcascadeFaces(frame, 1) : GetDnnFaces(frame, 1); if (faces == null) { continue; } for (int i = 0; i < faces.Length; i++) { //GetFaceInRect(faces[i], que, i); Scalar eyecolor = new Scalar(0, 0, 255); Array2D <byte> gray = ConvertMatToDlib2DArray(frame); FullObjectDetection landmarks = predictor.Detect(gray, ConvertToDlib(faces[i])); InitializeEyes(landmarks, leftEye, rightEye); //DrawEye(que, landmarks, leftEye); //DrawEye(que, landmarks, rightEye); Rect leftboundingBox = BoundingBoxAroundEye(leftEye, 0); DrawRect(frame, leftboundingBox); OpenCvSharp.Point centerOfLeftEye = DetectCenterOfEye(frame, leftboundingBox); centerOfLeftEye.X += leftboundingBox.X; Rect rightboundingBox = BoundingBoxAroundEye(rightEye, 0); DrawRect(frame, rightboundingBox); OpenCvSharp.Point centerOfRightEye = DetectCenterOfEye(frame, rightboundingBox); centerOfRightEye.X += rightboundingBox.X; EyeDirection leftEyeDirection = leftEye.GetEyePosition(centerOfLeftEye); EyeDirection rightEyeDirection = rightEye.GetEyePosition(centerOfRightEye); EyeDirection eyeDirection = EyeDirection.unknown; if (leftEyeDirection == EyeDirection.center || rightEyeDirection == EyeDirection.center) { eyeDirection = EyeDirection.center; } else if (leftEyeDirection == EyeDirection.left) { eyeDirection = EyeDirection.left; } else if (rightEyeDirection == EyeDirection.right) { eyeDirection = EyeDirection.right; } OpenCvSharp.Point position = new OpenCvSharp.Point(50, 50); Cv2.PutText(img: frame, text: eyeDirection.ToDisplay(), org: position, fontFace: HersheyFonts.HersheySimplex, fontScale: 2, new Scalar(0, 0, 255)); } try { OpenCvSharp.Cv2.ImShow("Video", frame); int key = Cv2.WaitKey(10); // as in 10 milliseconds if (key == 27) { IsRunning = false; } } catch (Exception ex) { string msg = ex.Message; } frame.Dispose(); } }