LFReadCache.tcc 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /**
  2. * @file LFReadCache.tcc
  3. * @author Erik Rodner
  4. * @date 02/14/2008
  5. */
  6. #include "core/vector/VectorT.h"
  7. #include "core/vector/MatrixT.h"
  8. #include "core/image/ImageT.h"
  9. #include <iostream>
  10. #include <fstream>
  11. #include "vislearning/features/localfeatures/LFReadCache.h"
  12. #include "vislearning/baselib/Globals.h"
  13. #include "core/basics/StringTools.h"
  14. #include "core/basics/FileMgt.h"
  15. #include "core/vector/VVector.h"
  16. namespace OBJREC
  17. {
  18. template <class ImageClass>
  19. int LFReadCache::extractFeaturesTemplate ( const ImageClass & img,
  20. NICE::VVector & features,
  21. NICE::VVector & positions ) const
  22. {
  23. std::string filename = Globals::getCacheFilename ( cachedir, cachemode );
  24. std::string filename_desc = filename + ".desc";
  25. std::string filename_pos = filename + ".key";
  26. int ret = 0;
  27. if ( ! NICE::FileMgt::fileExists ( filename_desc ) ||
  28. ! NICE::FileMgt::fileExists ( filename_pos ) )
  29. {
  30. fprintf ( stderr, "LFReadCache::extractFeatures: recovering data (%s,%s not found)\n", filename_desc.c_str(),
  31. filename_pos.c_str() );
  32. if ( lfrep == NULL )
  33. fthrow ( NICE::Exception, "LocalFeatureRepresentation not available, recovering is impossible!" );
  34. std::cerr << "extract features with lfrep used in ReadCache" << std::endl;
  35. lfrep->extractFeatures ( img, features, positions );
  36. std::cerr << "features extracted" << std::endl;
  37. features.save ( filename_desc, descFormat );
  38. positions.save ( filename_pos, NICE::VVector::FILEFORMAT_LINE );
  39. }
  40. else
  41. {
  42. if ( ( descFormat == NICE::VVector::FILEFORMAT_BINARY_DOUBLE ) || ( descFormat == NICE::VVector::FILEFORMAT_BINARY_CHAR ) )
  43. {
  44. if ( lfrep == NULL )
  45. {
  46. fthrow ( NICE::Exception, "Raw binary format needs a LocalFeatureRepresentation as prototype" );
  47. }
  48. else
  49. {
  50. features.setBufSize ( lfrep->getDescSize() );
  51. }
  52. }
  53. features.read ( filename_desc, descFormat );
  54. positions.read ( filename_pos, NICE::VVector::FILEFORMAT_LINE );
  55. if ( positions.size() != features.size() )
  56. {
  57. std::cerr << "LFReadCache::extractFeatures: format error ! positions.size=" << positions.size() <<
  58. " features.size()=" << features.size() << std::endl;
  59. std::cerr << "features: " << filename_desc << std::endl;
  60. std::cerr << "positions: " << filename_pos << std::endl;
  61. exit ( -1 );
  62. }
  63. if ( ( numFeatures >= 0 ) && ( features.size() > ( size_t ) numFeatures ) )
  64. {
  65. size_t n = features.size() - numFeatures; // >= 1
  66. fprintf ( stderr, "LFReadCache: number of local features is restricted: localfeature_count %d, real %d\n",
  67. numFeatures, ( int ) features.size() );
  68. if ( n > ( size_t ) numFeatures )
  69. {
  70. NICE::VVector nf;
  71. NICE::VVector np;
  72. for ( size_t l = 0 ; l < ( size_t ) numFeatures ; l++ )
  73. {
  74. size_t i = rand() % features.size();
  75. nf.push_back ( features[i] );
  76. np.push_back ( positions[i] );
  77. features.erase ( features.begin() + i );
  78. positions.erase ( positions.begin() + i );
  79. }
  80. positions = np;
  81. features = nf;
  82. }
  83. else
  84. {
  85. for ( size_t l = 0 ; l < n ; l++ )
  86. {
  87. size_t i = rand() % features.size();
  88. features.erase ( features.begin() + i );
  89. positions.erase ( positions.begin() + i );
  90. }
  91. }
  92. }
  93. }
  94. return ret;
  95. }
  96. }