00001
00009 #ifndef _TRACKER_H_
00010 #define _TRACKER_H_
00011
00012 #include <opencv2/core/core.hpp>
00013 #include <blort/Tracker/headers.h>
00014 #include <blort/Tracker/Timer.h>
00015 #include <blort/Tracker/Resources.h>
00016 #include <blort/Tracker/Distribution.h>
00017 #include <blort/Tracker/Predictor.h>
00018 #include <blort/TomGine/tgMathlib.h>
00019 #include <blort/Tracker/CDataFile.h>
00020 #include <blort/Tracker/ModelEntry.h>
00021 #include <blort/TomGine/tgLighting.h>
00022
00024 namespace Tracking{
00025
00026 const float pi = 3.14159265358979323846f;
00027
00028 typedef std::vector<ModelEntry*> ModelEntryList;
00029
00031 class Tracker{
00032 public:
00033 struct Parameter{
00034 TomGine::tgCamera::Parameter camPar;
00035 int model_id_count;
00036 int hypotheses_id_count;
00037 int num_particles;
00038 int num_recursions;
00039 unsigned hypotheses_trials;
00040 int convergence;
00041 float edge_tolerance;
00042 unsigned int num_spreadings;
00043 unsigned int m_spreadlvl;
00044 Particle variation;
00045 float minTexGrabAngle;
00046 unsigned int max_kernel_size;
00047 int kernel_size;
00048 std::string modelPath;
00049 std::string texturePath;
00050 std::string shaderPath;
00051 float model_sobel_th;
00052 float image_sobel_th;
00053 float c_th_base;
00054 float c_th_min;
00055 float c_th_fair;
00056 float c_mv_not;
00057 float c_mv_slow;
00058 float c_th_lost;
00059 float pred_no_convergence;
00060
00061
00062 Parameter();
00063 };
00064
00065 public:
00066 Tracker();
00067 ~Tracker();
00068
00069
00071 bool init(const char* trackINIFile, const char* camCalFile, const char* poseCalFile);
00072 bool init(const Parameter& trackParam);
00073
00075 void loadImage(unsigned char* image, GLenum format=GL_BGR);
00079 virtual void image_processing(unsigned char* image, GLenum format=GL_BGR)=0;
00085 virtual void image_processing(unsigned char* image, const TomGine::tgModel &model, const TomGine::tgPose &pose, GLenum format=GL_BGR)=0;
00091 virtual void image_processing(unsigned char* image, int model_id, const TomGine::tgPose &pose, GLenum format=GL_BGR)=0;
00092
00094 virtual bool track()=0;
00097 virtual bool track(int id)=0;
00098
00100 void reset();
00103 void reset(int id);
00104
00106 void resetUnlockLock();
00107
00108
00111 int addModel(TomGine::tgModel& m, TomGine::tgPose& pose, std::string label, bool bfc=true);
00112
00119 int addModelFromFile(const char* filename, TomGine::tgPose& pose, std::string label, bool bfc=true);
00120
00122 void removeModel(int id);
00123
00124
00125
00126
00127
00129 ModelEntry* getModelEntry(int id);
00130
00132 void getModelPose(int id, TomGine::tgPose& p);
00133
00135 void getModelPoseLPF(int id, TomGine::tgPose& p);
00136
00138 void getModelPoseCamCoords(int id, TomGine::tgPose& p);
00139
00141 void getModelVelocity(int id, float &translational, float &angular);
00142
00144 void getModelMovementState(int id, movement_state &m);
00145
00147 void getModelQualityState(int id, quality_state &q);
00148
00150 void getModelConfidenceState(int id, confidence_state &q);
00151
00153 void getModelInitialPose(int id, TomGine::tgPose& p);
00154
00156 void getModelConfidence(int id, float& c);
00157
00159 void getModelConfidenceEdge(int id, float& c);
00160
00162 void getModelConfidenceColor(int id, float& c);
00163
00165 bool getModelPoint3D(int id, int x_win, int y_win, double& x3, double& y3, double& z3);
00166
00168 void getModelMask(int id, Texture &mask);
00169
00171 void getModelEdgeMask(int id, Texture &mask);
00172
00174 bool getModelMaskOwnEdges(int id);
00175
00177 void setModelInitialPose(int id, TomGine::tgPose& p);
00178
00180 void setModelPredictor(int id, Predictor* predictor);
00181
00183 void setModelLock(int id, bool lock);
00184
00186 void setModelRecursionsParticle(int id, int num_recursions, int num_particles);
00187
00189 void setModelPredictorNoConvergence(int id, float no_conv);
00190
00192 void setModelMask(int id, Texture *mask=0);
00193
00195 void setModelMaskOwnEdges(int id, bool masked);
00196
00198 void saveModel(int id, const char* pathname);
00200 void saveModels(const char* pathname);
00201
00203 void saveScreenshot(const char* filename);
00204
00206 cv::Mat getImage();
00207
00209 virtual void textureFromImage(bool force=false){}
00210 virtual void textureFromImage(int id, const TomGine::tgPose &pose, bool use_num_pixels=true){}
00211
00213 virtual void untextureModels(){}
00214
00215
00217 virtual void drawResult(float linewidth=1.0f)=0;
00218 void drawModel(TomGine::tgPose p);
00219 void drawModel(const TomGine::tgModel &m, const TomGine::tgPose &p);
00220 virtual void drawTrackerModel(int id, const TomGine::tgPose &p, float linewidth=1.0f){};
00221 void drawModelWireframe(const TomGine::tgModel &m, const TomGine::tgPose &p, float linewidth=1.0f);
00222 void drawCoordinateSystem(float linelength=0.5f, float linewidth=1.0f, TomGine::tgPose pose=TomGine::tgPose());
00223 void drawCoordinates(float linelength=1.0f);
00224 void drawImage(unsigned char* image);
00225 void drawPixel(float u, float v, vec3 color=vec3(1.0,1.0,1.0), float size=1.0f);
00226 void drawPoint(float x, float y, float z, float size=1.0);
00227 void drawCalibrationPattern(float point_size=1.0f);
00228 void loadCalibrationPattern(const char* mdl_file);
00229 void drawTest();
00230 void printStatistics();
00231
00232
00233 virtual void setKernelSize(int val){ }
00234 virtual void setEdgeShader(){ }
00235 virtual void setColorShader(){ }
00236
00237
00238 void setFrameTime(double dTime);
00239 bool setCameraParameters(TomGine::tgCamera::Parameter cam_par);
00240 void setSpreadLvl(unsigned int val){ params.m_spreadlvl = val; }
00241
00242
00243 float getCamZNear(){ return m_cam_perspective.GetZNear(); }
00244 float getCamZFar(){ return m_cam_perspective.GetZFar(); }
00245 unsigned int getSpreadLvl(){ return params.m_spreadlvl; }
00246
00247
00248 bool getLockFlag(){ return m_lock; }
00249 bool getEdgesImageFlag(){ return m_draw_edges; }
00250 bool getDrawParticlesFlag(){ return m_showparticles; }
00251 int getModelModeFlag(){ return m_showmodel; }
00252
00253
00254 void setLockFlag(bool val);
00255 void setEdgesImageFlag(bool val){ m_draw_edges = val; }
00256 void setDrawParticlesFlag(bool val){ m_showparticles = val; }
00257 void setModelModeFlag(int val){ m_showmodel = val; }
00258
00259
00260 virtual void evaluatePDF( int id,
00261 float x_min, float y_min,
00262 float x_max, float y_max,
00263 int res,
00264 const char* meshfile, const char* xfile){}
00265
00266 virtual std::vector<float> getPDFxy( Particle pose,
00267 float x_min, float y_min,
00268 float x_max, float y_max,
00269 int res,
00270 const char* filename=NULL, const char* filename2=NULL){ std::vector<float> a; return a;}
00271
00272 virtual void savePDF( std::vector<float> vPDFMap,
00273 float x_min, float y_min,
00274 float x_max, float y_max,
00275 int res,
00276 const char* meshfile, const char* xfile){}
00277
00278 const Parameter getParams(){ return params; }
00279
00280 protected:
00281 Parameter params;
00282
00283
00284 Texture* m_tex_frame;
00285 std::vector<Texture*> m_tex_frame_ip;
00286
00287 std::vector<vec3> m_calib_points;
00288
00289 TomGine::tgLighting m_lighting;
00290 ImageProcessor* m_ip;
00291
00292 float m_ftime;
00293 Timer m_timer;
00294
00295
00296 ModelEntryList m_modellist;
00297 ModelEntryList m_hypotheses;
00298
00299 TomGine::tgCamera m_cam_perspective;
00300 TomGine::tgCamera m_cam_default;
00301
00302
00303 bool m_lock;
00304 bool m_showparticles;
00305 int m_showmodel;
00306 bool m_draw_edges;
00307 bool m_tracker_initialized;
00308 bool m_drawimage;
00309
00310
00312 bool loadTrackParsFromINI(const char* inifile);
00313 bool loadCamParsFromINI(const char* camCalFile, const char* poseCalFile);
00314
00315 void getGlError();
00316
00317 void computeModelEdgeMask(ModelEntry* modelEntry, Texture &mask);
00318
00319 virtual bool initInternal()=0;
00320 bool init();
00321 bool initGL();
00322
00323 };
00324
00325 }
00326
00327 #endif