IDRandomSampling.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /**
  2. * @file IDRandomSampling.cpp
  3. * @brief random interest point sampling
  4. * @author Erik Rodner
  5. * @date 02/05/2008
  6. */
  7. #include <iostream>
  8. #include "vislearning/features/localfeatures/IDRandomSampling.h"
  9. using namespace OBJREC;
  10. using namespace std;
  11. using namespace NICE;
  12. IDRandomSampling::IDRandomSampling(const Config *conf, int _numSamples) :
  13. numSamples(_numSamples)
  14. {
  15. minScale = conf->gD("IDRandomSampling", "min_scale", 1.0);
  16. srand(time(NULL));
  17. }
  18. IDRandomSampling::~IDRandomSampling()
  19. {
  20. }
  21. int IDRandomSampling::getInterests(const NICE::Image & img,
  22. std::vector<Vector> & positions) const
  23. {
  24. // FIXME: is this function broken ??
  25. double rmin = minScale * 6;
  26. double rmax = std::min(img.width(), img.height()) / 2.0;
  27. size_t len = (size_t) (rmax - rmin);
  28. NICE::Vector p(len);
  29. double sum = 0.0;
  30. for (size_t k = 0; k < len; k++)
  31. {
  32. double r = k + rmin;
  33. p[k] = img.width() * img.height() - 2 * (img.width() + img.height())
  34. * r + 4 * r * r;
  35. sum += p[k];
  36. }
  37. p[0] /= sum;
  38. for (size_t k = 1; k < len; k++)
  39. {
  40. p[k] /= sum;
  41. p[k] = p[k - 1] + p[k];
  42. }
  43. vector<double> sizes;
  44. for (size_t i = 0; i < (size_t) numSamples; i++)
  45. {
  46. #ifdef WIN32
  47. double sr = double( rand() ) / RAND_MAX;
  48. #else
  49. double sr = drand48();
  50. #endif
  51. int r = len - 1;
  52. while ((p[r] > sr) && (r > 0))
  53. r--;
  54. sizes.push_back(r);
  55. }
  56. sort(sizes.begin(), sizes.end());
  57. for (size_t i = 0; i < sizes.size(); i++)
  58. {
  59. double r = sizes[i];
  60. double scale = (r + rmin) / 6.0;
  61. #ifdef WIN32
  62. double x = double( rand() ) / RAND_MAX * (img.width() - 2 * r) + r;
  63. double y = double( rand() ) / RAND_MAX * (img.height() - 2 * r) + r;
  64. #else
  65. double x = drand48() * (img.width() - 2 * r) + r;
  66. double y = drand48() * (img.height() - 2 * r) + r;
  67. #endif
  68. Vector pos(3);
  69. pos[0] = x;
  70. pos[1] = y;
  71. pos[2] = scale; // FIXME: level = scale??
  72. positions.push_back(pos);
  73. }
  74. fprintf(stderr, "IDRandomSampling finished\n");
  75. return 0;
  76. }
  77. int IDRandomSampling::getInterests(const ImagePyramid & imp,
  78. std::vector<Vector> & positions) const
  79. {
  80. int numLevels = imp.getNumLevels();
  81. for (int j = 0; j < numSamples; j++)
  82. {
  83. int level = rand() % numLevels;
  84. if ((level < 0) || (level >= numLevels))
  85. continue;
  86. const NICE::Image & img = imp.getLevel(level);
  87. int x = rand() % (img.width() + 1);
  88. int y = rand() % (img.height() + 1);
  89. double xo, yo;
  90. imp.getOriginalCoordinates(x, y, level, xo, yo);
  91. Vector pos(3);
  92. pos[0] = xo;
  93. pos[1] = yo;
  94. pos[2] = level;
  95. positions.push_back(pos);
  96. }
  97. fprintf(stderr, "IDRandomSampling finished\n");
  98. return 0;
  99. }