| // Copyright 2016 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package vision |
| |
| import ( |
| "log" |
| |
| pb "google.golang.org/genproto/googleapis/cloud/vision/v1" |
| ) |
| |
| // FaceLandmarks contains the positions of facial features detected by the service. |
| type FaceLandmarks struct { |
| Eyebrows Eyebrows |
| Eyes Eyes |
| Ears Ears |
| Nose Nose |
| Mouth Mouth |
| Chin Chin |
| Forehead *pb.Position |
| } |
| |
| // Eyebrows represents a face's eyebrows. |
| type Eyebrows struct { |
| Left, Right Eyebrow |
| } |
| |
| // Eyebrow represents a face's eyebrow. |
| type Eyebrow struct { |
| Top, Left, Right *pb.Position |
| } |
| |
| // Eyes represents a face's eyes. |
| type Eyes struct { |
| Left, Right Eye |
| } |
| |
| // Eye represents a face's eye. |
| type Eye struct { |
| Left, Right, Top, Bottom, Center, Pupil *pb.Position |
| } |
| |
| // Ears represents a face's ears. |
| type Ears struct { |
| Left, Right *pb.Position |
| } |
| |
| // Nose represents a face's nose. |
| type Nose struct { |
| Left, Right, Top, Bottom, Tip *pb.Position |
| } |
| |
| // Mouth represents a face's mouth. |
| type Mouth struct { |
| Left, Center, Right, UpperLip, LowerLip *pb.Position |
| } |
| |
| // Chin represents a face's chin. |
| type Chin struct { |
| Left, Center, Right *pb.Position |
| } |
| |
| // FaceFromLandmarks converts the list of face landmarks returned by the service |
| // to a FaceLandmarks struct. |
| func FaceFromLandmarks(landmarks []*pb.FaceAnnotation_Landmark) *FaceLandmarks { |
| face := &FaceLandmarks{} |
| for _, lm := range landmarks { |
| switch lm.Type { |
| case pb.FaceAnnotation_Landmark_LEFT_OF_LEFT_EYEBROW: |
| face.Eyebrows.Left.Left = lm.Position |
| case pb.FaceAnnotation_Landmark_RIGHT_OF_LEFT_EYEBROW: |
| face.Eyebrows.Left.Right = lm.Position |
| case pb.FaceAnnotation_Landmark_LEFT_OF_RIGHT_EYEBROW: |
| face.Eyebrows.Right.Left = lm.Position |
| case pb.FaceAnnotation_Landmark_RIGHT_OF_RIGHT_EYEBROW: |
| face.Eyebrows.Right.Right = lm.Position |
| case pb.FaceAnnotation_Landmark_LEFT_EYEBROW_UPPER_MIDPOINT: |
| face.Eyebrows.Left.Top = lm.Position |
| case pb.FaceAnnotation_Landmark_RIGHT_EYEBROW_UPPER_MIDPOINT: |
| face.Eyebrows.Right.Top = lm.Position |
| case pb.FaceAnnotation_Landmark_MIDPOINT_BETWEEN_EYES: |
| face.Nose.Top = lm.Position |
| case pb.FaceAnnotation_Landmark_NOSE_TIP: |
| face.Nose.Tip = lm.Position |
| case pb.FaceAnnotation_Landmark_UPPER_LIP: |
| face.Mouth.UpperLip = lm.Position |
| case pb.FaceAnnotation_Landmark_LOWER_LIP: |
| face.Mouth.LowerLip = lm.Position |
| case pb.FaceAnnotation_Landmark_MOUTH_LEFT: |
| face.Mouth.Left = lm.Position |
| case pb.FaceAnnotation_Landmark_MOUTH_RIGHT: |
| face.Mouth.Right = lm.Position |
| case pb.FaceAnnotation_Landmark_MOUTH_CENTER: |
| face.Mouth.Center = lm.Position |
| case pb.FaceAnnotation_Landmark_NOSE_BOTTOM_RIGHT: |
| face.Nose.Right = lm.Position |
| case pb.FaceAnnotation_Landmark_NOSE_BOTTOM_LEFT: |
| face.Nose.Left = lm.Position |
| case pb.FaceAnnotation_Landmark_NOSE_BOTTOM_CENTER: |
| face.Nose.Bottom = lm.Position |
| case pb.FaceAnnotation_Landmark_LEFT_EYE: |
| face.Eyes.Left.Center = lm.Position |
| case pb.FaceAnnotation_Landmark_RIGHT_EYE: |
| face.Eyes.Right.Center = lm.Position |
| case pb.FaceAnnotation_Landmark_LEFT_EYE_TOP_BOUNDARY: |
| face.Eyes.Left.Top = lm.Position |
| case pb.FaceAnnotation_Landmark_LEFT_EYE_RIGHT_CORNER: |
| face.Eyes.Left.Right = lm.Position |
| case pb.FaceAnnotation_Landmark_LEFT_EYE_BOTTOM_BOUNDARY: |
| face.Eyes.Left.Bottom = lm.Position |
| case pb.FaceAnnotation_Landmark_LEFT_EYE_LEFT_CORNER: |
| face.Eyes.Left.Left = lm.Position |
| case pb.FaceAnnotation_Landmark_RIGHT_EYE_TOP_BOUNDARY: |
| face.Eyes.Right.Top = lm.Position |
| case pb.FaceAnnotation_Landmark_RIGHT_EYE_RIGHT_CORNER: |
| face.Eyes.Right.Right = lm.Position |
| case pb.FaceAnnotation_Landmark_RIGHT_EYE_BOTTOM_BOUNDARY: |
| face.Eyes.Right.Bottom = lm.Position |
| case pb.FaceAnnotation_Landmark_RIGHT_EYE_LEFT_CORNER: |
| face.Eyes.Right.Left = lm.Position |
| case pb.FaceAnnotation_Landmark_LEFT_EYE_PUPIL: |
| face.Eyes.Left.Pupil = lm.Position |
| case pb.FaceAnnotation_Landmark_RIGHT_EYE_PUPIL: |
| face.Eyes.Right.Pupil = lm.Position |
| case pb.FaceAnnotation_Landmark_LEFT_EAR_TRAGION: |
| face.Ears.Left = lm.Position |
| case pb.FaceAnnotation_Landmark_RIGHT_EAR_TRAGION: |
| face.Ears.Right = lm.Position |
| case pb.FaceAnnotation_Landmark_FOREHEAD_GLABELLA: |
| face.Forehead = lm.Position |
| case pb.FaceAnnotation_Landmark_CHIN_GNATHION: |
| face.Chin.Center = lm.Position |
| case pb.FaceAnnotation_Landmark_CHIN_LEFT_GONION: |
| face.Chin.Left = lm.Position |
| case pb.FaceAnnotation_Landmark_CHIN_RIGHT_GONION: |
| face.Chin.Right = lm.Position |
| default: |
| log.Printf("vision: ignoring unknown face annotation landmark %s", lm.Type) |
| } |
| } |
| return face |
| } |