⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sift.hpp

📁 数字图像处理
💻 HPP
字号:
// file:        sift.hpp// author:      Andrea Vedaldi// description: Sift declaration// AUTORIGHTS// Copyright (c) 2006 The Regents of the University of California// All Rights Reserved.// // Created by Andrea Vedaldi (UCLA VisionLab)// // 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, this paragraph and the// following three paragraphs appear in all copies.// // This software program and documentation are copyrighted by The Regents// of the University of California. The software program and// documentation are supplied "as is", without any accompanying services// from The Regents. The Regents does not warrant that the operation of// the program will be uninterrupted or error-free. The end-user// understands that the program was developed for research purposes and// is advised not to rely exclusively on the program for any reason.// // This software embodies a method for which the following patent has// been issued: "Method and apparatus for identifying scale invariant// features in an image and use of same for locating an object in an// image," David G. Lowe, US Patent 6,711,293 (March 23,// 2004). Provisional application filed March 8, 1999. Asignee: The// University of British Columbia.// // IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY// FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,// INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND// ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE UNIVERSITY OF// CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR// A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS"// BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE// MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.#ifndef VL_SIFT_HPP#define VL_SIFT_HPP#include<valarray>#include<vector>#include<ostream>#include<cmath>#if defined (VL_USEFASTMATH)#if defined (VL_MAC)#define VL_FASTFLOAT float#else#define VL_FASTFLOAT double#endif#else#define VL_FASTFLOAT float#endif#define VL_XEAS(x) #x#define VL_EXPAND_AND_STRINGIFY(x) VL_XEAS(x)/** @brief VisionLab namespace */namespace VL {/** @brief Pixel data type */typedef float pixel_t ;/** @brief Floating point data type  ** ** Although floats are precise enough for this applicatgion, on Intel ** based architecture using doubles for floating point computations ** turns out to be much faster. **/typedef VL_FASTFLOAT float_t ;/** @brief 32-bit integer data type */typedef int int32_t ;/** @brief 64-bit integer data type */typedef long long int int64_t ;/** @brief 32-bit unsigned integer data type */typedef int uint32_t ;/** @brief 8-bit unsigned integer data type */typedef char unsigned uint8_t ;/** @name Fast math **  ** We provide approximate mathematical functions. These are usually ** rather faster than the corresponding standard library functions. **//*@{*/float   fast_resqrt(float x) ;double  fast_resqrt(double x) ;float_t fast_expn(float_t x) ;float_t fast_abs(float_t x) ;float_t fast_mod_2pi(float_t x) ;float_t fast_atan2(float_t y, float_t x) ;float_t fast_sqrt(float_t x) ;int32_t fast_floor(float_t x) ;/*@}*//** @brief Generic exception */struct Exception{  /** @brief Build generic exception with message   **    ** The message can be accessed as the Exception::msg data member.   **   ** @param _msg message.   **/  Exception(std::string _msg) : msg(_msg) { }  /** Exception message */  std::string msg ; } ;/** @brief Throw generic exception ** ** The macro executes the stream operations @a x to obtain ** an error messages. The message is then wrapped in a ** generic exception VL::Exception and thrown. ** ** @param x sequence of stream operations. **/#define VL_THROW(x)                             \  {                                             \    std::ostringstream oss ;                    \    oss << x ;                                  \    throw VL::Exception(oss.str()) ;            \  }/** @name PGM input/output *//*@{*//** @brief PGM buffer descriptor ** ** The structure describes a gray scale image and it is used by the ** PGM input/output functions. The fileds are self-explanatory. **/struct PgmBuffer{  int width ;     ///< Image width  int height ;    ///< Image hegith  pixel_t* data ; ///< Image data} ;std::ostream& insertPgm(std::ostream&, pixel_t const* im, int width, int height) ;std::istream& extractPgm(std::istream&, PgmBuffer& buffer) ;/*@}*//** @brief SIFT filter ** ** This class is a filter computing the Scala Invariant Feature ** Transform (SIFT). **/class Sift{public:    /** @brief SIFT keypoint   **   ** A SIFT keypoint is charactedized by a location x,y and a scale   ** @c sigma. The scale is obtained from the level index @c s and   ** the octave index @c o through a simple formula (see the PDF   ** documentation).   **   ** In addition to the location, scale indexes and scale, we also   ** store the integer location and level. The integer location is   ** unnormalied, i.e. relative to the resolution of the octave   ** containing the keypoint (octaves are downsampled). These   ** quantities are mostly useful internally.   **/  struct Keypoint  {    int o ;    ///< Keypoint octave index    int ix ;   ///< Keypoint integer X coordinate (unnormalized)    int iy ;   ///< Keypoint integer Y coordinate (unnormalized)    int is ;   ///< Keypoint integer scale indiex    float_t x  ;  ///< Keypoint fractional X coordinate    float_t y  ;  ///< Keypoint fractional Y coordinate    float_t s ;   ///< Keypoint fractional scale index    float_t sigma ;  ///< Keypoint scale  } ;   typedef std::vector<Keypoint>     Keypoints ;          ///< Keypoint list datatype  typedef Keypoints::iterator       KeypointsIter ;      ///< Keypoint list iter datatype  typedef Keypoints::const_iterator KeypointsConstIter ; ///< Keypoint list const iter datatype  /** @brief Constructors and destructors */  /*@{*/  Sift(const pixel_t* _im_pt, int _width, int _height,       float_t _sigman,       float_t _sigma0,       int _O, int _S,       int _omin, int _smin, int _smax) ;  ~Sift() ;  /*@}*/  void process(const pixel_t* _im_pt, int _width, int _height) ;  /** @brief Querying the Gaussian scale space */  /*@{*/  VL::pixel_t* getOctave(int o) ;  VL::pixel_t* getLevel(int o, int s) ;  int          getWidth() const ;  int          getHeight() const ;  int          getOctaveWidth(int o) const ;  int          getOctaveHeight(int o) const ;  VL::float_t  getOctaveSamplingPeriod(int o) const ;  VL::float_t  getScaleFromIndex(VL::float_t o, VL::float_t s) const ;  Keypoint     getKeypoint(VL::float_t x, VL::float_t y, VL::float_t s) const ;  /*@{*/  /** @brief Detector and descriptor */  /*@{*/  void detectKeypoints(VL::float_t threshold, VL::float_t edgeThreshold) ;  int computeKeypointOrientations(VL::float_t angles [4], Keypoint keypoint) ;   void computeKeypointDescriptor(VL::float_t* descr_pt, Keypoint keypoint, VL::float_t angle) ;  KeypointsIter keypointsBegin() ;  KeypointsIter keypointsEnd() ;  /*@}*/    private:  void prepareBuffers() ;  void freeBuffers() ;  void smooth(VL::pixel_t       * dst, 	      VL::pixel_t       * temp,               VL::pixel_t const * src, int width, int height,               VL::float_t s) ;  void prepareGrad(int o) ;    // scale space parameters  VL::float_t sigman ;  VL::float_t sigma0 ;  VL::float_t sigmak ;  int O ;  int S ;   int omin ;  int smin ;   int smax ;  int width ;  int height ;  // buffers  VL::pixel_t*  temp ;  int           tempReserved ;  bool          tempIsGrad  ;  int           tempOctave ;  VL::pixel_t** octaves ;    VL::pixel_t*  filter ;  int           filterReserved ;  Keypoints keypoints ;  } ;}// Include inline functions definitions#include<sift.ipp>// VL_SIFT_HPP#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -