private void updatePreviousProportions(Face face) { for (Landmark landmark : face.getLandmarks()) { PointF position = landmark.getPosition(); float xProp = (position.x - face.getPosition().x) / face.getWidth(); float yProp = (position.y - face.getPosition().y) / face.getHeight(); mPreviousProportions.put(landmark.getType(), new PointF(xProp, yProp)); } }
/** * Draws a small circle for each detected landmark, centered at the detected landmark position. * <p> * * Note that eye landmarks are defined to be the midpoint between the detected eye corner * positions, which tends to place the eye landmarks at the lower eyelid rather than at the * pupil position. */ private void drawFaceAnnotations(Canvas canvas, double scale) { Paint paint = new Paint(); paint.setColor(Color.GREEN); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(5); for (int i = 0; i < mFaces.size(); ++i) { Face face = mFaces.valueAt(i); for (Landmark landmark : face.getLandmarks()) { int cx = (int) (landmark.getPosition().x * scale); int cy = (int) (landmark.getPosition().y * scale); canvas.drawCircle(cx, cy, 10, paint); } } } }
private void drawFaceLandmarks( Canvas canvas, double scale ) { Paint paint = new Paint(); paint.setColor( Color.GREEN ); paint.setStyle( Paint.Style.STROKE ); paint.setStrokeWidth( 5 ); for( int i = 0; i < mFaces.size(); i++ ) { Face face = mFaces.valueAt(i); for ( Landmark landmark : face.getLandmarks() ) { int cx = (int) ( landmark.getPosition().x * scale ); int cy = (int) ( landmark.getPosition().y * scale ); canvas.drawCircle( cx, cy, 10, paint ); } } }
/** * Finds a specific landmark position, or approximates the position based on past observations * if it is not present. */ private PointF getLandmarkPosition(Face face, int landmarkId) { for (Landmark landmark : face.getLandmarks()) { if (landmark.getType() == landmarkId) { return landmark.getPosition(); } } PointF prop = mPreviousProportions.get(landmarkId); if (prop == null) { return null; } float x = face.getPosition().x + (prop.x * face.getWidth()); float y = face.getPosition().y + (prop.y * face.getHeight()); return new PointF(x, y); } }
switch (landmark.getType()) { case Landmark.LEFT_EYE: leftEyePos = new PointF(translateX(landmark.getPosition().x), translateY(landmark.getPosition().y)); break; case Landmark.RIGHT_EYE: rightEyePos = new PointF(translateX(landmark.getPosition().x), translateY(landmark.getPosition().y)); break; case Landmark.NOSE_BASE: noseBasePos = new PointF(translateX(landmark.getPosition().x), translateY(landmark.getPosition().y)); break; case Landmark.LEFT_MOUTH: leftMouthCorner = new PointF(translateX(landmark.getPosition().x), translateY(landmark.getPosition().y)); break; case Landmark.RIGHT_MOUTH: rightMouthCorner = new PointF(translateX(landmark.getPosition().x), translateY(landmark.getPosition().y)); break; case Landmark.BOTTOM_MOUTH: mouthBase = new PointF(translateX(landmark.getPosition().x), translateY(landmark.getPosition().y)); break; case Landmark.LEFT_EAR: leftEar = new PointF(translateX(landmark.getPosition().x), translateY(landmark.getPosition().y)); break; case Landmark.RIGHT_EAR: rightEar = new PointF(translateX(landmark.getPosition().x), translateY(landmark.getPosition().y)); break; case Landmark.LEFT_EAR_TIP: leftEarTip = new PointF(translateX(landmark.getPosition().x), translateY(landmark.getPosition().y)); break; case Landmark.RIGHT_EAR_TIP: