/* * Copyright (c) 2011-2016, Peter Abeles. All Rights Reserved. * * This file is part of BoofCV (http://boofcv.org). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package boofcv.factory.feature.describe; import boofcv.abst.feature.describe.ConfigSiftDescribe; import boofcv.abst.feature.describe.ConfigSurfDescribe; import boofcv.abst.filter.blur.BlurFilter; import boofcv.alg.feature.describe.*; import boofcv.alg.feature.describe.brief.BinaryCompareDefinition_I32; import boofcv.alg.feature.describe.impl.*; import boofcv.alg.interpolate.InterpolatePixelS; import boofcv.core.image.border.BorderType; import boofcv.factory.interpolate.FactoryInterpolation; import boofcv.struct.feature.TupleDesc; import boofcv.struct.image.GrayF32; import boofcv.struct.image.GrayU8; import boofcv.struct.image.ImageGray; /** * Creates algorithms for describing point features. * * @author Peter Abeles */ @SuppressWarnings({"unchecked"}) public class FactoryDescribePointAlgs { public static <T extends ImageGray> DescribePointSurf<T> surfSpeed(ConfigSurfDescribe.Speed config, Class<T> imageType) { if( config == null ) config = new ConfigSurfDescribe.Speed(); config.checkValidity(); return new DescribePointSurf<>(config.widthLargeGrid, config.widthSubRegion, config.widthSample, config.weightSigma, config.useHaar, imageType); } public static <T extends ImageGray> DescribePointSurfMod<T> surfStability(ConfigSurfDescribe.Stability config, Class<T> imageType) { if( config == null ) config = new ConfigSurfDescribe.Stability(); config.checkValidity(); return new DescribePointSurfMod<>(config.widthLargeGrid, config.widthSubRegion, config.widthSample, config.overLap, config.sigmaLargeGrid, config.sigmaSubRegion, config.useHaar, imageType); } public static <T extends ImageGray> DescribePointSurfPlanar<T> surfColor(DescribePointSurf<T> describe , int numBands ) { return new DescribePointSurfPlanar<>(describe, numBands); } public static <T extends ImageGray> DescribePointBrief<T> brief(BinaryCompareDefinition_I32 definition, BlurFilter<T> filterBlur ) { Class<T> imageType = filterBlur.getInputType().getImageClass(); DescribePointBinaryCompare<T> compare; if( imageType == GrayF32.class ) { compare = (DescribePointBinaryCompare<T> )new ImplDescribeBinaryCompare_F32(definition); } else if( imageType == GrayU8.class ) { compare = (DescribePointBinaryCompare<T> )new ImplDescribeBinaryCompare_U8(definition); } else { throw new IllegalArgumentException("Unknown image type: "+imageType.getSimpleName()); } return new DescribePointBrief<>(compare, filterBlur); } // todo remove filterBlur for all BRIEF change to radius,sigma,type public static <T extends ImageGray> DescribePointBriefSO<T> briefso(BinaryCompareDefinition_I32 definition, BlurFilter<T> filterBlur) { Class<T> imageType = filterBlur.getInputType().getImageClass(); InterpolatePixelS<T> interp = FactoryInterpolation.bilinearPixelS(imageType, BorderType.EXTENDED); return new DescribePointBriefSO<>(definition, filterBlur, interp); } public static <T extends ImageGray> DescribePointSift<T> sift(ConfigSiftDescribe config , Class<T> derivType ) { if( config == null ) config = new ConfigSiftDescribe(); return new DescribePointSift(config.widthSubregion,config.widthGrid,config.numHistogramBins ,config.sigmaToPixels, config.weightingSigmaFraction,config.maxDescriptorElementValue,derivType); } public static <T extends ImageGray, D extends TupleDesc> DescribePointPixelRegion<T,D> pixelRegion( int regionWidth , int regionHeight , Class<T> imageType ) { if( imageType == GrayF32.class ) { return (DescribePointPixelRegion<T,D>)new ImplDescribePointPixelRegion_F32(regionWidth,regionHeight); } else if( imageType == GrayU8.class ) { return (DescribePointPixelRegion<T,D>)new ImplDescribePointPixelRegion_U8(regionWidth,regionHeight); } else { throw new IllegalArgumentException("Unsupported image type"); } } public static <T extends ImageGray> DescribePointPixelRegionNCC<T> pixelRegionNCC( int regionWidth , int regionHeight , Class<T> imageType ) { if( imageType == GrayF32.class ) { return (DescribePointPixelRegionNCC<T>)new ImplDescribePointPixelRegionNCC_F32(regionWidth,regionHeight); } else if( imageType == GrayU8.class ) { return (DescribePointPixelRegionNCC<T>)new ImplDescribePointPixelRegionNCC_U8(regionWidth,regionHeight); } else { throw new IllegalArgumentException("Unsupported image type"); } } }