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