Face.java revision b779ac1e2e3e463aa49442ac801dde410f22dc73
1b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin/*
2b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * Copyright (C) 2013 The Android Open Source Project
3b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin *
4b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * you may not use this file except in compliance with the License.
6b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * You may obtain a copy of the License at
7b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin *
8b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin *
10b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * Unless required by applicable law or agreed to in writing, software
11b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * See the License for the specific language governing permissions and
14b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * limitations under the License.
15b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin */
16b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
17b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
18b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkinpackage android.hardware.camera2;
19b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
20b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkinimport android.graphics.Point;
21b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkinimport android.graphics.Rect;
22b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
23b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin/**
24b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * Describes a face detected in an image.
25b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin */
26b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkinpublic final class Face {
27b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
28b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
29b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * The ID is {@code -1} when the optional set of fields is unsupported.
30b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
31b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @see Face#Face(Rect, int)
32b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @see #getId()
33b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
34b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public static final int ID_UNSUPPORTED = -1;
35b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
36b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
37b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * The minimum possible value for the confidence level.
38b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
39b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @see #getScore()
40b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
41b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public static final int SCORE_MIN = 1;
42b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
43b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
44b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * The maximum possible value for the confidence level.
45b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
46b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @see #getScore()
47b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
48b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public static final int SCORE_MAX = 100;
49b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
50b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private final Rect mBounds;
51b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private final int mScore;
52b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private final int mId;
53b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private final Point mLeftEye;
54b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private final Point mRightEye;
55b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private final Point mMouth;
56b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
57b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
58b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * Create a new face with all fields set.
59b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
60b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>The id, leftEyePosition, rightEyePosition, and mouthPosition are considered optional.
61b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * If the id is {@value #ID_UNSUPPORTED} then the leftEyePosition, rightEyePosition, and
62b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * mouthPositions are guaranteed to be {@code null}. Otherwise, each of leftEyePosition,
63b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * rightEyePosition, and mouthPosition may be independently null or not-null.</p>
64b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
65b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param bounds Bounds of the face.
66b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param score Confidence level between {@value #SCORE_MIN}-{@value #SCORE_MAX}.
67b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param id A unique ID per face visible to the tracker.
68b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param leftEyePosition The position of the left eye.
69b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param rightEyePosition The position of the right eye.
70b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param mouthPosition The position of the mouth.
71b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
72b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @throws IllegalArgumentException
73b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             if bounds is {@code null},
74b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             or if the confidence is not in the range of
75b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             {@value #SCORE_MIN}-{@value #SCORE_MAX},
76b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             or if id is {@value #ID_UNSUPPORTED} and
77b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *               leftEyePosition/rightEyePosition/mouthPosition aren't all null,
78b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             or else if id is negative.
79b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
80b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @hide
81b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
82b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public Face(Rect bounds, int score, int id,
83b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            Point leftEyePosition, Point rightEyePosition, Point mouthPosition) {
84b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        checkNotNull("bounds", bounds);
85b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        if (score < SCORE_MIN || score > SCORE_MAX) {
86b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            throw new IllegalArgumentException("Confidence out of range");
87b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        } else if (id < 0 && id != ID_UNSUPPORTED) {
88b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            throw new IllegalArgumentException("Id out of range");
89b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        }
90b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        if (id == ID_UNSUPPORTED) {
91b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            checkNull("leftEyePosition", leftEyePosition);
92b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            checkNull("rightEyePosition", rightEyePosition);
93b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            checkNull("mouthPosition", mouthPosition);
94b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        }
95b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
96b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        mBounds = bounds;
97b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        mScore = score;
98b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        mId = id;
99b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        mLeftEye = leftEyePosition;
100b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        mRightEye = rightEyePosition;
101b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        mMouth = mouthPosition;
102b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
103b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
104b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
105b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * Create a new face without the optional fields.
106b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
107b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>The id, leftEyePosition, rightEyePosition, and mouthPosition are considered optional.
108b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * If the id is {@value #ID_UNSUPPORTED} then the leftEyePosition, rightEyePosition, and
109b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * mouthPositions are guaranteed to be {@code null}. Otherwise, each of leftEyePosition,
110b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * rightEyePosition, and mouthPosition may be independently null or not-null.</p>
111b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
112b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param bounds Bounds of the face.
113b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @param score Confidence level between {@value #SCORE_MIN}-{@value #SCORE_MAX}.
114b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
115b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @throws IllegalArgumentException
116b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             if bounds is {@code null},
117b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             or if the confidence is not in the range of
118b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *             {@value #SCORE_MIN}-{@value #SCORE_MAX}.
119b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
120b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @hide
121b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
122b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public Face(Rect bounds, int score) {
123b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        this(bounds, score, ID_UNSUPPORTED,
124b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin                /*leftEyePosition*/null, /*rightEyePosition*/null, /*mouthPosition*/null);
125b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
126b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
127b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
128b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * Bounds of the face.
129b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
130b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>A rectangle relative to the sensor's
131b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * {@link CameraProperties#SENSOR_INFO_ACTIVE_ARRAY_SIZE}, with (0,0)
132b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * representing the top-left corner of the active array rectangle.</p>
133b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
134b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>There is no constraints on the the Rectangle value other than it
135b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * is not-{@code null}.</p>
136b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
137b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public Rect getBounds() {
138b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        return mBounds;
139b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
140b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
141b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
142b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * The confidence level for the detection of the face.
143b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
144b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>The range is {@value #SCORE_MIN} to {@value #SCORE_MAX}.
145b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * {@value #SCORE_MAX} is the highest confidence.</p>
146b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
147b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>Depending on the device, even very low-confidence faces may be
148b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * listed, so applications should filter out faces with low confidence,
149b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * depending on the use case. For a typical point-and-shoot camera
150b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * application that wishes to display rectangles around detected faces,
151b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * filtering out faces with confidence less than half of {@value #SCORE_MAX}
152b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * is recommended.</p>
153b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
154b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @see #SCORE_MAX
155b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @see #SCORE_MIN
156b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
157b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public int getScore() {
158b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        return mScore;
159b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
160b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
161b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
162b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * An unique id per face while the face is visible to the tracker.
163b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
164b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>
165b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * If the face leaves the field-of-view and comes back, it will get a new
166b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * id.</p>
167b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
168b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>This is an optional field, may not be supported on all devices.
169b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * If the id is {@value #ID_UNSUPPORTED} then the leftEyePosition, rightEyePosition, and
170b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * mouthPositions are guaranteed to be {@code null}. Otherwise, each of leftEyePosition,
171b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * rightEyePosition, and mouthPosition may be independently null or not-null.</p>
172b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
173b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>This value will either be {@value #ID_UNSUPPORTED} or
174b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * otherwise greater than {@code 0}.</p>
175b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
176b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @see #ID_UNSUPPORTED
177b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
178b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public int getId() {
179b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        return mId;
180b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
181b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
182b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
183b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * The coordinates of the center of the left eye.
184b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
185b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>The coordinates are in
186b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * the same space as the ones for {@link #getBounds}. This is an
187b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * optional field, may not be supported on all devices. If not
188b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * supported, the value will always be set to null.
189b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * This value will  always be null only if {@link #getId()} returns
190b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * {@value #ID_UNSUPPORTED}.</p>
191b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
192b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @return The left eye position, or {@code null} if unknown.
193b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
194b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public Point getLeftEyePosition() {
195b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        return mLeftEye;
196b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
197b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
198b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
199b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * The coordinates of the center of the right eye.
200b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
201b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>The coordinates are
202b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * in the same space as the ones for {@link #getBounds}.This is an
203b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * optional field, may not be supported on all devices. If not
204b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * supported, the value will always be set to null.
205b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * This value will  always be null only if {@link #getId()} returns
206b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * {@value #ID_UNSUPPORTED}.</p>
207b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
208b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @return The right eye position, or {@code null} if unknown.
209b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
210b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public Point getRightEyePosition() {
211b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        return mRightEye;
212b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
213b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
214b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
215b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * The coordinates of the center of the mouth.
216b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
217b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * <p>The coordinates are in
218b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * the same space as the ones for {@link #getBounds}. This is an optional
219b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * field, may not be supported on all devices. If not
220b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * supported, the value will always be set to null.
221b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * This value will  always be null only if {@link #getId()} returns
222b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * {@value #ID_UNSUPPORTED}.</p> them are.
223b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * </p>
224b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     *
225b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * @return The mouth position, or {@code null} if unknown.
226b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
227b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public Point getMouthPosition() {
228b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        return mMouth;
229b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
230b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
231b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    /**
232b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     * Represent the Face as a string for debugging purposes.
233b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin     */
234b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    @Override
235b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    public String toString() {
236b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        return String.format("{ bounds: %s, score: %s, id: %d, " +
237b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin                "leftEyePosition: %s, rightEyePosition: %s, mouthPosition: %s }",
238b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin                mBounds, mScore, mId, mLeftEye, mRightEye, mMouth);
239b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
240b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
241b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private static void checkNotNull(String name, Object obj) {
242b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        if (obj == null) {
243b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            throw new IllegalArgumentException(name + " was required, but it was null");
244b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        }
245b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
246b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin
247b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    private static void checkNull(String name, Object obj) {
248b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        if (obj != null) {
249b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin            throw new IllegalArgumentException(name + " was required to be null, but it wasn't");
250b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin        }
251b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin    }
252b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin}
253