Operations.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. #include "Operations.h"
  2. using namespace OBJREC;
  3. using namespace std;
  4. using namespace NICE;
  5. Operation::Operation()
  6. {
  7. values = NULL;
  8. maxtypes = 1000;
  9. }
  10. void Operation::set ( int _x1, int _y1, int _x2, int _y2, int _channel1, int _channel2, ValueAccess *_values )
  11. {
  12. x1 = _x1;
  13. y1 = _y1;
  14. x2 = _x2;
  15. y2 = _y2;
  16. channel1 = _channel1;
  17. channel2 = _channel2;
  18. values = _values;
  19. }
  20. void Operation::setContext ( bool _context )
  21. {
  22. context = _context;
  23. }
  24. bool Operation::getContext()
  25. {
  26. return context;
  27. }
  28. void Operation::setFeatType ( int _featType )
  29. {
  30. featType = _featType;
  31. }
  32. int Operation::getFeatType()
  33. {
  34. return featType;
  35. }
  36. void Operation::getXY ( const Features &feats, int &xsize, int &ysize )
  37. {
  38. xsize = feats.feats->width();
  39. ysize = feats.feats->height();
  40. }
  41. void Operation::store ( std::ostream & os )
  42. {
  43. os << x1 << " " << x2 << " " << y1 << " " << y2 << " " << channel1 << " " << channel2 << " " << featType << std::endl;
  44. if ( values == NULL )
  45. os << -1 << std::endl;
  46. else
  47. os << values->getType() << std::endl;
  48. }
  49. void Operation::restore ( std::istream &is )
  50. {
  51. is >> x1;
  52. is >> x2;
  53. is >> y1;
  54. is >> y2;
  55. is >> channel1;
  56. is >> channel2;
  57. is >> featType;
  58. int tmp;
  59. is >> tmp;
  60. if ( tmp >= 0 )
  61. {
  62. if ( tmp == RAWFEAT )
  63. {
  64. values = new MCImageAccess();
  65. }
  66. else if ( tmp == CONTEXT )
  67. {
  68. values = new ClassificationResultAccess();
  69. }
  70. else
  71. {
  72. throw ( "no valid ValueAccess" );
  73. }
  74. }
  75. else
  76. {
  77. values = NULL;
  78. }
  79. }
  80. std::string Operation::writeInfos()
  81. {
  82. std::stringstream ss;
  83. ss << " x1: " << x1 << " y1: " << y1 << " x2: " << x2 << " y2: " << y2 << " c1: " << channel1 << " c2: " << channel2;
  84. return ss.str();
  85. }
  86. double Equality::getVal ( const Features &feats, const int &x, const int &y )
  87. {
  88. int xsize, ysize;
  89. getXY ( feats, xsize, ysize );
  90. double v1 = values->getVal ( feats, BOUND ( x + x1, 0, xsize - 1 ), BOUND ( y + y1, 0, ysize - 1 ), channel1 );
  91. double v2 = values->getVal ( feats, BOUND ( x + x2, 0, xsize - 1 ), BOUND ( y + y2, 0, ysize - 1 ), channel2 );
  92. return (double)(v1 == v2);
  93. }
  94. double Minus::getVal ( const Features &feats, const int &x, const int &y )
  95. {
  96. int xsize, ysize;
  97. getXY ( feats, xsize, ysize );
  98. double v1 = values->getVal ( feats, BOUND ( x + x1, 0, xsize - 1 ), BOUND ( y + y1, 0, ysize - 1 ), channel1 );
  99. double v2 = values->getVal ( feats, BOUND ( x + x2, 0, xsize - 1 ), BOUND ( y + y2, 0, ysize - 1 ), channel2 );
  100. return v1 -v2;
  101. }
  102. double MinusAbs::getVal ( const Features &feats, const int &x, const int &y )
  103. {
  104. int xsize, ysize;
  105. getXY ( feats, xsize, ysize );
  106. double v1 = values->getVal ( feats, BOUND ( x + x1, 0, xsize - 1 ), BOUND ( y + y1, 0, ysize - 1 ), channel1 );
  107. double v2 = values->getVal ( feats, BOUND ( x + x2, 0, xsize - 1 ), BOUND ( y + y2, 0, ysize - 1 ), channel2 );
  108. return abs ( v1 -v2 );
  109. }
  110. double Addition::getVal ( const Features &feats, const int &x, const int &y )
  111. {
  112. int xsize, ysize;
  113. getXY ( feats, xsize, ysize );
  114. double v1 = values->getVal ( feats, BOUND ( x + x1, 0, xsize - 1 ), BOUND ( y + y1, 0, ysize - 1 ), channel1 );
  115. double v2 = values->getVal ( feats, BOUND ( x + x2, 0, xsize - 1 ), BOUND ( y + y2, 0, ysize -
  116. 1 ), channel2 );
  117. return v1 + v2;
  118. }
  119. double Only1::getVal ( const Features &feats, const int &x, const int &y )
  120. {
  121. int xsize, ysize;
  122. getXY ( feats, xsize, ysize );
  123. double v1 = values->getVal ( feats, BOUND ( x + x1, 0, xsize - 1 ), BOUND ( y + y1, 0, ysize - 1 ), channel1 );
  124. return v1;
  125. }
  126. double RelativeXPosition::getVal ( const Features &feats, const int &x, const int &y )
  127. {
  128. int xsize, ysize;
  129. getXY ( feats, xsize, ysize );
  130. return ( double ) x / ( double ) xsize;
  131. }
  132. double RelativeYPosition::getVal ( const Features &feats, const int &x, const int &y )
  133. {
  134. int xsize, ysize;
  135. getXY ( feats, xsize, ysize );
  136. return ( double ) x / ( double ) xsize;
  137. }
  138. double IntegralOps::getVal ( const Features &feats, const int &x, const int &y )
  139. {
  140. return feats.feats->getIntegralValue(x + x1, y + y1, x + x2, y + y2, channel1);
  141. }
  142. double GlobalFeats::getVal ( const Features &feats, const int &x, const int &y )
  143. {
  144. int xsize, ysize;
  145. getXY ( feats, xsize, ysize );
  146. return feats.feats->getIntegralValue( 0, 0, xsize - 1, ysize - 1, channel1 );
  147. }
  148. double IntegralCenteredOps::getVal ( const Features &feats, const int &x, const int &y )
  149. {
  150. return feats.feats->getIntegralValue(x - x1, y - y1, x + x1, y + y1, channel1);
  151. }
  152. double BiIntegralCenteredOps::getVal ( const Features &feats, const int &x, const int &y )
  153. {
  154. return feats.feats->getIntegralValue(x - x1, y - y1, x + x1, y + y1, channel1 ) - feats.feats->getIntegralValue(x - x2, y - y2, x + x2, y + y2, channel1);
  155. }
  156. double HaarHorizontal::getVal ( const Features &feats, const int &x, const int &y )
  157. {
  158. int tlx = x - x1;
  159. int tly = y - y1;
  160. int lrx = x + x1;
  161. int lry = y + y1;
  162. return feats.feats->getIntegralValue(tlx, tly, lrx, y, channel1 ) - feats.feats->getIntegralValue(tlx, y, lrx, lry, channel1);
  163. }
  164. double HaarVertical::getVal ( const Features &feats, const int &x, const int &y )
  165. {
  166. int tlx = x - x1;
  167. int tly = y - y1;
  168. int lrx = x + x1;
  169. int lry = y + y1;
  170. return feats.feats->getIntegralValue(tlx, tly, x, lry, channel1) - feats.feats->getIntegralValue(x, tly, lrx, lry, channel1);
  171. }
  172. double HaarDiag::getVal ( const Features &feats, const int &x, const int &y )
  173. {
  174. int tlx = x - x1;
  175. int tly = y - y1;
  176. int lrx = x + x1;
  177. int lry = y + y1;
  178. return feats.feats->getIntegralValue(tlx, tly, x, y, channel1) + feats.feats->getIntegralValue(x, y, lrx, lry, channel1) - feats.feats->getIntegralValue(tlx, y, x, lry, channel1) - feats.feats->getIntegralValue(x, tly, lrx, y, channel1);
  179. }
  180. double Haar3Horiz::getVal ( const Features &feats, const int &x, const int &y )
  181. {
  182. int tlx = x - x2;
  183. int tly = y - y2;
  184. int mtly = y - y1;
  185. int mlry = y + y1;
  186. int lrx = x + x2;
  187. int lry = y + y2;
  188. return feats.feats->getIntegralValue(tlx, tly, lrx, mtly, channel1) - feats.feats->getIntegralValue(tlx, mtly, lrx, mlry, channel1) + feats.feats->getIntegralValue(tlx, mlry, lrx, lry, channel1);
  189. }
  190. double Haar3Vert::getVal ( const Features &feats, const int &x, const int &y )
  191. {
  192. int tlx = x - x2;
  193. int tly = y - y2;
  194. int mtlx = x - x1;
  195. int mlrx = x + x1;
  196. int lrx = x + x2;
  197. int lry = y + y2;
  198. return feats.feats->getIntegralValue(tlx, tly, mtlx, lry, channel1) - feats.feats->getIntegralValue(mtlx, tly, mlrx, lry, channel1) + feats.feats->getIntegralValue(mlrx, tly, lrx, lry, channel1);
  199. }
  200. void IntegralOps::set ( int _x1, int _y1, int _x2, int _y2, int _channel1, int _channel2, ValueAccess *_values )
  201. {
  202. x1 = std::min ( _x1, _x2 );
  203. y1 = std::min ( _y1, _y2 );
  204. x2 = std::max ( _x1, _x2 );
  205. y2 = std::max ( _y1, _y2 );
  206. channel1 = _channel1;
  207. channel2 = _channel2;
  208. values = _values;
  209. }
  210. void IntegralCenteredOps::set ( int _x1, int _y1, int _x2, int _y2, int _channel1, int _channel2, ValueAccess *_values )
  211. {
  212. x1 = abs ( _x1 );
  213. y1 = abs ( _y1 );
  214. x2 = abs ( _x2 );
  215. y2 = abs ( _y2 );
  216. channel1 = _channel1;
  217. channel2 = _channel2;
  218. values = _values;
  219. }
  220. void BiIntegralCenteredOps::set ( int _x1, int _y1, int _x2, int _y2, int _channel1, int _channel2, ValueAccess *_values )
  221. {
  222. x1 = std::min ( abs ( _x1 ), abs ( _x2 ) );
  223. y1 = std::min ( abs ( _y1 ), abs ( _y2 ) );
  224. x2 = std::max ( abs ( _x1 ), abs ( _x2 ) );
  225. y2 = std::max ( abs ( _y1 ), abs ( _y2 ) );
  226. channel1 = _channel1;
  227. channel2 = _channel2;
  228. values = _values;
  229. }