00001 #ifndef __TRACKING_H__
00002 #define __TRACKING_H__
00003 #include <boost/accumulators/accumulators.hpp>
00004 #include <boost/accumulators/statistics.hpp>
00005 #include <boost/accumulators/statistics/median.hpp>
00006 #include <boost/accumulators/statistics/p_square_quantile.hpp>
00007
00008 #include <iostream>
00009
00010 #include <boost/msm/back/state_machine.hpp>
00011
00012 #include <boost/msm/front/state_machine_def.hpp>
00013 #include <boost/array.hpp>
00014 #include <visp/vpImage.h>
00015
00016
00017 #include <visp/vpImage.h>
00018 #include <visp/vpRGBa.h>
00019 #include <visp/vpHomogeneousMatrix.h>
00020 #include <visp/vpCameraParameters.h>
00021
00022 #include <visp/vpDisplay.h>
00023 #include <visp/vpHinkley.h>
00024 #include <visp/vpMe.h>
00025 #include <vector>
00026 #include <fstream>
00027
00028 #include "visp_tracker/MovingEdgeSites.h"
00029 #include "visp_tracker/KltPoints.h"
00030
00031 #include "cmd_line/cmd_line.h"
00032 #if VISP_VERSION_INT < VP_VERSION_INT(2,10,0)
00033 #include "detectors/detector_base.h"
00034 #else
00035 # include <visp/vpDetectorBase.h>
00036 #endif
00037
00038 #include <visp/vpMbEdgeTracker.h>
00039 #include "states.hpp"
00040 #include "events.h"
00041
00042 using namespace boost::accumulators;
00043 namespace msm = boost::msm;
00044 namespace mpl = boost::mpl;
00045 namespace tracking{
00046
00047 class Tracker_ : public msm::front::state_machine_def<Tracker_>{
00048 public:
00049 typedef struct {
00050 boost::accumulators::accumulator_set<
00051 double,
00052 boost::accumulators::stats<
00053 boost::accumulators::tag::median(boost::accumulators::with_p_square_quantile),
00054 boost::accumulators::tag::max,
00055 boost::accumulators::tag::mean
00056 >
00057 > var,var_x,var_y,var_z,var_wx,var_wy,var_wz,checkpoints;
00058
00059 } statistics_t;
00060 private:
00061 CmdLine cmd;
00062 int iter_;
00063 vpImagePoint flashcode_center_;
00064 std::ofstream varfile_;
00065 #if VISP_VERSION_INT < VP_VERSION_INT(2,10,0)
00066 detectors::DetectorBase* detector_;
00067 #else
00068 vpDetectorBase *detector_;
00069 #endif
00070 typedef boost::array<vpHinkley,6> hinkley_array_t;
00071 hinkley_array_t hink_;
00072
00073 vpMbTracker* tracker_;
00074 vpMe tracker_me_config_;
00075 vpImage<vpRGBa> *I_;
00076 vpImage<vpRGBa> *_I;
00077 vpHomogeneousMatrix cMo_;
00078 vpMatrix covariance_;
00079 vpCameraParameters cam_;
00080 vpImage<unsigned char> Igray_;
00081
00082 std::vector<vpPoint> outer_points_3D_bcp_;
00083 std::vector<vpPoint> points3D_inner_;
00084 std::vector<vpPoint> points3D_outer_;
00085 std::vector<vpPoint> points3D_middle_;
00086 std::vector<vpPoint> f_;
00087 vpRect vpTrackingBox_;
00088 cv::Rect cvTrackingBox_;
00089 bool cvTrackingBox_init_;
00090
00091 statistics_t statistics;
00092 bool flush_display_;
00093
00094 public:
00095
00096 void set_flush_display(bool val);
00097 bool get_flush_display();
00098 #if VISP_VERSION_INT < VP_VERSION_INT(2,10,0)
00099 detectors::DetectorBase& get_detector();
00100 #else
00101 vpDetectorBase& get_detector();
00102 #endif
00103 vpMbTracker& get_mbt();
00104 std::vector<vpPoint>& get_points3D_inner();
00105 std::vector<vpPoint>& get_points3D_outer();
00106 std::vector<vpPoint>& get_points3D_middle();
00107 std::vector<vpPoint>& get_flashcode();
00108
00109
00110 template<class T>
00111 const T& get_tracking_box();
00112
00113 vpImage<vpRGBa>& get_I();
00114
00115 vpCameraParameters& get_cam();
00116
00117 CmdLine& get_cmd();
00118
00119
00120
00121 #if VISP_VERSION_INT < VP_VERSION_INT(2,10,0)
00122 Tracker_(CmdLine& cmd, detectors::DetectorBase* detector,vpMbTracker* tracker_,bool flush_display = true);
00123 #else
00124 Tracker_(CmdLine& cmd, vpDetectorBase* detector,vpMbTracker* tracker_,bool flush_display = true);
00125 #endif
00126 typedef WaitingForInput initial_state;
00127
00128
00129 bool input_selected(input_ready const& evt);
00130 bool no_input_selected(input_ready const& evt);
00131 bool flashcode_detected(input_ready const& evt);
00132 bool flashcode_redetected(input_ready const& evt);
00133 bool model_detected(msm::front::none const&);
00134 bool mbt_success(input_ready const& evt);
00135
00136
00137 void find_flashcode_pos(input_ready const& evt);
00138 void track_model(input_ready const& evt);
00139
00140
00141 statistics_t& get_statistics();
00142
00143 void updateMovingEdgeSites(visp_tracker::MovingEdgeSitesPtr sites);
00144 void updateKltPoints(visp_tracker::KltPointsPtr klt);
00145
00146
00147 struct transition_table : mpl::vector<
00148
00149
00150 g_row< WaitingForInput , input_ready , WaitingForInput , &Tracker_::no_input_selected >,
00151
00152 g_row< WaitingForInput , input_ready , DetectFlashcode , &Tracker_::input_selected >,
00153
00154 _row< WaitingForInput , select_input , DetectFlashcode >,
00155
00156 _row< DetectFlashcode , input_ready , DetectFlashcode >,
00157
00158 row< DetectFlashcode , input_ready , DetectModel , &Tracker_::find_flashcode_pos,&Tracker_::flashcode_detected >,
00159
00160 _row< DetectModel , msm::front::none , DetectFlashcode >,
00161
00162 g_row< DetectModel , msm::front::none , TrackModel , &Tracker_::model_detected >,
00163
00164 _row< TrackModel , input_ready , ReDetectFlashcode >,
00165
00166 row< TrackModel , input_ready , TrackModel , &Tracker_::track_model ,&Tracker_::mbt_success >,
00167
00168 _row< ReDetectFlashcode, input_ready , DetectFlashcode >,
00169
00170 row< ReDetectFlashcode, input_ready , DetectModel , &Tracker_::find_flashcode_pos,&Tracker_::flashcode_redetected >,
00171
00172
00173
00174 _row< TrackModel , finished , Finished >,
00175
00176 _row< DetectModel , finished , Finished >,
00177
00178 _row< DetectFlashcode , finished , Finished >,
00179
00180 _row< ReDetectFlashcode, finished , Finished >
00181
00182 > {};
00183
00184 };
00185
00186 typedef msm::back::state_machine<Tracker_> Tracker;
00187
00188
00189 }
00190 #endif //__TRACKING_H__