KeyPoint.cpp
上传用户:yli86818
上传日期:2014-07-15
资源大小:273k
文件大小:2k
源码类别:

图形图像处理

开发平台:

Visual C++

  1. // KeyPoint.cpp: implementation of the CKeyPoint class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "TestSIFT.h"
  6. #include "KeyPoint.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CKeyPoint:: CKeyPoint (IplImage* gaussImg, double x, double y, double imgScale,
  16. double kpScale, double orientation)
  17. {
  18. m_gaussImg = gaussImg;
  19. m_x = x;
  20. m_y = y;
  21. m_imgScale = imgScale;
  22. m_kpScale = kpScale;
  23. m_orientation = orientation;
  24. m_featureVec = NULL;
  25. }
  26. CKeyPoint::~CKeyPoint()
  27. {
  28. if (m_featureVec != NULL)
  29. delete m_featureVec;
  30. }
  31. void CKeyPoint::CreateVector (int xDim, int yDim, int oDim)
  32. {
  33. m_xDim = xDim;
  34. m_yDim = yDim;
  35. m_oDim = oDim;
  36. m_featureVec = new double[yDim * xDim * oDim];
  37. memset (m_featureVec,0,sizeof(double)*yDim*xDim*oDim);
  38. }
  39. void CKeyPoint::FVSet(int xI, int yI, int oI, double value)
  40. {
  41. // row major
  42. m_featureVec[(yI * m_xDim * m_oDim) + (xI * m_oDim) + oI] = value;
  43. }
  44. double CKeyPoint::FVGet(int xI, int yI, int oI)
  45. {
  46. // row major
  47. return m_featureVec[(yI * m_xDim * m_oDim) + (xI * m_oDim) + oI];
  48. }
  49. // Threshhold and normalize feature vector.
  50. // Note that the feature vector as a whole is normalized (Lowe's paper is
  51. // a bit unclear at that point).
  52. void CKeyPoint::CapAndNormalizeFV (double fvGradHicap)
  53. {
  54. // Straight normalization
  55. int len = m_xDim * m_yDim * m_oDim;
  56. double norm = 0.0;
  57. for (int i = 0 ; i < len ; i++)
  58. norm += m_featureVec[i]*m_featureVec[i];
  59. norm = sqrt (norm);
  60. if (norm == 0.0)
  61. return;
  62. for (i = 0 ; i < len; i++)
  63. m_featureVec[i] /= norm;
  64. // Hicap after normalization
  65. for (i = 0 ; i < len; i++) 
  66. if (m_featureVec[i] > fvGradHicap) 
  67. m_featureVec[i] = fvGradHicap;
  68. // Renormalize again
  69. norm = 0;
  70. for (i = 0 ; i < len ; i++)
  71. norm += m_featureVec[i]*m_featureVec[i];
  72. norm = sqrt (norm);
  73. for (i = 0 ; i < len; i++)
  74. m_featureVec[i] /= norm;
  75. }