/** 
* @file LFSiftPP.h
* @brief Sift++ interface (with detector!)
* @author Erik Rodner
* @date 11/19/2007

*/
#ifndef LFSIFTPPINCLUDE
#define LFSIFTPPINCLUDE

#include "core/imagedisplay/ImageDisplay.h"

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

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


namespace OBJREC {

/** Sift++ interface */
class LFSiftPP : public LocalFeatureRepresentation
{

    protected:
	enum {
	    DALGIN_DETECTOR = 0,
	    DALIGN_MULTIPLE
	};

	int descriptorAlignment;
	double minScale;
	double maxScale;
	int numScales;
	int numAngles;

	float threshold;
	float edgeThreshold;
	int levels;
	int octaves;
	int first_octave;
	bool normalizeFeature;

    public:
  
	/** simple constructor */
	LFSiftPP( const NICE::Config *conf );
      
	/** simple destructor */
	virtual ~LFSiftPP();
	
	int getDescSize () const;

	int extractFeatures ( const NICE::Image & img, NICE::VVector & features, 
			      NICE::VVector & positions ) const;
 
	void visualizeFeatures ( NICE::Image & mark,
				 const NICE::VVector & positions,
				 size_t color ) const;
    
};


} // namespace

#endif
