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. 6104eceec132dddf39cd55cc39235cb7df1de00f9eZhijun He * They are only required when the {@link CaptureResult} reports that the value of key 62b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He * {@link CaptureResult#STATISTICS_FACE_DETECT_MODE} is 63b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He * {@link CameraMetadata#STATISTICS_FACE_DETECT_MODE_FULL}. 64b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * If the id is {@value #ID_UNSUPPORTED} then the leftEyePosition, rightEyePosition, and 65b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * mouthPositions are guaranteed to be {@code null}. Otherwise, each of leftEyePosition, 66b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * rightEyePosition, and mouthPosition may be independently null or not-null.</p> 67b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 68b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @param bounds Bounds of the face. 69b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @param score Confidence level between {@value #SCORE_MIN}-{@value #SCORE_MAX}. 70b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @param id A unique ID per face visible to the tracker. 71b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @param leftEyePosition The position of the left eye. 72b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @param rightEyePosition The position of the right eye. 73b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @param mouthPosition The position of the mouth. 74b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 75b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @throws IllegalArgumentException 76b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * if bounds is {@code null}, 77b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * or if the confidence is not in the range of 78b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * {@value #SCORE_MIN}-{@value #SCORE_MAX}, 79b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * or if id is {@value #ID_UNSUPPORTED} and 80b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * leftEyePosition/rightEyePosition/mouthPosition aren't all null, 81b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * or else if id is negative. 82b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 83b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @hide 84b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin */ 85b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin public Face(Rect bounds, int score, int id, 86b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin Point leftEyePosition, Point rightEyePosition, Point mouthPosition) { 87b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin checkNotNull("bounds", bounds); 88b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin if (score < SCORE_MIN || score > SCORE_MAX) { 89b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin throw new IllegalArgumentException("Confidence out of range"); 90b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } else if (id < 0 && id != ID_UNSUPPORTED) { 91b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin throw new IllegalArgumentException("Id out of range"); 92b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } 93b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin if (id == ID_UNSUPPORTED) { 94b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin checkNull("leftEyePosition", leftEyePosition); 95b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin checkNull("rightEyePosition", rightEyePosition); 96b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin checkNull("mouthPosition", mouthPosition); 97b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } 98b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin 99b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin mBounds = bounds; 100b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin mScore = score; 101b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin mId = id; 102b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin mLeftEye = leftEyePosition; 103b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin mRightEye = rightEyePosition; 104b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin mMouth = mouthPosition; 105b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } 106b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin 107b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin /** 108b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * Create a new face without the optional fields. 109b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 110b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * <p>The id, leftEyePosition, rightEyePosition, and mouthPosition are considered optional. 111b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * If the id is {@value #ID_UNSUPPORTED} then the leftEyePosition, rightEyePosition, and 112b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * mouthPositions are guaranteed to be {@code null}. Otherwise, each of leftEyePosition, 113b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He * rightEyePosition, and mouthPosition may be independently null or not-null. When devices 114b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He * report the value of key {@link CaptureResult#STATISTICS_FACE_DETECT_MODE} as 11504eceec132dddf39cd55cc39235cb7df1de00f9eZhijun He * {@link CameraMetadata#STATISTICS_FACE_DETECT_MODE_SIMPLE} in {@link CaptureResult}, 116b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He * the face id of each face is expected to be {@value #ID_UNSUPPORTED}, the leftEyePosition, 117b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He * rightEyePosition, and mouthPositions are expected to be {@code null} for each face.</p> 118b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 119b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @param bounds Bounds of the face. 120b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @param score Confidence level between {@value #SCORE_MIN}-{@value #SCORE_MAX}. 121b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 122b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @throws IllegalArgumentException 123b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * if bounds is {@code null}, 124b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * or if the confidence is not in the range of 125b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * {@value #SCORE_MIN}-{@value #SCORE_MAX}. 126b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 127b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @hide 128b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin */ 129b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin public Face(Rect bounds, int score) { 130b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin this(bounds, score, ID_UNSUPPORTED, 131b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin /*leftEyePosition*/null, /*rightEyePosition*/null, /*mouthPosition*/null); 132b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } 133b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin 134b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin /** 135b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * Bounds of the face. 136b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 137b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * <p>A rectangle relative to the sensor's 13868f40066c914aefc1f88819dd46dd1135fb9f5bcIgor Murashkin * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE}, with (0,0) 139b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * representing the top-left corner of the active array rectangle.</p> 140b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 141b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * <p>There is no constraints on the the Rectangle value other than it 142b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * is not-{@code null}.</p> 143b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin */ 144b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin public Rect getBounds() { 145b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin return mBounds; 146b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } 147b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin 148b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin /** 149b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * The confidence level for the detection of the face. 150b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 151b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * <p>The range is {@value #SCORE_MIN} to {@value #SCORE_MAX}. 152b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * {@value #SCORE_MAX} is the highest confidence.</p> 153b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 154b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * <p>Depending on the device, even very low-confidence faces may be 155b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * listed, so applications should filter out faces with low confidence, 156b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * depending on the use case. For a typical point-and-shoot camera 157b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * application that wishes to display rectangles around detected faces, 158b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * filtering out faces with confidence less than half of {@value #SCORE_MAX} 159b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * is recommended.</p> 160b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 161b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @see #SCORE_MAX 162b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @see #SCORE_MIN 163b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin */ 164b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin public int getScore() { 165b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin return mScore; 166b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } 167b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin 168b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin /** 169b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * An unique id per face while the face is visible to the tracker. 170b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 171b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * <p> 172b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * If the face leaves the field-of-view and comes back, it will get a new 173b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * id.</p> 174b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 175b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * <p>This is an optional field, may not be supported on all devices. 176b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * If the id is {@value #ID_UNSUPPORTED} then the leftEyePosition, rightEyePosition, and 177b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * mouthPositions are guaranteed to be {@code null}. Otherwise, each of leftEyePosition, 178b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He * rightEyePosition, and mouthPosition may be independently null or not-null. When devices 179b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He * report the value of key {@link CaptureResult#STATISTICS_FACE_DETECT_MODE} as 18004eceec132dddf39cd55cc39235cb7df1de00f9eZhijun He * {@link CameraMetadata#STATISTICS_FACE_DETECT_MODE_SIMPLE} in {@link CaptureResult}, 181b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He * the face id of each face is expected to be {@value #ID_UNSUPPORTED}.</p> 182b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 183b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * <p>This value will either be {@value #ID_UNSUPPORTED} or 184b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * otherwise greater than {@code 0}.</p> 185b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 186b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @see #ID_UNSUPPORTED 187b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin */ 188b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin public int getId() { 189b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin return mId; 190b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } 191b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin 192b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin /** 193b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * The coordinates of the center of the left eye. 194b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 195b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * <p>The coordinates are in 196b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * the same space as the ones for {@link #getBounds}. This is an 197b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * optional field, may not be supported on all devices. If not 198b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * supported, the value will always be set to null. 199b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * This value will always be null only if {@link #getId()} returns 200b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * {@value #ID_UNSUPPORTED}.</p> 201b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 202b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @return The left eye position, or {@code null} if unknown. 203b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin */ 204b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin public Point getLeftEyePosition() { 205b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin return mLeftEye; 206b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } 207b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin 208b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin /** 209b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * The coordinates of the center of the right eye. 210b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 211b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * <p>The coordinates are 212b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * in the same space as the ones for {@link #getBounds}.This is an 213b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * optional field, may not be supported on all devices. If not 214b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * supported, the value will always be set to null. 215b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * This value will always be null only if {@link #getId()} returns 216b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * {@value #ID_UNSUPPORTED}.</p> 217b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 218b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @return The right eye position, or {@code null} if unknown. 219b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin */ 220b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin public Point getRightEyePosition() { 221b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin return mRightEye; 222b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } 223b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin 224b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin /** 225b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * The coordinates of the center of the mouth. 226b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 227b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * <p>The coordinates are in 228b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * the same space as the ones for {@link #getBounds}. This is an optional 229b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * field, may not be supported on all devices. If not 230b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * supported, the value will always be set to null. 231b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * This value will always be null only if {@link #getId()} returns 232b7bfdc7cf7f45805e8e7ebea77a15051b8ad3e8dZhijun He * {@value #ID_UNSUPPORTED}.</p> 233b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * </p> 234b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * 235b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * @return The mouth position, or {@code null} if unknown. 236b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin */ 237b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin public Point getMouthPosition() { 238b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin return mMouth; 239b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } 240b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin 241b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin /** 242b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin * Represent the Face as a string for debugging purposes. 243b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin */ 244b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin @Override 245b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin public String toString() { 246b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin return String.format("{ bounds: %s, score: %s, id: %d, " + 247b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin "leftEyePosition: %s, rightEyePosition: %s, mouthPosition: %s }", 248b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin mBounds, mScore, mId, mLeftEye, mRightEye, mMouth); 249b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } 250b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin 251b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin private static void checkNotNull(String name, Object obj) { 252b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin if (obj == null) { 253b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin throw new IllegalArgumentException(name + " was required, but it was null"); 254b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } 255b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } 256b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin 257b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin private static void checkNull(String name, Object obj) { 258b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin if (obj != null) { 259b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin throw new IllegalArgumentException(name + " was required to be null, but it wasn't"); 260b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } 261b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin } 262b779ac1e2e3e463aa49442ac801dde410f22dc73Igor Murashkin} 263