1) it passes the linear type checking 2) start annotations 3) removes unnecessary...
[IRC.git] / Robust / src / Benchmarks / SSJava / EyeTracking / LEA.java
1 /*
2  * Copyright 2009 (c) Florian Frankenberger (darkblue.de)
3  * 
4  * This file is part of LEA.
5  * 
6  * LEA is free software: you can redistribute it and/or modify it under the
7  * terms of the GNU Lesser General Public License as published by the Free
8  * Software Foundation, either version 3 of the License, or (at your option) any
9  * later version.
10  * 
11  * LEA is distributed in the hope that it will be useful, but WITHOUT ANY
12  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13  * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
14  * details.
15  * 
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with LEA. If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 /**
21  * This is the main class of LEA.
22  * <p>
23  * It uses a face detection algorithm to find an a face within the provided
24  * image(s). Then it searches for the eye in a region where it most likely
25  * located and traces its position relative to the face and to the last known
26  * position. The movements are estimated by comparing more than one movement. If
27  * a movement is distinctly pointing to a direction it is recognized and all
28  * listeners get notified.
29  * <p>
30  * The notification is designed as observer pattern. You simply call
31  * <code>addEyeMovementListener(IEyeMovementListener)</code> to add an
32  * implementation of <code>IEyeMovementListener</code> to LEA. When a face is
33  * recognized/lost or whenever an eye movement is detected LEA will call the
34  * appropriate methods of the listener
35  * <p>
36  * LEA also needs an image source implementing the <code>ICaptureDevice</code>.
37  * One image source proxy to the <code>Java Media Framework</code> is included (
38  * <code>JMFCaptureDevice</code>).
39  * <p>
40  * Example (for using LEA with <code>Java Media Framework</code>):
41  * <p>
42  * <code>
43  * LEA lea = new LEA(new JMFCaptureDevice(), true);
44  * </code>
45  * <p>
46  * This will start LEA with the first available JMF datasource with an extra
47  * status window showing if face/eye has been detected successfully. Please note
48  * that face detection needs about 2 seconds to find a face. After detection the
49  * following face detection is much faster.
50  * 
51  * @author Florian Frankenberger
52  */
53 public class LEA {
54
55   private boolean shutdown = false;
56   private LEAImplementation implementation;
57
58   private FaceAndEyePosition lastPositions = new FaceAndEyePosition(null, null);
59   private DeviationScanner deviationScanner = new DeviationScanner();
60   private int counter = 0;
61
62   public LEA() {
63     // this.imageProcessor = new
64     // ImageProcessor(this.captureDevice.getFrameRate());
65     implementation = new LEAImplementation();
66   }
67
68   /**
69    * Clears the internal movement buffer. If you just capture some of the eye
70    * movements you should call this every time you start recording the
71    * movements. Otherwise you may get notified for movements that took place
72    * BEFORE you started recording.
73    */
74   public void clear() {
75     // this.imageProcessor.clearDeviationScanner();
76   }
77
78   /**
79    * To test LEA with the first capture device from the
80    * <code>Java Media Framework</code> just start from here.
81    * 
82    * @param args
83    * @throws Exception
84    */
85   public static void main(String[] args) throws Exception {
86     LEA lea = new LEA();
87     lea.doRun();
88   }
89
90   public void doRun() {
91
92     int maxCount = 37;
93     int i = 0;
94
95     ImageReader reader = new ImageReader();
96
97     SSJAVA: while (i < maxCount) {
98       Image image = reader.readImage("data/b" + i + ".bmp");
99       i++;
100       if (image == null) {
101         break;
102       }
103       processImage(image);
104     }
105
106     System.out.println("Done.");
107
108   }
109
110   private void processImage(Image image) {
111
112     FaceAndEyePosition positions = implementation.getEyePosition(image);
113
114     if (positions.getEyePosition() != null) {
115       deviationScanner.addEyePosition(positions.getEyePosition());
116       int deviation = deviationScanner.scanForDeviation(positions.getFacePosition());// positions.getEyePosition().getDeviation(lastPositions.getEyePosition());
117       if (deviation != DeviationScanner.NONE) {
118         System.out.println("deviation=" + deviationScanner.toStringDeviation(deviation));
119         // notifyEyeMovementListenerEyeMoved(deviation);
120       }
121     }
122     lastPositions = positions;
123   }
124
125 }