IDRandomSampling.cpp 2.4 KB

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