You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
exercise_2/colmap-dev/lib/SiftGPU/SiftPyramid.h

191 lines
6.2 KiB

////////////////////////////////////////////////////////////////////////////
// File: SiftPyramid.h
// Author: Changchang Wu
// Description : interface for the SiftPyramid class.
// SiftPyramid: data storage for SIFT
// |---PyramidGL: OpenGL based implementation
// | |--PyramidNaive: Unpacked version
// | |--PyramidPacked: packed version
// |--PyramidCU: CUDA-based implementation
//
// Copyright (c) 2007 University of North Carolina at Chapel Hill
// All Rights Reserved
//
// Permission to use, copy, modify and distribute this software and its
// documentation for educational, research and non-profit purposes, without
// fee, and without a written agreement is hereby granted, provided that the
// above copyright notice and the following paragraph appear in all copies.
//
// The University of North Carolina at Chapel Hill make no representations
// about the suitability of this software for any purpose. It is provided
// 'as is' without express or implied warranty.
//
// Please send BUG REPORTS to ccwu@cs.unc.edu
//
////////////////////////////////////////////////////////////////////////////
#ifndef _SIFT_PYRAMID_H
#define _SIFT_PYRAMID_H
class GLTexImage;
class GLTexInput;
class SiftParam;
class GlobalUtil;
/////////////////////////////////////////////////////////////////////////////
//class SiftPyramid
//description: virutal class of SIFT data pyramid
// provides functions for SiftPU to run steps of GPU SIFT
// class PyramidNaive is the first implementation
// class PyramidPacked is a better OpenGL implementation
// class PyramidCU is a CUDA based implementation
/////////////////////////////////////////////////////////////////////////////
#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;
//keypoint list
int _existing_keypoints;
vector<int> _keypoint_index;
//display vbo
GLuint* _featureDisplayVBO;
GLuint* _featurePointVBO;
public:
//
float _timing[8];
//image size related
//first octave
int _octave_min;
//how many octaves
int _octave_num;
//pyramid storage
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:
//shared by all implementations
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);
//implementation-dependent functions
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 functions, shared by all implementations
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;
//image size
_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