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