ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
SiftPyramid.h
Go to the documentation of this file.
1 // File: SiftPyramid.h
3 // Author: Changchang Wu
4 // Description : interface for the SiftPyramid class.
5 // SiftPyramid: data storage for SIFT
6 // |---PyramidGL: OpenGL based implementation
7 // | |--PyramidNaive: Unpacked version
8 // | |--PyramidPacked: packed version
9 // |--PyramidCU: CUDA-based implementation
10 //
11 // Copyright (c) 2007 University of North Carolina at Chapel Hill
12 // All Rights Reserved
13 //
14 // Permission to use, copy, modify and distribute this software and its
15 // documentation for educational, research and non-profit purposes, without
16 // fee, and without a written agreement is hereby granted, provided that the
17 // above copyright notice and the following paragraph appear in all copies.
18 //
19 // The University of North Carolina at Chapel Hill make no representations
20 // about the suitability of this software for any purpose. It is provided
21 // 'as is' without express or implied warranty.
22 //
23 // Please send BUG REPORTS to ccwu@cs.unc.edu
24 //
26 
27 
28 
29 #ifndef _SIFT_PYRAMID_H
30 #define _SIFT_PYRAMID_H
31 
32 
33 class GLTexImage;
34 class GLTexInput;
35 class SiftParam;
36 class GlobalUtil;
37 
39 //class SiftPyramid
40 //description: virutal class of SIFT data pyramid
41 // provides functions for SiftPU to run steps of GPU SIFT
42 // class PyramidNaive is the first implementation
43 // class PyramidPacked is a better OpenGL implementation
44 // class PyramidCU is a CUDA based implementation
46 
47 #define NO_DUPLICATE_DOWNLOAD
48 
49 class SiftPyramid : public GlobalUtil
50 {
51 public:
52  enum{
54  DATA_DOG = 1,
56  DATA_GRAD = 3,
57  DATA_ROT = 4,
58  DATA_NUM = 5
59  };
60  enum{
65  };
66 protected:
71  float* _histo_buffer;
72  //keypoint list
74  vector<int> _keypoint_index;
75  //display vbo
78 public:
79  //
80  float _timing[8];
81  //image size related
82  //first octave
84  //how many octaves
86  //pyramid storage
92  int _allocated;
95 public:
96  vector<float> _keypoint_buffer;
97  vector<float> _descriptor_buffer;
98 private:
99  inline void PrepareBuffer();
100  inline void LimitFeatureCount(int have_keylist = 0);
101 public:
102  //shared by all implementations
103  virtual void RunSIFT(GLTexInput*input);
104  virtual void SaveSIFT(const char * szFileName);
105  virtual void CopyFeatureVector(float*keys, float *descriptors);
106  virtual void SetKeypointList(int num, const float * keys, int run_on_current, int skip_orientation);
107  //implementation-dependent functions
108  virtual void GetFeatureDescriptors() = 0;
109  virtual void GenerateFeatureListTex() =0;
110  virtual void ReshapeFeatureListCPU() =0;
111  virtual void GenerateFeatureDisplayVBO() =0;
112  virtual void DownloadKeypoints() = 0;
113  virtual void GenerateFeatureListCPU()=0;
114  virtual void GenerateFeatureList()=0;
115  virtual GLTexImage* GetLevelTexture(int octave, int level)=0;
116  virtual GLTexImage* GetLevelTexture(int octave, int level, int dataName) = 0;
117  virtual void BuildPyramid(GLTexInput * input)=0;
118  virtual void ResizePyramid(int w, int h) = 0;
119  virtual void InitPyramid(int w, int h, int ds = 0)=0;
120  virtual void DetectKeypointsEX() = 0;
121  virtual void ComputeGradient() = 0;
122  virtual void GetFeatureOrientations() = 0;
123  virtual void GetSimplifiedOrientation() = 0;
124 
126  virtual void CleanUpAfterSIFT() {}
127  virtual int IsUsingRectDescription() {return 0; }
128  static int GetRequiredOctaveNum(int inputsz);
129 
131  inline void SetFailStatus() {_siftgpu_failed = 1; }
132  inline int GetSucessStatus() {return _siftgpu_failed == 0; }
133  inline int GetFeatureNum(){return _featureNum;}
134  inline int GetHistLevelNum(){return _hpLevelNum;}
135  inline const GLuint * GetFeatureDipslayVBO(){return _featureDisplayVBO;}
136  inline const GLuint * GetPointDisplayVBO(){return _featurePointVBO;}
137  inline const int * GetLevelFeatureNum(){return _levelFeatureNum;}
138  inline void GetPyramidTiming(float * timing){ for(int i = 0; i < 8; i++) timing[i] = _timing[i]; }
139  inline void CleanupBeforeSIFT()
140  {
141  _siftgpu_failed = 0;
142  for(int i = 0; i < 8; ++i) _timing[i] = 0;
143  }
145  {
146  _featureNum = 0;
147  _featureDisplayVBO = 0;
148  _featurePointVBO = 0;
151  _hpLevelNum = 0;
152 
153  //image size
154  _octave_num = 0;
155  _octave_min = 0;
156  _alignment = 1;
159  _allocated = 0;
161 
164  }
165  virtual ~SiftPyramid() {};
166 
167 #ifdef DEBUG_SIFTGPU
168 private:
169  void StopDEBUG();
170  void BeginDEBUG(const char* imagepath);
171  void WriteTextureForDEBUG(GLTexImage * tex, const char * namet, ...);
172 #endif
173 };
174 
175 #define SIFTGPU_ENABLE_REVERSE_ORDER
176 #ifdef SIFTGPU_ENABLE_REVERSE_ORDER
177 #define FIRST_OCTAVE(R) (R? _octave_num - 1 : 0)
178 #define NOT_LAST_OCTAVE(i, R) (R? (i >= 0) : (i < _octave_num))
179 #define GOTO_NEXT_OCTAVE(i, R) (R? (--i) : (++i))
180 #define FIRST_LEVEL(R) (R? param._dog_level_num - 1 : 0)
181 #define GOTO_NEXT_LEVEL(j, R) (R? (--j) : (++j))
182 #define NOT_LAST_LEVEL(j, R) (R? (j >= 0) : (j < param._dog_level_num))
183 #define FOR_EACH_OCTAVE(i, R) for(int i = FIRST_OCTAVE(R); NOT_LAST_OCTAVE(i, R); GOTO_NEXT_OCTAVE(i, R))
184 #define FOR_EACH_LEVEL(j, R) for(int j = FIRST_LEVEL(R); NOT_LAST_LEVEL(j, R); GOTO_NEXT_LEVEL(j, R))
185 #else
186 #define FOR_EACH_OCTAVE(i, R) for(int i = 0; i < _octave_num; ++i)
187 #define FOR_EACH_LEVEL(j, R) for(int j = 0; j < param._dog_level_num; ++j)
188 #endif
189 
190 #endif
#define NULL
const GLuint * GetFeatureDipslayVBO()
Definition: SiftPyramid.h:135
const int * GetLevelFeatureNum()
Definition: SiftPyramid.h:137
virtual void CopyFeatureVector(float *keys, float *descriptors)
virtual GLTexImage * GetLevelTexture(int octave, int level, int dataName)=0
int _octave_num
Definition: SiftPyramid.h:85
virtual void GetSimplifiedOrientation()=0
int _siftgpu_failed
Definition: SiftPyramid.h:94
int _pyramid_width
Definition: SiftPyramid.h:89
int _octave_min
Definition: SiftPyramid.h:83
@ SIFT_SKIP_ORIENTATION
Definition: SiftPyramid.h:63
@ SIFT_RECT_DESCRIPTION
Definition: SiftPyramid.h:64
@ SIFT_SKIP_FILTERING
Definition: SiftPyramid.h:61
@ SIFT_SKIP_DETECTION
Definition: SiftPyramid.h:62
int _pyramid_octave_num
Definition: SiftPyramid.h:87
virtual void BuildPyramid(GLTexInput *input)=0
virtual void GenerateFeatureDisplayVBO()=0
int _pyramid_octave_first
Definition: SiftPyramid.h:88
const GLuint * GetPointDisplayVBO()
Definition: SiftPyramid.h:136
SiftParam & param
Definition: SiftPyramid.h:67
int _featureNum
Definition: SiftPyramid.h:70
virtual void ComputeGradient()=0
int GetSucessStatus()
Definition: SiftPyramid.h:132
virtual void ResizePyramid(int w, int h)=0
int _existing_keypoints
Definition: SiftPyramid.h:73
GLuint * _featurePointVBO
Definition: SiftPyramid.h:77
virtual void GetFeatureDescriptors()=0
void GetPyramidTiming(float *timing)
Definition: SiftPyramid.h:138
int _pyramid_height
Definition: SiftPyramid.h:90
virtual void DetectKeypointsEX()=0
virtual void ReshapeFeatureListCPU()=0
virtual void RunSIFT(GLTexInput *input)
Definition: SiftPyramid.cpp:49
virtual void InitPyramid(int w, int h, int ds=0)=0
int * _levelFeatureNum
Definition: SiftPyramid.h:69
SiftPyramid(SiftParam &sp)
Definition: SiftPyramid.h:144
GLuint * _featureDisplayVBO
Definition: SiftPyramid.h:76
static int GetRequiredOctaveNum(int inputsz)
float _timing[8]
Definition: SiftPyramid.h:80
virtual void GenerateFeatureListCPU()=0
int GetHistLevelNum()
Definition: SiftPyramid.h:134
virtual void SetKeypointList(int num, const float *keys, int run_on_current, int skip_orientation)
virtual void GenerateFeatureList()=0
int _allocated
Definition: SiftPyramid.h:92
virtual void GetFeatureOrientations()=0
int _down_sample_factor
Definition: SiftPyramid.h:91
int GetFeatureNum()
Definition: SiftPyramid.h:133
float * _histo_buffer
Definition: SiftPyramid.h:71
virtual GLTexImage * GetLevelTexture(int octave, int level)=0
virtual void DownloadKeypoints()=0
virtual void CleanUpAfterSIFT()
Definition: SiftPyramid.h:126
virtual void GenerateFeatureListTex()=0
vector< int > _keypoint_index
Definition: SiftPyramid.h:74
virtual void SaveSIFT(const char *szFileName)
virtual int IsUsingRectDescription()
Definition: SiftPyramid.h:127
int _hpLevelNum
Definition: SiftPyramid.h:68
virtual ~SiftPyramid()
Definition: SiftPyramid.h:165
vector< float > _descriptor_buffer
Definition: SiftPyramid.h:97
void CleanupBeforeSIFT()
Definition: SiftPyramid.h:139
int _alignment
Definition: SiftPyramid.h:93
vector< float > _keypoint_buffer
Definition: SiftPyramid.h:96
void SetFailStatus()
inline functions, shared by all implementations
Definition: SiftPyramid.h:131
CorePointDescSet * descriptors