2 * Copyright 2009 (c) Florian Frankenberger (darkblue.de)
\r
4 * This file is part of LEA.
\r
6 * LEA is free software: you can redistribute it and/or modify it under the
\r
7 * terms of the GNU Lesser General Public License as published by the Free
\r
8 * Software Foundation, either version 3 of the License, or (at your option) any
\r
11 * LEA is distributed in the hope that it will be useful, but WITHOUT ANY
\r
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
\r
13 * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
\r
16 * You should have received a copy of the GNU Lesser General Public License
\r
17 * along with LEA. If not, see <http://www.gnu.org/licenses/>.
\r
21 * No description given.
\r
23 * @author Florian Frankenberger
\r
25 public class DeviationScanner {
\r
27 private EyePosition eyePositions[];
\r
29 // LEFT_UP(+1, -1), UP(0, -1), RIGHT_UP(-1, -1), LEFT(+1, 0), NONE(0, 0),
\r
30 // RIGHT(-1, 0), LEFT_DOWN(
\r
31 // +1, +1), DOWN(0, +1), RIGHT_DOWN(-1, +1);
\r
33 private static final Deviation LEFT_UP = new Deviation("LEFT_UP", +1, -1);
\r
34 private static final Deviation UP = new Deviation("UP", 0, -1);
\r
35 private static final Deviation RIGHT_UP = new Deviation("RIGHT_UP", -1, -1);
\r
36 private static final Deviation LEFT = new Deviation("LEFT", +1, 0);
\r
37 private static final Deviation NONE = new Deviation("NONE", 0, 0);
\r
38 private static final Deviation RIGHT = new Deviation("RIGHT", -1, 0);
\r
39 private static final Deviation LEFT_DOWN = new Deviation("LEFT_DOWN", +1, +1);
\r
40 private static final Deviation DOWN = new Deviation("DOWN", 0, +1);
\r
41 private static final Deviation RIGHT_DOWN = new Deviation("RIGHT_DOWN", -1, +1);
\r
45 public DeviationScanner() {
\r
46 eyePositions = new EyePosition[3];
\r
50 public void addEyePosition(EyePosition eyePosition) {
\r
52 for (int i = 1; i < eyePositions.length; i++) {
\r
53 eyePositions[i - 1] = eyePositions[i];
\r
55 eyePositions[eyePositions.length - 1] = eyePosition;
\r
57 if (size < eyePositions.length) {
\r
62 public int getEyePositionsSize() {
\r
66 public Deviation scanForDeviation(Rectangle2D faceRect) {
\r
67 Deviation deviation = NONE;
\r
68 if (getEyePositionsSize() >= 3) {
\r
69 double deviationX = 0;
\r
70 double deviationY = 0;
\r
72 EyePosition lastEyePosition = null;
\r
73 for (int i = 0; i < 3; ++i) {
\r
74 EyePosition eyePosition = this.eyePositions[i];
\r
75 if (lastEyePosition != null) {
\r
76 deviationX += (eyePosition.getX() - lastEyePosition.getX());
\r
77 deviationY += (eyePosition.getY() - lastEyePosition.getY());
\r
79 lastEyePosition = eyePosition;
\r
82 final double deviationPercentX = 0.04;
\r
83 final double deviationPercentY = 0.04;
\r
85 deviationX /= faceRect.getWidth();
\r
86 deviationY /= faceRect.getWidth();
\r
88 int deviationAbsoluteX = 0;
\r
89 int deviationAbsoluteY = 0;
\r
90 if (deviationX > deviationPercentX)
\r
91 deviationAbsoluteX = 1;
\r
92 if (deviationX < -deviationPercentX)
\r
93 deviationAbsoluteX = -1;
\r
94 if (deviationY > deviationPercentY)
\r
95 deviationAbsoluteY = 1;
\r
96 if (deviationY < -deviationPercentY)
\r
97 deviationAbsoluteY = -1;
\r
99 deviation = getDirectionFor(deviationAbsoluteX, deviationAbsoluteY);
\r
101 if (deviation != NONE) {
\r
102 eyePositions = new EyePosition[3];
\r
105 // System.out.println(String.format("%.2f%% | %.2f%% => %d and %d >>> %s",
\r
106 // deviationX*100, deviationY*100, deviationAbsoluteX, deviationAbsoluteY,
\r
107 // deviation.toString()));
\r
114 public static Deviation getDirectionFor(int directionX, int directionY) {
\r
116 if (LEFT_UP.concurs(directionX, directionY)) {
\r
118 } else if (UP.concurs(directionX, directionY)) {
\r
120 } else if (RIGHT_UP.concurs(directionX, directionY)) {
\r
122 } else if (LEFT.concurs(directionX, directionY)) {
\r
124 } else if (NONE.concurs(directionX, directionY)) {
\r
126 } else if (RIGHT.concurs(directionX, directionY)) {
\r
128 } else if (LEFT_DOWN.concurs(directionX, directionY)) {
\r
130 } else if (DOWN.concurs(directionX, directionY)) {
\r
132 } else if (RIGHT_DOWN.concurs(directionX, directionY)) {
\r
138 public void clear() {
\r
139 System.out.println("CLEAR");
\r
140 eyePositions = new EyePosition[3];
\r