00001
00002 #include "strk_info_model_tracker_process.h"
00003 #include <vcl_fstream.h>
00004 #include <vcl_iostream.h>
00005 #include <vcl_vector.h>
00006 #include <vnl/vnl_matlab_print2.h>
00007 #include <vtol/vtol_topology_object.h>
00008 #include <vtol/vtol_vertex.h>
00009 #include <vtol/vtol_edge.h>
00010 #include <vtol/vtol_vertex_2d.h>
00011 #include <vtol/vtol_face_2d.h>
00012 #include <vil1/vil1_memory_image_of.h>
00013 #include <strk/strk_tracking_face_2d.h>
00014 #include <strk/strk_art_info_model_sptr.h>
00015 #include <strk/strk_art_info_model.h>
00016 #include <strk/strk_info_model_tracker.h>
00017
00018 strk_info_model_tracker_process::strk_info_model_tracker_process(strk_info_model_tracker_params & tp)
00019 : model_tracker_(tp)
00020 {
00021 failure_ = false;
00022 first_frame_ = true;
00023 write_tracked_models_ = false;
00024 }
00025
00026 strk_info_model_tracker_process::~strk_info_model_tracker_process()
00027 {
00028
00029 }
00030
00031 bool strk_info_model_tracker_process::execute()
00032 {
00033 if (failure_)
00034 {
00035 vcl_cout << "In strk_info_model_tracker_process::execute() - process failed\n";
00036 return false;
00037 }
00038 if (this->get_N_input_images()!=1)
00039 {
00040 vcl_cout << "In strk_info_model_tracker_process::execute() -"
00041 << " not exactly one input image\n";
00042 failure_ = true;
00043 return false;
00044 }
00045 output_topo_objs_.clear();
00046
00047 vil1_memory_image_of<unsigned char> img(vpro_video_process::get_input_image(0));
00048 input_images_.clear();
00049 if (first_frame_)
00050 {
00051 model_tracker_.set_image_0(img);
00052 if (!get_N_input_topo_objs())
00053 {
00054 vcl_cout << "In strk_info_model_tracker_process::execute() -"
00055 << " no input correlation face\n";
00056 failure_ = true;
00057 return false;
00058 }
00059 if (input_topo_objs_.size()!=3)
00060 {
00061 vcl_cout << "In strk_info_model_tracker_process::execute() -"
00062 << " input doesn't have the right number of faces\n";
00063 failure_ = true;
00064 return false;
00065 }
00066
00067 vcl_vector<vtol_face_2d_sptr> model_faces;
00068 for (vcl_vector<vtol_topology_object_sptr>::iterator toit =
00069 input_topo_objs_.begin(); toit != input_topo_objs_.end(); toit++)
00070 {
00071 vtol_topology_object_sptr to = (*toit);
00072 vtol_face_sptr f = to->cast_to_face();
00073 vtol_face_2d_sptr f2d = f->cast_to_face_2d();
00074 if (!f2d)
00075 { vcl_cout << "In strk_info_model_tracker_process::execute() -"
00076 << " input is not a vtol_face_2d\n";
00077 failure_ = true;
00078 return false;
00079 }
00080 model_faces.push_back(f2d);
00081 }
00082 start_frame_ = this->frame_index();
00083 tracked_models_.clear();
00084 model_tracker_.set_initial_model(model_faces);
00085 model_tracker_.init();
00086
00087 for (vcl_vector<vtol_face_2d_sptr>::iterator fit = model_faces.begin();
00088 fit != model_faces.end(); fit++)
00089 {
00090 vtol_face_2d_sptr f2d = (*fit);
00091 vcl_vector<vtol_edge_sptr> edges_2d;
00092 f2d->edges(edges_2d);
00093 for (vcl_vector<vtol_edge_sptr>::iterator eit = edges_2d.begin();
00094 eit != edges_2d.end(); eit++)
00095 {
00096 vtol_topology_object_sptr to = (*eit)->cast_to_edge();
00097 output_topo_objs_.push_back(to);
00098 }
00099 }
00100 first_frame_ = false;
00101 return true;
00102 }
00103
00104 model_tracker_.set_image_i(img);
00105 model_tracker_.track();
00106 output_topo_objs_.clear();
00107
00108 strk_art_info_model_sptr mod = model_tracker_.get_best_sample();
00109 tracked_models_.push_back(mod);
00110 vcl_vector<vtol_face_2d_sptr> tracked_faces = mod->vtol_faces();
00111 for (vcl_vector<vtol_face_2d_sptr>::iterator fit = tracked_faces.begin();
00112 fit != tracked_faces.end(); fit++)
00113 {
00114 vcl_vector<vtol_edge_sptr> edges;
00115 (*fit)->edges(edges);
00116 for (vcl_vector<vtol_edge_sptr>::iterator eit = edges.begin();
00117 eit != edges.end(); eit++)
00118 {
00119 vtol_topology_object_sptr to = (*eit)->cast_to_edge();
00120 output_topo_objs_.push_back(to);
00121 }
00122 }
00123 return true;
00124 }
00125
00126
00127 static void cache_face_and_cog(vtol_face_2d_sptr const& face,
00128 const int frame_index,
00129 vnl_matrix<double>& cog,
00130 vnl_matrix<double>& X,
00131 vnl_matrix<double>& Y)
00132 {
00133 if (!face)
00134 return;
00135 vcl_vector<vtol_vertex_sptr> verts;
00136 face->vertices(verts);
00137 int n_verts = verts.size();
00138 if (!n_verts)
00139 return;
00140 double cog_x =0, cog_y=0;
00141 for (int i = 0; i<n_verts; i++)
00142 {
00143 vtol_vertex_2d_sptr v = verts[i]->cast_to_vertex_2d();
00144 if (!v)
00145 continue;
00146 cog_x += v->x(); cog_y += v->y();
00147 X.put(frame_index, i, v->x());
00148 Y.put(frame_index, i, v->y());
00149 }
00150 cog_x/=n_verts; cog_y/=n_verts;
00151 cog.put(frame_index, 0, cog_x); cog.put(frame_index, 1, cog_y);
00152 }
00153
00154
00155 bool strk_info_model_tracker_process::finish()
00156 {
00157 if (write_tracked_models_)
00158 {
00159 int n_frames = tracked_models_.size();
00160 if (!n_frames)
00161 return false;
00162 vcl_vector<vtol_vertex_sptr> verts;
00163 strk_art_info_model_sptr mod = tracked_models_[0];
00164 vtol_face_2d_sptr stem = mod->face(0)->face()->cast_to_face_2d();
00165 vtol_face_2d_sptr long_arm = mod->face(1)->face()->cast_to_face_2d();
00166 vtol_face_2d_sptr short_arm = mod->face(2)->face()->cast_to_face_2d();
00167 stem->vertices(verts);
00168 int stem_n_verts = verts.size();
00169 verts.clear();
00170 long_arm->vertices(verts);
00171 int long_arm_n_verts = verts.size();
00172 verts.clear();
00173 short_arm->vertices(verts);
00174 int short_arm_n_verts = verts.size();
00175 verts.clear();
00176
00177
00178 vnl_matrix<double> cog_stem(n_frames, 2);
00179 vnl_matrix<double> cog_long_arm(n_frames, 2);
00180 vnl_matrix<double> cog_short_arm(n_frames, 2);
00181 vnl_matrix<double> stem_X(n_frames, stem_n_verts);
00182 vnl_matrix<double> stem_Y(n_frames, stem_n_verts);
00183 vnl_matrix<double> long_arm_X(n_frames, long_arm_n_verts);
00184 vnl_matrix<double> long_arm_Y(n_frames, long_arm_n_verts);
00185 vnl_matrix<double> short_arm_X(n_frames, short_arm_n_verts);
00186 vnl_matrix<double> short_arm_Y(n_frames, short_arm_n_verts);
00187 vcl_ofstream track_stream(track_file_.c_str());
00188 if (!track_stream)
00189 {
00190 vcl_cout << "In strk_info_tracker_process::finish() -"
00191 << " could not open file " << track_file_ << "\n";
00192 return false;
00193 }
00194 track_stream << "START_FRAME: " << start_frame_ << "\n"
00195 << "N_FRAMES: " << n_frames << "\n";
00196 for (int i = 0; i<n_frames; i++)
00197 {
00198 mod = tracked_models_[i];
00199
00200 stem = mod->face(0)->face()->cast_to_face_2d();
00201 cache_face_and_cog(stem, i, cog_stem, stem_X, stem_Y);
00202
00203 long_arm = mod->face(1)->face()->cast_to_face_2d();
00204 cache_face_and_cog(long_arm,i, cog_long_arm, long_arm_X, long_arm_Y);
00205
00206 short_arm = mod->face(2)->face()->cast_to_face_2d();
00207 cache_face_and_cog(short_arm, i, cog_short_arm,
00208 short_arm_X, short_arm_Y);
00209 }
00210
00211 track_stream << "STEM:\n"
00212 << "N_VERTS: " << stem_n_verts << "\n"
00213 << "COG:\n";
00214 vnl_matlab_print(track_stream, cog_stem);
00215 track_stream << "X:\n";
00216 vnl_matlab_print(track_stream, stem_X);
00217 track_stream << "Y:\n";
00218 vnl_matlab_print(track_stream, stem_Y);
00219
00220 track_stream << "LONG_ARM:\n"
00221 << "N_VERTS: " << long_arm_n_verts << "\n"
00222 << "COG:\n";
00223 vnl_matlab_print(track_stream, cog_long_arm);
00224 track_stream << "X:\n";
00225 vnl_matlab_print(track_stream, long_arm_X);
00226 track_stream << "Y:\n";
00227 vnl_matlab_print(track_stream, long_arm_Y);
00228
00229 track_stream << "SHORT_ARM:\n"
00230 << "N_VERTS: " << short_arm_n_verts << "\n"
00231 << "COG:\n";
00232 vnl_matlab_print(track_stream, cog_short_arm);
00233 track_stream << "X:\n";
00234 vnl_matlab_print(track_stream, short_arm_X);
00235 track_stream << "Y:\n";
00236 vnl_matlab_print(track_stream, short_arm_Y);
00237
00238 track_stream.close();
00239 }
00240 return true;
00241 }
00242
00243 bool strk_info_model_tracker_process::set_output_file(vcl_string const& file_name)
00244 {
00245 write_tracked_models_ = true;
00246 track_file_ = file_name;
00247 vcl_ofstream track_stream(track_file_.c_str());
00248 if (!track_stream)
00249 {
00250 vcl_cout << "In strk_info_tracker_process::set_output_file() -"
00251 << " could not open file " << track_file_ << "\n";
00252 return false;
00253 }
00254 track_stream.close();
00255 return true;
00256 }
00257