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.localfeature;
031
032import java.io.File;
033import java.io.IOException;
034import java.util.concurrent.ThreadPoolExecutor;
035
036import org.kohsuke.args4j.CmdLineException;
037import org.kohsuke.args4j.CmdLineParser;
038import org.openimaj.feature.local.LocalFeature;
039import org.openimaj.feature.local.list.LocalFeatureList;
040import org.openimaj.io.IOUtils;
041import org.openimaj.time.Timer;
042import org.openimaj.tools.localfeature.options.BatchExtractorOptions;
043import org.openimaj.util.function.Operation;
044import org.openimaj.util.parallel.Parallel;
045
046/**
047 * Tool for extracting local features
048 * 
049 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk)
050 */
051public class BatchExtractor {
052        /**
053         * Run the tool
054         * 
055         * @param args
056         * @throws IOException
057         */
058        public static void main(String[] args) throws IOException {
059                final BatchExtractorOptions options = new BatchExtractorOptions();
060                final CmdLineParser parser = new CmdLineParser(options);
061
062                try {
063                        parser.parseArgument(args);
064                } catch (final CmdLineException e) {
065                        System.err.println(e.getMessage());
066                        System.err.println("Usage: java -jar LocalFeaturesTool.jar BatchExtractor [options]");
067                        parser.printUsage(System.err);
068                        return;
069                }
070
071                final ThreadPoolExecutor pool = options.getThreadPool();
072
073                Parallel.forEach(options.getInputs(), new Operation<File>() {
074                        @Override
075                        public void perform(File input) {
076                                try {
077                                        final byte[] img = options.getInputImage(input);
078
079                                        final Timer timing = Timer.timer();
080                                        final LocalFeatureList<? extends LocalFeature<?, ?>> kpl = options.getMode().extract(img);
081                                        timing.stop();
082
083                                        if (options.printTiming()) {
084                                                System.out.println("Took: " + timing.duration());
085                                        }
086
087                                        if (options.isAsciiMode()) {
088                                                IOUtils.writeASCII(options.getOutput(input), kpl);
089                                        } else {
090                                                IOUtils.writeBinary(options.getOutput(input), kpl);
091                                        }
092                                } catch (final IOException e) {
093                                        System.err.println(e);
094                                }
095                        }
096                }, pool);
097
098                options.serialiseExtractor();
099        }
100}