/** * Updates the positions and state of eyes to the underlying graphic, according to the most recent * face detection results. The graphic will render the eyes and simulate the motion of the iris * based upon these changes over time. */ @Override public void onUpdate(FaceDetector.Detections<Face> detectionResults, Face face) { mOverlay.add(mEyesGraphic); updatePreviousProportions(face); PointF leftPosition = getLandmarkPosition(face, Landmark.LEFT_EYE); PointF rightPosition = getLandmarkPosition(face, Landmark.RIGHT_EYE); float leftOpenScore = face.getIsLeftEyeOpenProbability(); boolean isLeftOpen; if (leftOpenScore == Face.UNCOMPUTED_PROBABILITY) { isLeftOpen = mPreviousIsLeftOpen; } else { isLeftOpen = (leftOpenScore > EYE_CLOSED_THRESHOLD); mPreviousIsLeftOpen = isLeftOpen; } float rightOpenScore = face.getIsRightEyeOpenProbability(); boolean isRightOpen; if (rightOpenScore == Face.UNCOMPUTED_PROBABILITY) { isRightOpen = mPreviousIsRightOpen; } else { isRightOpen = (rightOpenScore > EYE_CLOSED_THRESHOLD); mPreviousIsRightOpen = isRightOpen; } mEyesGraphic.updateEyes(leftPosition, isLeftOpen, rightPosition, isRightOpen); }
/** * Called when the face is assumed to be gone for good. Remove the googly eyes graphic from the * overlay. */ @Override public void onDone() { mOverlay.remove(mEyesGraphic); }
/** * Hide the graphic when the corresponding face was not detected. This can happen for intermediate * frames temporarily (e.g., if the face was momentarily blocked from view). */ @Override public void onMissing(FaceDetector.Detections<Face> detectionResults) { mOverlay.remove(mEyesGraphic); }