2 * Copyright 2009 (c) Florian Frankenberger (darkblue.de)
4 * This file is part of LEA.
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
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
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/>.
21 * This is the main class of LEA.
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.
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
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>).
40 * Example (for using LEA with <code>Java Media Framework</code>):
43 * LEA lea = new LEA(new JMFCaptureDevice(), true);
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.
51 * @author Florian Frankenberger
53 @LATTICE("LAST<DEV,DEV<POS,POS<IMPL")
54 @METHODDEFAULT("OUT<THIS,THIS<IN,THISLOC=THIS,RETURNLOC=OUT")
58 private LEAImplementation implementation;
60 private FaceAndEyePosition lastPositions = new FaceAndEyePosition(null, null);
62 private DeviationScanner deviationScanner = new DeviationScanner();
65 // this.imageProcessor = new
66 // ImageProcessor(this.captureDevice.getFrameRate());
67 implementation = new LEAImplementation();
71 * Clears the internal movement buffer. If you just capture some of the eye
72 * movements you should call this every time you start recording the
73 * movements. Otherwise you may get notified for movements that took place
74 * BEFORE you started recording.
77 // this.imageProcessor.clearDeviationScanner();
81 * @METHOD To test LEA with the first capture device from the
82 * <code>Java Media Framework</code> just start from here.
87 public static void main(String[] args) throws Exception {
92 @LATTICE("THIS<IMG,IMG<C,C*,THISLOC=THIS")
95 @LOC("C") int maxCount = 37;
98 SSJAVA: while (i < maxCount) {
99 @LOC("IMG") Image image = ImageReader.readImage("data/b" + i + ".bmp");
107 System.out.println("Done.");
111 private void processImage(@LOC("IN") Image image) {
112 @LOC("THIS,LEA.POS") FaceAndEyePosition positions = implementation.getEyePosition(image);
113 if (positions.getEyePosition() != null) {
114 deviationScanner.addEyePosition(positions.getEyePosition());
115 @LOC("THIS,LEA.DEV,DeviationScanner.DEV") int deviation =
116 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);
122 lastPositions = positions;