text: #pragma once
  
  #if !defined(OBEJCTTRACKER_H_INCLUDED_)
  #define OBEJCTTRACKER_H_INCLUDED_
  
  #include <memory>
  
  #include "traster.h"
  #include "predict3d.h"
  
  typedef unsigned char UBYTE8;
  typedef unsigned int UINT32;
  
  // structure pixel RGB
  struct ValuePixel {
    UBYTE8 r;
    UBYTE8 g;
    UBYTE8 b;
  };
  
  // structure position (old and new) and distance^2 of neighbours,
  struct NEIGHBOUR {
    short X;
    short Y;
    float dist2;
    short X_old, Y_old;
  };
  
  class CObjectTracker {
  public:
    short objID;
    bool track;
  
  private:
    struct OBJECT_SPECS {
      bool Status;
      bool assignedAnObject;
  
      short dim_temp;  // dimension searce template area (real area =
                       // (2*dim_temp+1)*(2*dim_temp+1))
      short var_dim;   // variation dimension window (dimension in pixel)
      float threshold_distance;    // threshold of lose object
      float threshold_distance_B;  // threshold of lose object
  
      // characterize
      short X;
      short Y;
      short W;
      short H;
      short half_pixelx;  // precision half pixel x
      short half_pixely;  // precision half pixel y
  
      // old characterize
      short X_old;
      short Y_old;
      short W_old;
      short H_old;
  
      // histogram
      std::unique_ptr<float[]> initHistogram;
      std::unique_ptr<float[]> weights_background;
  
      // template characterize
      short X_temp;
      short Y_temp;
      short W_temp;
      short H_temp;
    };
  
    OBJECT_SPECS m_sTrackingObject;
    int m_nImageWidth;
    int m_nImageHeight;
    bool colorimage;
    bool att_background;
    int HISTOGRAM_LENGTH;
    bool man_occlusion;
    NEIGHBOUR neighbours[30];
    Predict3D::Point initial;
    bool m_initialized;
    std::string m_visible;
    int m_K_dist;
  
    //--------------------------------------------------------------------------------------------------------
  
    void FindHistogram(TRaster32P *frame, float(*histogram), float h);
    //--------------------------------------------------------------------------------------------------------
  
    void FindHistogramBackground(TRaster32P *frame, float(*background));
    //--------------------------------------------------------------------------------------------------------
  
    void FindWeightsBackground(TRaster32P *frame);
    //--------------------------------------------------------------------------------------------------------
  
    void FindWightsAndCOM(TRaster32P *frame, float(*histogram));
    //--------------------------------------------------------------------------------------------------------
  
    UBYTE8 CheckEdgeExistence(TRaster32P *frame, short _x, short _y);
    //--------------------------------------------------------------------------------------------------------
  
    void UpdateInitialHistogram(float(*histogram));
    //--------------------------------------------------------------------------------------------------------
  
    ValuePixel GetPixelValues(TRaster32P *frame, short x, short y);
    //--------------------------------------------------------------------------------------------------------
  
    void SetPixelValues(TRaster32P *frame, ValuePixel pixelValues, short x,
                        short y);
  
  public:
    CObjectTracker(int imW, int imH, bool _colorimage, bool _att_background,
                   bool _man_occlusion);
    //--------------------------------------------------------------------------------------------------------
  
    virtual ~CObjectTracker();
    //--------------------------------------------------------------------------------------------------------
  
    void FindNextLocation(TRaster32P *frame);
    //--------------------------------------------------------------------------------------------------------
  
    void ObjeckTrackerHandlerByUser(TRaster32P *frame);
    //--------------------------------------------------------------------------------------------------------
  
    void ObjectTrackerInitObjectParameters(short id, short x, short y,
                                           short Width, short Height, short _dim,
                                           short _var_dim, float _dist,
                                           float _distB);
    //--------------------------------------------------------------------------------------------------------
  
    void updateTemp();
  
    //--------------------------------------------------------------------------------------------------------
  
    float Matching(TRaster32P *frame, TRaster32P *frame_temp);
    //--------------------------------------------------------------------------------------------------------
  
    void DistanceAndUpdate(NEIGHBOUR position);
    //--------------------------------------------------------------------------------------------------------
  
    void SetPositionByNeighbours(void);
    //--------------------------------------------------------------------------------------------------------
  
    void WriteOnOutputFile(char *filename);
    //--------------------------------------------------------------------------------------------------------
  
    void DistanceReset(void);
    //--------------------------------------------------------------------------------------------------------
  
    NEIGHBOUR GetPosition(void);
    //--------------------------------------------------------------------------------------------------------
  
    void SetInit(bool status);
    //--------------------------------------------------------------------------------------------------------
  
    bool GetInit();
    //--------------------------------------------------------------------------------------------------------
  
    std::string GetVisibility();
    //--------------------------------------------------------------------------------------------------------
  
    void SetVisibility(std::string visibily);
    //--------------------------------------------------------------------------------------------------------
  
    Predict3D::Point GetInitials();
    //--------------------------------------------------------------------------------------------------------
  
    void SetInitials(NEIGHBOUR position);
    //--------------------------------------------------------------------------------------------------------
  
    void SetPosition(short x, short y);
    //--------------------------------------------------------------------------------------------------------
  
    int GetKDist();
    //--------------------------------------------------------------------------------------------------------
    short getId() { return objID; }
  
  };  // end of trackobject class
  //---------------------------------------------------------------------------
  #endif
  