www.pudn.com > ReadingPeopleTracker-1.28.rar > Profile.h


/*
 * Profile.h
 * 
 * a record class for storing the Profile data
 * of an object
 *
 * AMB 27/4/93
 */

#ifndef __PROFILE_H__
#define __PROFILE_H__

#include "Observation.h"
#include "BoundaryPoints.h"
#include "EnvParameter.h"
#include "KalmanFilterOneD.h"
#include "KalmanFilterTwoD.h"

namespace ReadingPeopleTracker
{

class Image;
class ColourBlob;
// class ActiveShapeTracker;
class SplineWeights;

#define spline point_data()


class Profile : public PointVector, public Observation
{
    friend class ProfileSet;
    friend std::istream &operator>> (std::istream &in_strm, Profile &profile);
    friend std::ostream &operator<< (std::ostream &out_strm, const Profile &profile);

private:
    static const realno LARGE;
  
//     ActiveShapeTracker *tracker;

    // inverse of the gradient of line of best fit
    realno inv_grad;
    
    // used in tracking module
    Point2 &direction;

    // simple flag for ProfileSequence only (used to use the removed ref_no)
    int PCA_flag;

    SplineWeights *spline_weights;

public:    

    static unsigned int NO_CONTROL_POINTS;

////////////// tracking data

    // tracking status
    bool filters_initialised;
    
    realno a_x, a_y;			// alignment parameters
    unsigned int no_shape_parameters;		// equivalent to model depth!
    StaticKalmanTwoD *a_filter;         // alignment (scale and rotation) filter
    FilterOneD **filters;		// shape filters
    
    FilterTwoD *pos_filter;       // origin filter
    
    StaticKalmanOneD *s_filter;   // scale filter or NULL
    StaticKalmanOneD *th_filter;  // rotation filter or NULL
    
    realno track_error;		// the error on last active fit
    realno fitness;             // track fitness (between 0 and 1, 1 == perfect fit)
    
    ColourBlob *colour_info;    // array for tracking coloured edges
    int no_cblobs;              // number of ColourBlobs in the above array
    
// constructor / destructors
    
public:
    Profile();
    Profile(realno ox, realno oy, realno wdth, realno hgt);
    Profile(Profile &original);
    Profile &operator= (const Profile &original);
    Profile(Point2 &p_o, realno &p_w, realno &p_h, realno &p_grad,
	    PointVector &pnts, Point2 &direction);
    ~Profile();

// data access functions
    
    realno *get_shape(int i);
    realno get_data(int i); 
    void set_data(int i, realno val); 
    int get_data_size();
//     void set_tracker(ActiveShapeTracker *the_tracker)
// 	{
// 	    tracker = the_tracker;
// 	}
    
    
// utility functions
    
    // update Observation variables like xlo, xhi, width etc
    void update_size_variables();

// commented out: use update_variables() and then access Observation::xlo etc
//    void get_box(int &ixmin, int &ixmax, int &iymin, int &iymax);
//     void get_y_bounds(realno &ymin, realno &ymax);
//    realno get_size();  // returns 0.5 * (height + width)
   
    void draw(int col1, int col2, int col3);
    void draw_filled();
    void draw();
    
    void normalise(bool flag = true);
    // scale shape
    void scale(realno );
    // scale_coords -- scale up coordinates
    void scale_coords(realno );
    
    void unnormalise()
	{
	    normalise(false);
	}
    
    void map(const realno &ax, const realno &ay, Profile *result = NULL);
    
    void align_to(Profile *mean, Profile *result,
		  realno &s, realno &th, realno *weights = NULL);
    
    void recenter(realno *weights = NULL);
    
    BoundaryPoints *to_points(BoundaryPoints *res = NULL);
    BoundaryPoints *sample_normals(BoundaryPoints *res = NULL);
    void get_normals(Profile &res);
    
    // draw at given origin
    void display_shape(realno ox, realno oy);
    
    // draw into an Image structure
    void draw_in_image(Image *canvas, Point2 origin, bool filled = true);
    void draw_in_image(Image *canvas, bool filled = true)
	{
	    draw_in_image(canvas, origin, filled);
	}
    
    // reflect about y-axis
    Profile *reflect(Profile *result = NULL);
    
    void points_to_spline();
    
    // things for tracked profiles
    void map_to_model_frame()
	{
	    realno det = a_x * a_x + a_y * a_y;
	    this->map(a_x / det, -a_y / det);
	}
    
    void interpolate(NagVector &coeff, NagVector &res);

    // get enclosing box
    // return a box that encloses the current shape 
    // taking into account the positional uncertainty
    void get_enclosing_box(int &xmin, int &xmax, int &ymin, int &ymax);

    void update_shape_filters();
    
    static inline void putback_string(istream &in_strm, char *str1)
	{
	    while ((*str1) != 0)
		in_strm.putback(*str1++);
	}
    
    // static variables for drawing/ output routines
    
    static bool draw_boxes;	// draw control points ?
    static bool draw_arrow;	// draw direction arrow ?
    static bool draw_in_colour;	// draw using colour ?
    static bool draw_spline;	// draw boundary with a curve ?
    static bool draw_rectangle;	// draw with a rectangle ?
    static bool draw_fill;	// draw filled 2D shape ?
    static bool draw_dashed;	// draw with dashed lines ?
    static bool draw_label;     // draw (text) label for track ?
    
    static bool output_points;	// output control point data ?
    
    static int draw_linewidth;	   // line width for drawing people
    static realno draw_box_size;   // size for control point boxes

private:
    
    // private helpers
    void setup_spline_weights();
    
};

ostream &operator<< (ostream &out_strm, const Profile &profile);
istream &operator>> (istream &in_strm, Profile &profile);  

} // namespace ReadingPeopleTracker

#endif