Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members

strk_info_model_tracker_process.cxx

Go to the documentation of this file.
00001 // This is brl/bseg/strk/strk_info_model_tracker_process.cxx
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   //  model_tracker_.clear();
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   //assume the input images are grey scale (should really check)
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     //set the initial model
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     //output the model for display
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   //the regular loop
00104   model_tracker_.set_image_i(img);
00105   model_tracker_.track();
00106   output_topo_objs_.clear();
00107   //display the result
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 //get the matrix elements for the current frame of the cog and face verts
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 // write out the tracked model for later display
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     //The matrices for cogs and vertices
00177     //will be printed using matlab printing format
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 

Generated on Thu Jan 10 14:53:19 2008 for contrib/brl/bseg/strk by  doxygen 1.4.4