/** 
* @file LFReadCache.h
* @brief read local features from file
* @author Erik Rodner, Alexander Freytag
* @date 02/14/2008

*/
#ifndef LFReadCacheINCLUDE
#define LFReadCacheINCLUDE

#include "core/vector/VectorT.h"
#include "core/vector/MatrixT.h"
#include "core/image/ImageT.h"
 
#include "LocalFeatureRepresentation.h"
#include "LFSiftPP.h"
#include "core/basics/Config.h"


namespace OBJREC {

/** @class LFReadCache
* @brief Read local features from file
*
*/   
class LFReadCache : public LocalFeatureRepresentation
{

  protected:
    
    int   numFeatures;
    
    LocalFeatureRepresentation *lfrep;
    
    std::string cachedir;

    int descFormat;
    
    int cachemode;

    template <class ImageClass>
    int extractFeaturesTemplate ( const ImageClass & img, 
          NICE::VVector & features, 
          NICE::VVector & positions) const;
          
    void setDescFormat ( const std::string & _descFormat_s );

  public:
    
    ///////////////////// ///////////////////// /////////////////////
    //                   CONSTRUCTORS / DESTRUCTORS
    ///////////////////// ///////////////////// /////////////////////    
    
    /** 
     * @brief default constructor
     * @date 10-02-2014 (dd-mm-yyyy )
     * @author Alexander Freytag
     */
    LFReadCache ( );
    
    /** 
     * @brief standard constructor 
     * @date 10-02-2014 (dd-mm-yyyy )
     * @author Alexander Freytag
     * @param conf Configuration
     * @param _section specify the block in the config object we read 
     */
    LFReadCache( const NICE::Config * _conf, 
          const std::string & _confSection = "LFReadCache" /*NOTE previous default: "cache"*/          
              );    
    
    /** standard constructor 
    * @param conf Configuration
    * @param lfrep a LocalFeatureRepresentation (i.e. LFColorSande)
    * @param _numfeatures how many features should be returned (-1 for all)
    * @param _section specify the block in the config object we read 
    */
    LFReadCache( const NICE::Config * _conf, 
          LocalFeatureRepresentation *lfrep,
          int _numFeatures = -1,
          const std::string & _confSection = "LFReadCache" /*NOTE previous default: "cache"*/          
              ); 
        
    /** simple destructor */
    virtual ~LFReadCache();
        
    /** 
     * @brief Jobs previously performed in the config-version of the constructor, read settings etc.
     * @author Alexander Freytag
     * @date 10-02-2014 ( dd-mm-yyyy )
     */    
    void initFromConfig ( const NICE::Config * _conf, const std::string & _confSection = "LFReadCache"); 
    
    ///////////////////// ///////////////////// /////////////////////
    //                      FEATURE STUFF
    ///////////////////// ///////////////////// //////////////////    

    int getDescSize () const;

    /**
    * extract features for gray images
    * @param img input image
    * @param features output features
    * @param positions position of the features
    * @return 
    */
    int extractFeatures ( const NICE::Image & img, 
              NICE::VVector & features, 
              NICE::VVector & positions ) const;
    
    /**
    * extract features for color images
    * @param img input image
    * @param features output features
    * @param positions position of the features
    * @return 
    */
    int extractFeatures ( const NICE::ColorImage & img, 
              NICE::VVector & features, 
              NICE::VVector & positions ) const;

    void visualize ( NICE::Image & img, 
      const NICE::Vector & feature ) const;

    void visualizeFeatures ( NICE::Image & mark,
          const NICE::VVector & positions,
          size_t color ) const;
          
    ///////////////////// INTERFACE PERSISTENT /////////////////////
    // interface specific methods for store and restore
    ///////////////////// INTERFACE PERSISTENT /////////////////////   
    
    /** 
     * @brief Load object from external file (stream)
     * @author Alexander Freytag
     * @date 10-02-2014 ( dd-mmyyyy)
     */     
    virtual void restore ( std::istream & is, int format = 0 );
    
    /** 
     * @brief Save object to external file (stream)
     * @author Alexander Freytag
     * @date 10-02-2014 ( dd-mmyyyy)
     */       
    virtual void store( std::ostream & os, int format = 0 ) const;
    
    /** 
     * @brief Clear  object
     * @author Alexander Freytag
     * @date 10-02-2014 ( dd-mmyyyy)
     */    
    virtual void clear ();           
  };

} // namespace

#include "LFReadCache.tcc"


#endif
