LFReadCache.tcc 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. template <class ImageClass>
  18. int LFReadCache::extractFeaturesTemplate ( const ImageClass & img,
  19. NICE::VVector & features,
  20. NICE::VVector & positions) const
  21. {
  22. std::string filename = Globals::getCacheFilename ( cachedir, cachemode );
  23. std::string filename_desc = filename + ".desc";
  24. std::string filename_pos = filename + ".key";
  25. int ret = 0;
  26. if ( ! NICE::FileMgt::fileExists ( filename_desc ) ||
  27. ! NICE::FileMgt::fileExists ( filename_pos ) )
  28. {
  29. fprintf (stderr, "LFReadCache::extractFeatures: recovering data (%s,%s not found)\n", filename_desc.c_str(),
  30. filename_pos.c_str());
  31. if ( lfrep == NULL )
  32. fthrow(Exception, "LocalFeatureRepresentation not available, recovering is impossible!");
  33. lfrep->extractFeatures ( img, features, positions );
  34. features.save ( filename_desc, descFormat );
  35. positions.save ( filename_pos, NICE::VVector::FILEFORMAT_LINE );
  36. } else {
  37. if ( (descFormat == NICE::VVector::FILEFORMAT_BINARY_DOUBLE) || (descFormat == NICE::VVector::FILEFORMAT_BINARY_CHAR) )
  38. {
  39. if ( lfrep == NULL ) {
  40. fthrow(Exception, "Raw binary format needs a LocalFeatureRepresentation as prototype");
  41. } else {
  42. features.setBufSize(lfrep->getDescSize());
  43. }
  44. }
  45. features.read( filename_desc, descFormat );
  46. positions.read ( filename_pos, NICE::VVector::FILEFORMAT_LINE );
  47. if ( positions.size() != features.size() )
  48. {
  49. std::cerr << "LFReadCache::extractFeatures: format error ! positions.size=" << positions.size() <<
  50. " features.size()=" << features.size() << std::endl;
  51. std::cerr << "features: " << filename_desc << std::endl;
  52. std::cerr << "positions: " << filename_pos << std::endl;
  53. exit(-1);
  54. }
  55. if ( (numFeatures >= 0) && (features.size() > (size_t)numFeatures) ) {
  56. size_t n = features.size() - numFeatures; // >= 1
  57. fprintf (stderr, "LFReadCache: number of local features is restricted: localfeature_count %d, real %d\n",
  58. numFeatures, (int)features.size() );
  59. if ( n > (size_t)numFeatures ) {
  60. NICE::VVector nf;
  61. NICE::VVector np;
  62. for ( size_t l = 0 ; l < (size_t)numFeatures ; l++ )
  63. {
  64. size_t i = rand() % features.size();
  65. nf.push_back ( features[i] );
  66. np.push_back ( positions[i] );
  67. features.erase ( features.begin() + i );
  68. positions.erase ( positions.begin() + i );
  69. }
  70. positions = np;
  71. features = nf;
  72. } else {
  73. for ( size_t l = 0 ; l < n ; l++ )
  74. {
  75. size_t i = rand() % features.size();
  76. features.erase ( features.begin() + i );
  77. positions.erase ( positions.begin() + i );
  78. }
  79. }
  80. }
  81. }
  82. return ret;
  83. }
  84. }