HOGVectorFeatures.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /**
  2. * @file HOGVectorFeatures.cpp
  3. * @brief extract hog features
  4. * @author Alexander Arest
  5. * @date 06/08/2009
  6. */
  7. #include <iostream>
  8. #include "vislearning/features/simplefeatures/HOGVectorFeatures.h"
  9. #include "core/image/Convert.h"
  10. using namespace std;
  11. using namespace NICE;
  12. using namespace OBJREC;
  13. HOGVectorFeatures::HOGVectorFeatures ( const Config * conf, int _xsize, int _ysize): FeatureFactory ( conf )
  14. {
  15. numBins = conf->gI( "HOGVectorFeatures", "numbins", 9 );
  16. usesigned = conf->gB( "HOGVectorFeatures", "usesigned", false );
  17. amount_cell_x = conf->gI("HOGVectorFeatures", "cell_x", 4 );
  18. amount_cell_y = conf->gI("HOGVectorFeatures", "cell_y", 4 );
  19. block_x = conf->gI("HOGVectorFeatures", "block_x", 2 );
  20. block_y = conf->gI("HOGVectorFeatures", "block_y", 2 );
  21. }
  22. HOGVectorFeatures::~HOGVectorFeatures()
  23. {
  24. }
  25. int HOGVectorFeatures::convert ( const NICE::Image & img, NICE::Vector & vec )
  26. {
  27. NICE::FloatImage imgd( img.width(), img.height());
  28. grayToFloat(img, &imgd);
  29. float *imgdraw = imgd.getPixelPointerXY(0,0);
  30. long int k = 0;
  31. float *gradient = new float[ imgd.width() * imgd.height() ];
  32. unsigned char *graddir = new unsigned char[ imgd.width() * imgd.height() ];
  33. FastFilter::calcGradient<float,float,unsigned char> ( imgdraw, imgd.width(), imgd.height(), gradient, graddir, numBins, usesigned );
  34. NICE::FloatImage imgd_gradient(gradient, imgd.width(), imgd.height(), GrayColorImageCommonImplementation::noAlignment);
  35. NICE::Image imgd_graddir(graddir, imgd.width(), imgd.height(), GrayColorImageCommonImplementation::noAlignment);
  36. Image tmp;
  37. floatToGray(imgd_gradient, &tmp);
  38. showImage(tmp, "Grad");
  39. cout << 6 << endl;
  40. k = 0;
  41. // ***** 6.3 Spatial/Orientation binning *****
  42. double x_size = imgd_gradient.width();
  43. double y_size = imgd_gradient.height();
  44. int cell_x = int ( ceil( x_size / amount_cell_x ) );
  45. int cell_y = int ( ceil( y_size / amount_cell_y ) );
  46. vector<vector<double> > array_cell_hist_vec;
  47. for (int i = 0; i < amount_cell_x; i++){
  48. for (int j = 0; j < amount_cell_y; j++){
  49. vector<double> cell_hist_vec(numBins,0);
  50. for (int k = 0; k < cell_x; k++){
  51. int x_coord, y_coord;
  52. for (int l = 0; l < cell_y; l++){
  53. x_coord = i*cell_x + k;
  54. y_coord = j*cell_y + l;
  55. if ((x_coord < x_size) && (y_coord < y_size)){
  56. double gradient = imgd_gradient.getPixel(x_coord,y_coord);
  57. int graddir = imgd_graddir.getPixel(x_coord,y_coord);
  58. cell_hist_vec[graddir] += gradient;
  59. }
  60. else break;
  61. }
  62. }
  63. array_cell_hist_vec.push_back(cell_hist_vec);
  64. }
  65. }
  66. // **************************************************
  67. // ***** 6.4 Normalization and Descriptor Block *****
  68. int block_part_x = amount_cell_x - block_x + 1;
  69. int block_part_y = amount_cell_y - block_y + 1;
  70. vector<double> fd; // final descriptor
  71. for (int i = 0; i < block_part_x; i++)
  72. {
  73. for (int j = 0; j < block_part_y; j++)
  74. {
  75. vector<double> fdi; // final descriptor intermediate
  76. for (int k = 0; k < block_x; k++)
  77. {
  78. for (int l = 0; l < block_y; l++)
  79. {
  80. int number = (i+k)*amount_cell_y + (j+l);
  81. fdi.insert(fdi.begin(),array_cell_hist_vec.at(number).begin(),array_cell_hist_vec.at(number).end());
  82. }
  83. }
  84. vector<double>::iterator it;
  85. it = fdi.begin();
  86. double norm_factor = 0.00000000001; //epsilon^2
  87. while(it!=fdi.end()) {
  88. norm_factor += (*it)*(*it);
  89. it++;
  90. }
  91. double sqrt_norm_factor = sqrt(norm_factor);
  92. it = fdi.begin();
  93. while(it!=fdi.end()) {
  94. *it /= sqrt_norm_factor;
  95. it++;
  96. }
  97. fd.insert(fd.begin(),fdi.begin(),fdi.end());
  98. }
  99. }
  100. //**************************************************
  101. int fdSize = ( int ) fd.size();
  102. vec.resize( fdSize );
  103. for ( int i = 0; i < fdSize; i++ )
  104. vec[ i ] = fd[ i ];
  105. //delete [] imgdraw;
  106. delete [] gradient;
  107. delete [] graddir;
  108. return 0;
  109. }