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.image.feature.local.detector.dog.collector;
031
032import org.openimaj.feature.local.LocalFeature;
033import org.openimaj.feature.local.list.LocalFeatureList;
034import org.openimaj.feature.local.list.MemoryLocalFeatureList;
035import org.openimaj.image.FImage;
036import org.openimaj.image.Image;
037import org.openimaj.image.analysis.pyramid.Octave;
038import org.openimaj.image.feature.local.extraction.FeatureVectorExtractor;
039import org.openimaj.image.feature.local.extraction.ScaleSpaceImageExtractorProperties;
040import org.openimaj.image.processor.SinglebandImageProcessor;
041
042/**
043 * Abstract base class for objects that collate {@link LocalFeature}s as they
044 * are extracted from {@link Octave}s. This base class holds a generic list for
045 * storing the features and a reference to the feature extractor instance that
046 * is responsible for extracting the feature vectors.
047 * 
048 * Typically the same AbstractOctaveLocalFeatureCollector will be used across
049 * all Octaves, and will thus contain all the features from the image.
050 * 
051 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk)
052 * 
053 * @param <OCTAVE>
054 *            the type of {@link Octave} from which features are extracted
055 * @param <EXTRACTOR>
056 *            the type of {@link FeatureVectorExtractor} which extracts the
057 *            feature vectors
058 * @param <FEATURE>
059 *            the type of {@link LocalFeature} which are extracted
060 * @param <IMAGE>
061 *            the type of {@link Image} from which features are extracted
062 */
063public abstract class AbstractOctaveLocalFeatureCollector<OCTAVE extends Octave<?, ?, IMAGE>, EXTRACTOR extends FeatureVectorExtractor<?, ScaleSpaceImageExtractorProperties<IMAGE>>, FEATURE extends LocalFeature<?, ?>, IMAGE extends Image<?, IMAGE> & SinglebandImageProcessor.Processable<Float, FImage, IMAGE>>
064                implements
065                Collector<OCTAVE, FEATURE, IMAGE>
066{
067        protected EXTRACTOR featureExtractor;
068        protected LocalFeatureList<FEATURE> features = new MemoryLocalFeatureList<FEATURE>();
069
070        /**
071         * Construct the AbstractOctaveLocalFeatureCollector with the given feature
072         * extractor.
073         * 
074         * @param featureExtractor
075         *            the feature extractor
076         */
077        public AbstractOctaveLocalFeatureCollector(EXTRACTOR featureExtractor) {
078                this.featureExtractor = featureExtractor;
079        }
080
081        /**
082         * Get the list of features collected.
083         * 
084         * @return the features
085         */
086        @Override
087        public LocalFeatureList<FEATURE> getFeatures() {
088                return features;
089        }
090}