| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| |
|
| | #ifndef _SIFT_PYRAMID_H |
| | #define _SIFT_PYRAMID_H |
| |
|
| |
|
| | class GLTexImage; |
| | class GLTexInput; |
| | class SiftParam; |
| | class GlobalUtil; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #define NO_DUPLICATE_DOWNLOAD |
| |
|
| | class SiftPyramid : public GlobalUtil |
| | { |
| | public: |
| | enum{ |
| | DATA_GAUSSIAN = 0, |
| | DATA_DOG = 1, |
| | DATA_KEYPOINT = 2, |
| | DATA_GRAD = 3, |
| | DATA_ROT = 4, |
| | DATA_NUM = 5 |
| | }; |
| | enum{ |
| | SIFT_SKIP_FILTERING = 0x01, |
| | SIFT_SKIP_DETECTION = 0x02, |
| | SIFT_SKIP_ORIENTATION = 0x04, |
| | SIFT_RECT_DESCRIPTION = 0x08 |
| | }; |
| | protected: |
| | SiftParam& param; |
| | int _hpLevelNum; |
| | int* _levelFeatureNum; |
| | int _featureNum; |
| | float* _histo_buffer; |
| | |
| | int _existing_keypoints; |
| | vector<int> _keypoint_index; |
| | |
| | GLuint* _featureDisplayVBO; |
| | GLuint* _featurePointVBO; |
| | public: |
| | |
| | float _timing[8]; |
| | |
| | |
| | int _octave_min; |
| | |
| | int _octave_num; |
| | |
| | int _pyramid_octave_num; |
| | int _pyramid_octave_first; |
| | int _pyramid_width; |
| | int _pyramid_height; |
| | int _down_sample_factor; |
| | int _allocated; |
| | int _alignment; |
| | int _siftgpu_failed; |
| | public: |
| | vector<float> _keypoint_buffer; |
| | vector<float> _descriptor_buffer; |
| | private: |
| | inline void PrepareBuffer(); |
| | inline void LimitFeatureCount(int have_keylist = 0); |
| | public: |
| | |
| | virtual void RunSIFT(GLTexInput*input); |
| | virtual void SaveSIFT(const char * szFileName); |
| | virtual void CopyFeatureVector(float*keys, float *descriptors); |
| | virtual void SetKeypointList(int num, const float * keys, int run_on_current, int skip_orientation); |
| | |
| | virtual void GetFeatureDescriptors() = 0; |
| | virtual void GenerateFeatureListTex() =0; |
| | virtual void ReshapeFeatureListCPU() =0; |
| | virtual void GenerateFeatureDisplayVBO() =0; |
| | virtual void DownloadKeypoints() = 0; |
| | virtual void GenerateFeatureListCPU()=0; |
| | virtual void GenerateFeatureList()=0; |
| | virtual GLTexImage* GetLevelTexture(int octave, int level)=0; |
| | virtual GLTexImage* GetLevelTexture(int octave, int level, int dataName) = 0; |
| | virtual void BuildPyramid(GLTexInput * input)=0; |
| | virtual void ResizePyramid(int w, int h) = 0; |
| | virtual void InitPyramid(int w, int h, int ds = 0)=0; |
| | virtual void DetectKeypointsEX() = 0; |
| | virtual void ComputeGradient() = 0; |
| | virtual void GetFeatureOrientations() = 0; |
| | virtual void GetSimplifiedOrientation() = 0; |
| |
|
| | |
| | virtual void CleanUpAfterSIFT() {} |
| | virtual int IsUsingRectDescription() {return 0; } |
| | static int GetRequiredOctaveNum(int inputsz); |
| |
|
| | |
| | inline void SetFailStatus() {_siftgpu_failed = 1; } |
| | inline int GetSucessStatus() {return _siftgpu_failed == 0; } |
| | inline int GetFeatureNum(){return _featureNum;} |
| | inline int GetHistLevelNum(){return _hpLevelNum;} |
| | inline const GLuint * GetFeatureDipslayVBO(){return _featureDisplayVBO;} |
| | inline const GLuint * GetPointDisplayVBO(){return _featurePointVBO;} |
| | inline const int * GetLevelFeatureNum(){return _levelFeatureNum;} |
| | inline void GetPyramidTiming(float * timing){ for(int i = 0; i < 8; i++) timing[i] = _timing[i]; } |
| | inline void CleanupBeforeSIFT() |
| | { |
| | _siftgpu_failed = 0; |
| | for(int i = 0; i < 8; ++i) _timing[i] = 0; |
| | } |
| | SiftPyramid(SiftParam&sp):param(sp) |
| | { |
| | _featureNum = 0; |
| | _featureDisplayVBO = 0; |
| | _featurePointVBO = 0; |
| | _levelFeatureNum = NULL; |
| | _histo_buffer = NULL; |
| | _hpLevelNum = 0; |
| |
|
| | |
| | _octave_num = 0; |
| | _octave_min = 0; |
| | _alignment = 1; |
| | _pyramid_octave_num = _pyramid_octave_first = 0; |
| | _pyramid_width = _pyramid_height = 0; |
| | _allocated = 0; |
| | _down_sample_factor = 0; |
| |
|
| | |
| | _existing_keypoints = 0; |
| | } |
| | virtual ~SiftPyramid() {}; |
| |
|
| | #ifdef DEBUG_SIFTGPU |
| | private: |
| | void StopDEBUG(); |
| | void BeginDEBUG(const char* imagepath); |
| | void WriteTextureForDEBUG(GLTexImage * tex, const char * namet, ...); |
| | #endif |
| | }; |
| |
|
| | #define SIFTGPU_ENABLE_REVERSE_ORDER |
| | #ifdef SIFTGPU_ENABLE_REVERSE_ORDER |
| | #define FIRST_OCTAVE(R) (R? _octave_num - 1 : 0) |
| | #define NOT_LAST_OCTAVE(i, R) (R? (i >= 0) : (i < _octave_num)) |
| | #define GOTO_NEXT_OCTAVE(i, R) (R? (--i) : (++i)) |
| | #define FIRST_LEVEL(R) (R? param._dog_level_num - 1 : 0) |
| | #define GOTO_NEXT_LEVEL(j, R) (R? (--j) : (++j)) |
| | #define NOT_LAST_LEVEL(j, R) (R? (j >= 0) : (j < param._dog_level_num)) |
| | #define FOR_EACH_OCTAVE(i, R) for(int i = FIRST_OCTAVE(R); NOT_LAST_OCTAVE(i, R); GOTO_NEXT_OCTAVE(i, R)) |
| | #define FOR_EACH_LEVEL(j, R) for(int j = FIRST_LEVEL(R); NOT_LAST_LEVEL(j, R); GOTO_NEXT_LEVEL(j, R)) |
| | #else |
| | #define FOR_EACH_OCTAVE(i, R) for(int i = 0; i < _octave_num; ++i) |
| | #define FOR_EACH_LEVEL(j, R) for(int j = 0; j < param._dog_level_num; ++j) |
| | #endif |
| |
|
| | #endif |
| |
|