| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
|
|
| #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 |
|
|