00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef HESSIANDETECTOR_H_
00022 #define HESSIANDETECTOR_H_
00023 #include "APImage.h"
00024
00025 using namespace std;
00026
00027 #define CONVOLUTION_TYPE int
00028 #define HD_SLIDING_WINDOW 2
00029 #define HD_BOX_FILTERS 1
00030 #define HD_MAX_OCTAVES 3
00031 #define HD_INITIAL_SCALE 1.2
00032
00033
00034 #define HD_INIT_KERNEL_SIZE 9
00035
00036 #define PI 3.14159265
00037
00038 class HessianDetector
00039 {
00040 public:
00041 HessianDetector(APImage* i, int nrPoints=1000, CONVOLUTION_TYPE type=HD_BOX_FILTERS, int nrOctaves=1);
00042
00043 bool detect();
00044 void printPoints();
00045 void printPoints(std::ostream & o);
00046
00047
00048 void dump();
00049 vector<vector<int> >* getPoints();
00050 double getMaxima(int x, int y);
00051 int getNrPoints();
00052
00053
00054
00055
00056 private:
00057 APImage* image;
00058 int nrPoints;
00059 int nrOctaves;
00060 CONVOLUTION_TYPE convolutionType;
00061
00068
00069
00070 std::vector<vector<int> > determinants;
00071 std::vector<vector<int> > orderedList;
00072
00073 std::vector<vector<double> > maximas;
00074
00075 int _getHessianDeterminant(int* pixelSumXX, int* pixelSumXY, int *pixelSumYY);
00076 void _calculateMaxDet(int i, int j);
00077 void _cutPointList(double average, int nrPoints);
00078 double _getScale(int kernelSize);
00079 int _convolutePixel(int* coordX, int* coordY, int* kernelSize);
00080
00081 bool _boxFilterDetect();
00082 bool _slidingWDetect();
00083 void _insertToList(int* x, int* y);
00084 };
00085
00086 #endif