00001
00007 #ifndef __KERNEL_FACTORY_H__
00008 #define __KERNEL_FACTORY_H__
00009
00010 #include <string>
00011 #include <functional>
00012
00013 #include "stringparser.h"
00014 #include "pnm_io.h"
00015 #include "radialfunction.h"
00016 #include "neuralregion.h"
00017 #include "generic_stdlib.h"
00018
00019
00021 class KernelFactory {
00022 public:
00024 typedef InternalNeuralRegion::WeightMatrix KernelMatrix;
00025
00026 KernelFactory() : max_blur_type(Blur_PGM) { }
00027 virtual ~KernelFactory() { }
00028
00029 KernelMatrix create( int index, double world_size_scale, StringArgs arglist );
00030
00032 typedef double (*kernel_fnPtr) (double x_sq, double sig_sq);
00033
00035 inline KernelMatrix create(kernel_fnPtr fnptr, double radius,
00036 int max_radius, string& errors,
00037 bool circular=true, bool normalize=true) {
00038 return RadialFunction::matrix<KernelMatrix>
00039 (fnptr,radius,max_radius,errors,circular,normalize);
00040 }
00041
00043 void register_params_and_commands( void );
00044
00046 enum BlurTypes {Blur_SquareAverage,Blur_CircularAverage,Blur_Gaussian,Blur_DoG,Blur_LoG,
00047 Blur_GoD,Blur_DoGGoD,Blur_PGM};
00048
00050 const BlurTypes max_blur_type;
00051
00052 private:
00053
00054 static double blur_radius;
00055 static double blur_radius_surround_multiplier;
00056 static double blur_scale;
00057 static double blur_range_multiplier;
00058 static int blur_type;
00059 static char default_kernel_filename[];
00060 };
00061
00062
00064 class KernelFactoryWrapper : public Generic::unary_virtual_function<double,KernelFactory::KernelMatrix> {
00065 public:
00066 KernelFactoryWrapper(KernelFactory factory, StringArgs args, int num=0)
00067 : e(num), arglist(args), kf(factory) { }
00069 virtual KernelFactory::KernelMatrix operator() ( double size_scale )
00070 { return kf.create(e,size_scale,arglist); }
00071 private:
00072 int e;
00073 StringArgs arglist;
00074 KernelFactory& kf;
00075 };
00076
00077 #endif