1 /** 2 * FaceTracker Licence 3 * ------------------- 4 * (Academic, non-commercial, not-for-profit licence) 5 * 6 * Copyright (c) 2010 Jason Mora Saragih 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions are met: 11 * 12 * * The software is provided under the terms of this licence stricly for 13 * academic, non-commercial, not-for-profit purposes. 14 * * Redistributions of source code must retain the above copyright notice, 15 * this list of conditions (licence) and the following disclaimer. 16 * * Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions (licence) and the following disclaimer 18 * in the documentation and/or other materials provided with the 19 * distribution. 20 * * The name of the author may not be used to endorse or promote products 21 * derived from this software without specific prior written permission. 22 * * As this software depends on other libraries, the user must adhere to and 23 * keep in place any licencing terms of those libraries. 24 * * Any publications arising from the use of this software, including but 25 * not limited to academic journal and conference publications, technical 26 * reports and manuals, must cite the following work: 27 * 28 * J. M. Saragih, S. Lucey, and J. F. Cohn. Face Alignment through Subspace 29 * Constrained Mean-Shifts. International Journal of Computer Vision 30 * (ICCV), September, 2009. 31 * 32 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED 33 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 34 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 35 * EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 36 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 37 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 38 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 39 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 40 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 41 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 42 */ 43 package com.jsaragih; 44 45 import java.io.BufferedReader; 46 import java.io.BufferedWriter; 47 import java.io.FileNotFoundException; 48 import java.io.FileReader; 49 import java.io.FileWriter; 50 import java.io.IOException; 51 import java.util.Scanner; 52 53 import org.openimaj.image.FImage; 54 55 import Jama.Matrix; 56 57 /** 58 * Multiple face checker 59 * 60 * @author Jason Mora Saragih 61 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk) 62 */ 63 public class MFCheck { 64 static { Tracker.init(); } 65 66 /** FCheck for each view */ 67 FCheck[] _fcheck; 68 69 static MFCheck load(final String fname) throws FileNotFoundException { 70 BufferedReader br = null; 71 try { 72 br = new BufferedReader(new FileReader(fname)); 73 Scanner sc = new Scanner(br); 74 return read(sc, true); 75 } finally { 76 try { 77 br.close(); 78 } catch (IOException e) { 79 } 80 } 81 } 82 83 void save(final String fname) throws IOException { 84 BufferedWriter bw = null; 85 try { 86 bw = new BufferedWriter(new FileWriter(fname)); 87 88 write(bw); 89 } finally { 90 try { 91 if (bw != null) 92 bw.close(); 93 } catch (IOException e) { 94 } 95 } 96 } 97 98 void write(BufferedWriter s) throws IOException { 99 s.write(IO.Types.MFCHECK.ordinal() + " " + _fcheck.length + " "); 100 101 for (int i = 0; i < _fcheck.length; i++) 102 _fcheck[i].write(s); 103 } 104 105 /** 106 * Read the a {@link MFCheck} 107 * 108 * @param s 109 * @param readType 110 * @return the {@link MFCheck} 111 */ 112 public static MFCheck read(Scanner s, boolean readType) { 113 if (readType) { 114 int type = s.nextInt(); 115 assert (type == IO.Types.MFCHECK.ordinal()); 116 } 117 118 MFCheck mfcheck = new MFCheck(); 119 120 int n = s.nextInt(); 121 mfcheck._fcheck = new FCheck[n]; 122 123 for (int i = 0; i < n; i++) 124 mfcheck._fcheck[i] = FCheck.read(s, true); 125 126 return mfcheck; 127 } 128 129 /** 130 * Check the whether its actually a face 131 * @param idx 132 * @param im 133 * @param s 134 * @return true if face; false otherwise 135 */ 136 public boolean check(int idx, FImage im, Matrix s) { 137 assert ((idx >= 0) && (idx < _fcheck.length)); 138 139 return _fcheck[idx].check(im, s); 140 } 141 }