EOHFeature.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. /**
  2. * @file EOHFeature.cpp
  3. * @brief edge orientation histograms (Levi and Weiss 2004)
  4. * @author Erik Rodner
  5. * @date 05/07/2008
  6. */
  7. #include <iostream>
  8. #include "EOHFeature.h"
  9. #include "vislearning/cbaselib/FeaturePool.h"
  10. using namespace OBJREC;
  11. const double epsilon = 10e-8;
  12. using namespace std;
  13. using namespace NICE;
  14. /** simple constructor */
  15. EOHFeature::EOHFeature( const Config *conf )
  16. {
  17. window_size_x = conf->gI("EOHFeature", "window_size_x", 21 );
  18. window_size_y = conf->gI("EOHFeature", "window_size_y", 21 );
  19. scaleStep = conf->gD("EOHFeature", "scale_step", sqrt(2) );
  20. numScales = conf->gI("EOHFeature", "num_scales", 5 );
  21. numBins = conf->gI("EOHFeature", "num_bins", 9 );
  22. bin = 0;
  23. bin2 = 0;
  24. type = EOH_VALUE;
  25. }
  26. /** simple destructor */
  27. EOHFeature::~EOHFeature()
  28. {
  29. }
  30. double EOHFeature::val( const Example *example ) const
  31. {
  32. const NICE::MultiChannelImageT<double> & img = example->ce->getDChannel (
  33. CachedExample::D_INTEGRALEOH );
  34. int xsize;
  35. int ysize;
  36. example->ce->getImageSize ( xsize, ysize );
  37. int tm_xsize = img.xsize;
  38. int tm_ysize = img.ysize;
  39. #if 0
  40. int xtl = example->x - window_size_x/2;
  41. int ytl = example->y - window_size_y/2;
  42. int xrb = example->x + window_size_x/2;
  43. int yrb = example->y + window_size_y/2;
  44. xtl = xtl * tm_xsize / xsize;
  45. ytl = ytl * tm_ysize / ysize;
  46. xrb = xrb * tm_xsize / xsize;
  47. yrb = yrb * tm_ysize / ysize;
  48. #endif
  49. int wsx2, wsy2;
  50. int xx, yy;
  51. int exwidth = example->width;
  52. if ( exwidth == 0 ) {
  53. wsx2 = window_size_x * tm_xsize / (2*xsize);
  54. wsy2 = window_size_y * tm_ysize / (2*ysize);
  55. } else {
  56. int exheight = example->height;
  57. wsx2 = exwidth * tm_xsize / (2*xsize);
  58. wsy2 = exheight * tm_ysize / (2*ysize);
  59. }
  60. xx = ( example->x ) * tm_xsize / xsize;
  61. yy = ( example->y ) * tm_ysize / ysize;
  62. int xtl = xx - wsx2;
  63. int ytl = yy - wsy2;
  64. int xrb = xx + wsx2;
  65. int yrb = yy + wsy2;
  66. #define BOUND(x,min,max) (((x)<(min))?(min):((x)>(max)?(max):(x)))
  67. xtl = BOUND ( xtl, 0, tm_xsize - 1 );
  68. ytl = BOUND ( ytl, 0, tm_ysize - 1 );
  69. xrb = BOUND ( xrb, 0, tm_xsize - 1 );
  70. yrb = BOUND ( yrb, 0, tm_ysize - 1 );
  71. #undef BOUND
  72. double A,B,C,D;
  73. assert ( bin < (int)img.numChannels );
  74. assert ( img.data[bin] != NULL );
  75. int kA = xtl + ytl * tm_xsize;
  76. int kB = xrb + ytl * tm_xsize;
  77. int kC = xtl + yrb * tm_xsize;
  78. int kD = xrb + yrb * tm_xsize;
  79. A = img.data[bin][ kA ];
  80. B = img.data[bin][ kB ];
  81. C = img.data[bin][ kC ];
  82. D = img.data[bin][ kD ];
  83. if ( type == EOH_VALUE ) {
  84. int area = (xrb - xtl)*(yrb - ytl);
  85. if ( area == 0 )
  86. return 0.0;
  87. else {
  88. /* A B
  89. C D */
  90. double value = (D - B - C + A) / area;
  91. return value;
  92. }
  93. } else if ( type == EOH_RATIO ) {
  94. assert ( bin2 < (int)img.numChannels );
  95. double val1 = (D - B - C + A);
  96. A = img.data[bin2][ kA ];
  97. B = img.data[bin2][ kB ];
  98. C = img.data[bin2][ kC ];
  99. D = img.data[bin2][ kD ];
  100. double val2 = ( D - B - C + A );
  101. return ( val1 + epsilon ) / ( val2 + epsilon );
  102. } else if ( type == EOH_DOMINANT_ORIENTATION ) {
  103. double val1 = (D - B - C + A);
  104. double sum = val1;
  105. for ( int b = 0 ; b < (int)img.numChannels ; b++)
  106. {
  107. if ( b == bin ) continue;
  108. A = img.data[b][ kA ];
  109. B = img.data[b][ kB ];
  110. C = img.data[b][ kC ];
  111. D = img.data[b][ kD ];
  112. sum += ( D - B - C + A );
  113. }
  114. return ( val1 + epsilon ) / ( sum + epsilon );
  115. }
  116. assert ( 1 == 0 );
  117. }
  118. void EOHFeature::explode ( FeaturePool & featurePool, bool variableWindow ) const
  119. {
  120. int nScales = (variableWindow ? numScales : 1 );
  121. for ( int i = 0 ; i < nScales ; i++ )
  122. {
  123. int wsy = window_size_y;
  124. int wsx = window_size_x;
  125. for ( int _type = 0 ; _type < EOH_NUMTYPES; _type++ )
  126. {
  127. if ( (_type == EOH_VALUE) || (_type == EOH_DOMINANT_ORIENTATION) )
  128. {
  129. for ( int _bin = 0 ; _bin < numBins ; _bin++ )
  130. {
  131. EOHFeature *f = new EOHFeature();
  132. f->window_size_x = wsx;
  133. f->window_size_y = wsy;
  134. f->bin = _bin;
  135. f->type = _type;
  136. featurePool.addFeature ( f, 1.0 / ( EOH_NUMTYPES * numBins * nScales ) );
  137. }
  138. }
  139. if ( (_type == EOH_RATIO) )
  140. {
  141. for ( int _bin = 0 ; _bin < numBins ; _bin++ )
  142. {
  143. for ( int _bin2 = 0 ; _bin2 < numBins ; _bin2++ )
  144. {
  145. if ( bin == bin2 ) continue;
  146. EOHFeature *f = new EOHFeature();
  147. f->window_size_x = wsx;
  148. f->window_size_y = wsy;
  149. f->bin = _bin;
  150. f->bin2 = _bin2;
  151. f->type = _type;
  152. featurePool.addFeature ( f, 1.0 / (EOH_NUMTYPES * (numBins - 1) * numBins * nScales ) );
  153. }
  154. }
  155. }
  156. }
  157. wsx = (int) (scaleStep * wsx);
  158. wsy = (int) (scaleStep * wsy);
  159. }
  160. }
  161. Feature *EOHFeature::clone() const
  162. {
  163. EOHFeature *f = new EOHFeature();
  164. f->window_size_x = window_size_x;
  165. f->window_size_y = window_size_y;
  166. f->bin = bin;
  167. f->bin2 = bin2;
  168. f->type = type;
  169. return f;
  170. }
  171. Feature *EOHFeature::generateFirstParameter () const
  172. {
  173. return clone();
  174. }
  175. void EOHFeature::restore (istream & is, int format)
  176. {
  177. is >> window_size_x;
  178. is >> window_size_y;
  179. is >> type;
  180. is >> bin;
  181. is >> bin2;
  182. }
  183. void EOHFeature::store (ostream & os, int format) const
  184. {
  185. os << "EOHFEATURE "
  186. << window_size_x << " "
  187. << window_size_y << " "
  188. << type << " "
  189. << bin << " "
  190. << bin2;
  191. }
  192. void EOHFeature::clear ()
  193. {
  194. }