Blob Blame Raw
#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