001/** 002 * Copyright (c) 2011, The University of Southampton and the individual contributors. 003 * All rights reserved. 004 * 005 * Redistribution and use in source and binary forms, with or without modification, 006 * are permitted provided that the following conditions are met: 007 * 008 * * Redistributions of source code must retain the above copyright notice, 009 * this list of conditions and the following disclaimer. 010 * 011 * * Redistributions in binary form must reproduce the above copyright notice, 012 * this list of conditions and the following disclaimer in the documentation 013 * and/or other materials provided with the distribution. 014 * 015 * * Neither the name of the University of Southampton nor the names of its 016 * contributors may be used to endorse or promote products derived from this 017 * software without specific prior written permission. 018 * 019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 020 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 021 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 022 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 023 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 026 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 028 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 029 */ 030package org.openimaj.tools.faces.recognition.options; 031 032import org.kohsuke.args4j.CmdLineOptionsProvider; 033import org.kohsuke.args4j.Option; 034import org.openimaj.image.FImage; 035import org.openimaj.image.Image; 036import org.openimaj.image.processing.face.detection.DetectedFace; 037import org.openimaj.image.processing.face.detection.FaceDetector; 038import org.openimaj.image.processing.face.detection.HaarCascadeDetector; 039import org.openimaj.image.processing.face.detection.IdentityFaceDetector; 040 041/** 042 * Face detector configuration for the tools 043 * 044 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk) 045 * 046 */ 047public class FaceDetectors { 048 /** 049 * Interface for providers of {@link FaceDetector}s 050 * 051 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk) 052 * 053 * @param <FACE> 054 * type of {@link DetectedFace} 055 * @param <IMAGE> 056 * type of {@link Image} that the detector works on 057 */ 058 public interface FaceDetectorProvider<FACE extends DetectedFace, IMAGE extends Image<?, IMAGE>> { 059 /** 060 * @return the detector 061 */ 062 public FaceDetector<FACE, IMAGE> getDetector(); 063 } 064 065 /** 066 * Any type of basic {@link FImage} detector. Doesn't include the enhanced 067 * detectors that wrap other detectors. 068 * 069 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk) 070 * 071 */ 072 public enum AnyBasicFImageDetector implements CmdLineOptionsProvider { 073 /** 074 * @see IdentityFaceDetector 075 */ 076 Identity { 077 @Override 078 public FaceDetectorProvider<DetectedFace, FImage> getOptions() { 079 return new IdentityProvider<FImage>(); 080 } 081 }, 082 /** 083 * @see HaarCascadeDetector 084 */ 085 Haar { 086 @Override 087 public FaceDetectorProvider<DetectedFace, FImage> getOptions() { 088 return new HaarCascadeProvider(); 089 } 090 }, 091 ; 092 093 @Override 094 public abstract FaceDetectorProvider<DetectedFace, FImage> getOptions(); 095 } 096 097 private static class IdentityProvider<IMAGE extends Image<?, IMAGE>> 098 implements 099 FaceDetectorProvider<DetectedFace, IMAGE> 100 { 101 @Override 102 public FaceDetector<DetectedFace, IMAGE> getDetector() { 103 return new IdentityFaceDetector<IMAGE>(); 104 } 105 } 106 107 private static class HaarCascadeProvider implements FaceDetectorProvider<DetectedFace, FImage> { 108 @Option(name = "--cascade", usage = "Haar Cascade", required = false) 109 HaarCascadeDetector.BuiltInCascade cascade = HaarCascadeDetector.BuiltInCascade.frontalface_alt2; 110 111 @Option(name = "--min-size", usage = "Minimum detection size", required = false) 112 int minSize = 80; 113 114 @Override 115 public FaceDetector<DetectedFace, FImage> getDetector() { 116 final HaarCascadeDetector fd = cascade.load(); 117 fd.setMinSize(minSize); 118 119 return fd; 120 } 121 } 122}