/** 
* @file LFMikolajczyk.h
* @brief interface to Mikolajczyk implementation
* @author Erik Rodner
* @date 11/19/2007

*/
#ifndef LFMIKOLAJCZYKINCLUDE
#define LFMIKOLAJCZYKINCLUDE

#include "core/vector/VectorT.h"
#include "core/vector/MatrixT.h"
#include "core/image/ImageT.h"

#include "LocalFeatureRepresentation.h"
#include "core/basics/Config.h"
  

namespace OBJREC {

/** interface to Mikolajczyk implementation */
class LFMikolajczyk : public LocalFeatureRepresentation
{

  protected:
    std::string c_binaryExecutable;
    std::string c_params;
    double c_minScale;
    
    int descriptor_size;


  public:

    ///////////////////// ///////////////////// /////////////////////
    //                   CONSTRUCTORS / DESTRUCTORS
    ///////////////////// ///////////////////// /////////////////////
    
    /** 
     * @brief default constructor
     * @date 10-02-2014 (dd-mm-yyyy )
     * @author Alexander Freytag
     */
    LFMikolajczyk();      
  
    /** simple constructor */
    LFMikolajczyk( const NICE::Config *conf );
  
    /** simple destructor */
    virtual ~LFMikolajczyk();
      
    ///////////////////// ///////////////////// /////////////////////
    //                      FEATURE STUFF
    ///////////////////// ///////////////////// //////////////////        
      
    int getDescSize () const;

    int extractFeatures ( const NICE::Image & img, NICE::VVector & features, 
                          NICE::VVector & positions ) 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

#endif
