//-------------------------------------------------------------
//      ____                        _      _
//     / ___|____ _   _ ____   ____| |__  | |
//    | |   / ___| | | |  _  \/ ___|  _  \| |
//    | |___| |  | |_| | | | | |___| | | ||_|
//     \____|_|  \_____|_| |_|\____|_| |_|(_) Media benchmarks
//                  
//	  2006, Intel Corporation, licensed under Apache 2.0 
//
//  file : TrackingModel.h
//  author : Scott Ettinger - scott.m.ettinger@intel.com
//  description : Observation model for kinematic tree body 
//				  tracking.  

//				  Derived classes implement multi-threaded 
//				  versions of this class, however some of the
//				  capability for multithreading is implemented
//				  here.  Memory is allocated for separate threads
//				  if necessary and the likelihood function takes 
//				  a thread id.  Defaults are for 1 thread.
//				  
//  modified : 
//--------------------------------------------------------------

#ifndef TRACKINGMODEL_H
#define TRACKINGMODEL_H

#if defined(HAVE_CONFIG_H)
# include "config.h"
#endif

#include <vector>
#include <string>
#include <FlexImage.h>
#include "ImageMeasurements.h"
#include "ImageProjection.h"
#include "CameraModel.h"
#include "BodyGeometry.h"
#include "BinaryImage.h"

#define FlexImage8u  FlexImage<Im8u,1>
#define FlexImage32f FlexImage<Im32f,1>

class TrackingModel{
protected:
	std::vector<BinaryImage >				mFGMaps;			// Background segmented images from each camera 
	std::vector<FlexImage8u>				mEdgeMaps;			// edge processed images from each camera
	std::vector<std::vector<float> >		mStdDevs;			// standard deviations for each layer of annealed particle filtering
	std::vector<BodyPose>					mPoses;				// Body poses and displacement parameters
	std::vector<BodyGeometry>				mBodies;			// Body geometry objects
	MultiCamera								mCameras;			// All cameras
	std::vector<MultiCameraProjectedBody>	mProjections;		// Image projections of the body on all cameras
	std::vector<ImageMeasurements>			mImageMeasurements;	// Image measurement objects for error computation
	int										mNCameras;			// number of cameras used
	std::string								mPath;				// dataset path

	//Load Camera(s) parameters from configuration files
	bool InitCameras(std::vector<std::string> &calibFiles);

	//Initialize body model geometry parameters and initial pose from configuration file
	bool InitGeometry(const std::string &fname) {return mBodies[0].InitBodyShape(fname); };

	//Load initial state from a file
	bool LoadInitialState(const std::string &fname) {return mPoses[0].Initialize(fname); };

	//Load Body Pose Parameters from a file
	bool LoadPoseParameters(const std::string &fname) {return mPoses[0].InitParams(fname); };

	//Generate an edge map from the original camera image
	virtual void CreateEdgeMap(const FlexImage8u &src, FlexImage8u &dst);

public:

	TrackingModel();
	virtual ~TrackingModel() {};

	//Get function for standard deviations of pose motion
	std::vector<std::vector<float> > &StdDevs() {return mStdDevs; };

	//Load body parameters, camera calibrations, and initial state from dataset
	bool Initialize(const std::string &path, int cameras, int layers);

	//Allocate data for n threads
	void SetNumThreads(int n);

	//Load and process new observation data from image files for a given time(frame).  Generates edge maps from the raw image files.
	virtual bool GetObservation(float timeval);

	//Returns body pose state - required by particle filter for initialization only
	std::vector<float> InitialState() {return mPoses[0].Pose(); };

	//Calculates Log likelihood for a given set of body pose angles (and translation - all are in the vector)
	float LogLikelihood(const std::vector<float> &v, bool &valid, int thread = 0);

	//Draw body geometry onto camera image and save as BMP
	bool OutputBMP(const std::vector<float> &pose, int frame);

};


#endif
