contrib/brl/bseg/strk/strk_corr_tracker_process.cxx
Go to the documentation of this file.
00001 // This is brl/bseg/strk/strk_corr_tracker_process.cxx
00002 #include "strk_corr_tracker_process.h"
00003 //:
00004 // \file
00005 #include <vcl_iostream.h>
00006 #include <vtol/vtol_topology_object.h>
00007 #include <vtol/vtol_edge.h>
00008 #include <vtol/vtol_face_2d.h>
00009 #include <vil1/vil1_memory_image_of.h>
00010 #include "strk_tracker.h"
00011 
00012 strk_corr_tracker_process::strk_corr_tracker_process(strk_tracker_params & tp)
00013  : tracker_(tp)
00014 {
00015   failure_ = false;
00016   first_frame_ = true;
00017 }
00018 
00019 strk_corr_tracker_process::~strk_corr_tracker_process()
00020 {
00021   tracker_.clear();
00022 }
00023 
00024 
00025 bool strk_corr_tracker_process::execute()
00026 {
00027   if (failure_)
00028   {
00029     vcl_cout << "In strk_corr_tracker_process::execute() - process failed\n";
00030     return false;
00031   }
00032   if (this->get_N_input_images()!=1)
00033   {
00034     vcl_cout << "In strk_corr_tracker_process::execute() -"
00035              << " not exactly one input image\n";
00036     failure_ = true;
00037     return false;
00038   }
00039   output_topo_objs_.clear();
00040   //assume the input images are grey scale (should really check)
00041   vil1_memory_image_of<unsigned char> img(vpro_video_process::get_input_image(0));
00042   input_images_.clear();
00043 
00044   if (first_frame_)
00045   {
00046     tracker_.set_image_0(img);
00047     if (!get_N_input_topo_objs())
00048     {
00049       vcl_cout << "In strk_corr_tracker_process::execute() -"
00050                << " no input correlation face\n";
00051       failure_ = true;
00052       return false;
00053     }
00054     vtol_topology_object_sptr to = input_topo_objs_[0];
00055     vtol_face_sptr f = to->cast_to_face();
00056     vtol_face_2d_sptr f2d = f->cast_to_face_2d();
00057     if (!f2d)
00058     {
00059       vcl_cout << "In strk_corr_tracker_process::execute() -"
00060                << " input is not a vtol_face_2d\n";
00061       failure_ = true;
00062       return false;
00063     }
00064     tracker_.set_initial_model(f2d);
00065     tracker_.init();
00066     vcl_vector<vtol_edge_sptr> edges_2d;
00067     f2d->edges(edges_2d);
00068     for (vcl_vector<vtol_edge_sptr>::iterator eit = edges_2d.begin();
00069          eit != edges_2d.end(); eit++)
00070     {
00071       vtol_topology_object_sptr to = (*eit)->cast_to_edge();
00072       output_topo_objs_.push_back(to);
00073     }
00074     first_frame_ = false;
00075     return true;
00076   }
00077 
00078   tracker_.set_image_i(img);
00079   tracker_.track();
00080   vtol_face_2d_sptr f = tracker_.get_best_sample();
00081   vcl_vector<vtol_edge_sptr> edges;
00082   f->edges(edges);
00083   for (vcl_vector<vtol_edge_sptr>::iterator eit = edges.begin();
00084        eit != edges.end(); eit++)
00085   {
00086     vtol_topology_object_sptr to = (*eit)->cast_to_edge();
00087     output_topo_objs_.push_back(to);
00088   }
00089   return true;
00090 }