/**
* @file EOHFeature.h
* @brief edge orientation histogram (Levi and Weiss, 2004)
* @author Erik Rodner
* @date 05/07/2008

*/
#ifndef EOHFeatureINCLUDE
#define EOHFeatureINCLUDE

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

#include "core/basics/Config.h"
#include "vislearning/cbaselib/Feature.h"


namespace OBJREC {

/** edge orientation feature of Levi and Weiss */
class EOHFeature : public Feature
{

  protected:

    enum {
      EOH_VALUE = 0,
      EOH_RATIO,
      EOH_DOMINANT_ORIENTATION,
      EOH_NUMTYPES
    };

    /** @{ feature parameter */
    int window_size_x;
    int window_size_y;
    int bin;
    int bin2; // used for EOH_RATIO
    int type;
    /** @} */


    /** @{ parameter for feature generation */
    int numScales;
    int numBins;
    double scaleStep;
    int maxdepth;
    /** @} */

  public:

    /** simple constructor */
    EOHFeature ( const NICE::Config *conf );

    /** internally used by EOHFeature::explode */
    EOHFeature () {
      bin = bin2 = 0;
      type = EOH_VALUE;
    };

    /** simple destructor */
    virtual ~EOHFeature();

    double val ( const Example *example ) const;
    void explode ( FeaturePool & featurePool, bool variableWindow = true ) const;
    Feature *clone() const;
    Feature *generateFirstParameter () const;

    void restore ( std::istream & is, int format = 0 );
    void store ( std::ostream & os, int format = 0 ) const;
    void clear ();
};


} // namespace

#endif
