LocalFeatureSift.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. /**
  2. * @file LocalFeatureSift.cpp
  3. * @brief local feature with sift
  4. * @author Erik Rodner
  5. * @date 02/05/2008
  6. */
  7. // #ifdef NICE_USELIB_ICE
  8. // #include <image_nonvis.h>
  9. // #endif
  10. #include <iostream>
  11. #include "core/basics/Exception.h"
  12. #include "vislearning/features/localfeatures/sift.h"
  13. #include "vislearning/features/localfeatures/LocalFeatureSift.h"
  14. using namespace OBJREC;
  15. using namespace std;
  16. using namespace NICE;
  17. LocalFeatureSift::LocalFeatureSift( const Config *conf )
  18. {
  19. octaves = conf->gI("LFSiftPP", "octaves", 6);
  20. levels = conf->gI("LFSiftPP", "levels", 3);
  21. first_octave = conf->gI("LFSiftPP", "first_octave", -1);
  22. normalizeFeature = conf->gB("LFSiftPP", "normalize_feature", true );
  23. magnif = conf->gD("LFSiftPP", "magnif", 3 );
  24. deletemode = conf->gB("LFSiftPP", "deletemode", true );
  25. integerValues = conf->gB("LFSiftPP", "integer_values", true );
  26. }
  27. LocalFeatureSift::~LocalFeatureSift()
  28. {
  29. }
  30. void LocalFeatureSift::sortPositions(VVector & positions) const
  31. {
  32. // < Key , Val >
  33. map<double, bool> scales;
  34. // in der Map entpsrechende Skalewerte auf true setzten, jeder Skalewert ist dabei einzigartig
  35. for( vector< NICE::Vector >::iterator i = positions.begin();
  36. i != positions.end();i++)
  37. {
  38. const NICE::Vector & pos = *i;
  39. scales[pos[2]] = true;
  40. }
  41. VVector newpositions;
  42. map<double,bool>::iterator iter;
  43. // Map durchlaufen
  44. for( iter = scales.begin(); iter != scales.end(); ++iter )
  45. {
  46. // alle Positionen durchlaufen
  47. for( vector< NICE::Vector >::iterator i = positions.begin();
  48. i != positions.end();i++)
  49. {
  50. const NICE::Vector & pos = *i;
  51. if(pos[2] == iter->first)
  52. {
  53. newpositions.push_back(pos);
  54. }
  55. }
  56. }
  57. positions = newpositions;
  58. }
  59. void LocalFeatureSift::computeDesc( const NICE::Image & img, VVector & positions, VVector & descriptors ) const
  60. {
  61. int O = octaves ;
  62. int const S = levels ;
  63. int const omin = first_octave;
  64. float const sigman = .5 ; //.5
  65. float const sigma0 = 1.6 * powf(2.0f, 1.0f / S) ;
  66. if (O < 1)
  67. {
  68. O = std::max(int(std::floor(log2
  69. (std::min(img.width(),img.height()))) - omin - 3), 1) ;
  70. }
  71. const unsigned char *blockimg = (unsigned char*) img.getPixelPointer();
  72. float *blockimgfl = new float[img.width() * img.height()];
  73. for ( int k = 0 ; k < img.width() * img.height() ; k++ )
  74. blockimgfl[k] = blockimg[k];
  75. VL::Sift sift( blockimgfl, img.width(), img.height(),
  76. sigman, sigma0, O, S, omin, -1, S+1) ;
  77. sift.process ( blockimgfl, img.width(), img.height() );
  78. sift.setMagnification ( magnif );
  79. sift.setNormalizeDescriptor ( normalizeFeature );
  80. const int descr_size = 128;
  81. VL::float_t *descr_pt = new VL::float_t [descr_size];
  82. VL::float_t angles[4] ;
  83. NICE::Vector feature (descr_size);
  84. NICE::Vector pos ( 4 );
  85. for( vector< NICE::Vector >::iterator i = positions.begin();
  86. i != positions.end();)
  87. {
  88. const NICE::Vector & pos = *i;
  89. double x = pos[0];
  90. double y = pos[1];
  91. assert(pos[0] < img.width());
  92. assert(pos[1] < img.height());
  93. double s = pos[2];
  94. bool deleteFeature = false;
  95. VL::Sift::Keypoint kp = sift.getKeypoint (x,y,s);
  96. double angle = 0.0;
  97. if ( pos.size() < 4 )
  98. {
  99. int nangles = sift.computeKeypointOrientations(angles, kp);
  100. if ( nangles > 0 )
  101. {
  102. angle = angles[0];
  103. }
  104. else
  105. {
  106. if(deletemode)
  107. deleteFeature = true;
  108. else
  109. angle = 0;
  110. }
  111. }
  112. else
  113. {
  114. angle = pos[3];
  115. }
  116. if ( ! deleteFeature )
  117. {
  118. sift.computeKeypointDescriptor ( descr_pt, kp, angle );
  119. for ( int j = 0 ; j < descr_size ; j++ )
  120. // Umwandlung in Integer moegl.
  121. feature[j] = (integerValues ? (int)(512*descr_pt[j]) : descr_pt[j]);
  122. descriptors.push_back ( feature );
  123. i++;
  124. }
  125. else
  126. {
  127. i = positions.erase(i);
  128. }
  129. }
  130. delete [] blockimgfl;
  131. delete [] descr_pt;
  132. }
  133. int LocalFeatureSift::getDescriptors ( const NICE::Image & img, VVector & positions, VVector & descriptors ) const
  134. {
  135. sortPositions(positions);
  136. computeDesc(img, positions, descriptors);
  137. return 0;
  138. }
  139. void LocalFeatureSift::visualizeFeatures ( NICE::Image & mark,
  140. const VVector & positions,
  141. size_t color ) const
  142. {
  143. fthrow(Exception, "LocalFeatureSift::visualizeFeatures -- not yet implemented due to old ICE version.");
  144. //TODO check this!
  145. // #ifdef NICE_USELIB_ICE
  146. // ice::Image mark_ice = ice::NewImg ( mark.width(),
  147. // mark.height(), 255 );
  148. // for ( size_t k = 0 ; k < positions.size() ; k++ )
  149. // {
  150. // const NICE::Vector & pos = positions[k];
  151. // ice::Matrix points ( 0, 2 );
  152. // const int size = 6;
  153. // points.Append ( ice::Vector(-size, -size) );
  154. // points.Append ( ice::Vector(-size, size) );
  155. // points.Append ( ice::Vector(size, size) );
  156. // points.Append ( ice::Vector(size, -size) );
  157. //
  158. // ice::Trafo tr;
  159. //
  160. // tr.Scale ( 0, 0, pos[2] );
  161. // tr.Rotate ( 0, 0, pos[3] );
  162. // tr.Shift ( pos[0], pos[1] );
  163. //
  164. // ice::TransformList(tr, points);
  165. //
  166. // for ( int j = 0 ; j < points.rows(); j++ )
  167. // {
  168. // if (points[j][0] < 0 )
  169. // points[j][0] = 0;
  170. // if (points[j][0] >= mark_ice->xsize)
  171. // points[j][0] = mark_ice->xsize - 1;
  172. // if (points[j][1] < 0 )
  173. // points[j][1] = 0;
  174. // if (points[j][1] >= mark_ice->ysize)
  175. // points[j][1] = mark_ice->ysize - 1;
  176. // }
  177. // ice::DrawPolygon ( points, color, mark_ice );
  178. // }
  179. //
  180. // for ( unsigned int y = 0 ; y < mark.height(); y++ )
  181. // for ( unsigned int x = 0 ; x < mark.width(); x++ )
  182. // mark.setPixel(x,y, GetVal(mark_ice,x,y));
  183. // #else
  184. // cerr << "uses ice visualization, please install ice or change to NICE visualization" << endl;
  185. // #endif
  186. }