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

strk_tracking_face_2d.h

Go to the documentation of this file.
00001 // This is brl/bseg/strk/strk_tracking_face_2d.h
00002 #ifndef strk_tracking_face_2d_h_
00003 #define strk_tracking_face_2d_h_
00004 //:
00005 // \file
00006 // \brief a face for tracking with mutual information
00007 //
00008 // \verbatim
00009 // The shape and intensity data for this class are maintained by the
00010 // vtol_intensity_face member.  Additional gradient information is maintained
00011 // in order to support the formation of a gradient direction histogram.
00012 // Local histogram structs are defined to collect the intensity and gradient
00013 // statistics of the face.
00014 //
00015 // \author
00016 //    Joseph L. Mundy - October 29, 2003
00017 //    Brown University
00018 //
00019 // \verbatim
00020 //  Modifications
00021 //   10-sep-2004 Peter Vanroose Added copy ctor with explicit vbl_ref_count init
00022 //   15-june-2005 Ozge Can Ozcanli Added methods to calculate mutual information
00023 //                                 with known pixel correspondences of two faces
00024 //   13-july-2005 Ozge Can Ozcanli Added max_intensity_ variable to support images
00025 //                                 with larger range than 8 bits
00026 // \endverbatim
00027 //
00028 //-----------------------------------------------------------------------------
00029 #include <vbl/vbl_ref_count.h>
00030 #include <vnl/vnl_matrix_fixed.h>
00031 #include <vil1/vil1_memory_image_of.h>
00032 #include <vtol/vtol_intensity_face.h>
00033 #include <bsta/bsta_histogram.h>
00034 #include <vgl/vgl_point_2d.h>
00035 
00036 #include "strk_tracking_face_2d_sptr.h"
00037 
00038 //
00039 //========================TRACKING_FACE_2D==================================
00040 //
00041 class strk_tracking_face_2d : public vbl_ref_count
00042 {
00043  public:
00044   strk_tracking_face_2d(vtol_face_2d_sptr const& face,
00045                         vil1_memory_image_of<float> const& image,
00046                         vil1_memory_image_of<float> const& Ix,
00047                         vil1_memory_image_of<float> const& Iy,
00048                         vil1_memory_image_of<float> const& hue,
00049                         vil1_memory_image_of<float> const& sat,
00050                         const float min_gradient,
00051                         const float parzen_sigma,
00052                         const unsigned int intensity_hist_bins,
00053                         const unsigned int gradient_dir_hist_bins,
00054                         const unsigned int color_hist_bins,
00055                         const float max_intensity = 255.0f
00056                         );
00057 
00058   strk_tracking_face_2d(vtol_intensity_face_sptr const& intf,
00059                         const unsigned int intensity_hist_bins,
00060                         const unsigned int gradient_dir_hist_bins,
00061                         const unsigned int color_hist_bins,
00062                         const float max_intensity = 255.0f
00063                         );
00064   strk_tracking_face_2d(strk_tracking_face_2d_sptr const& tf);
00065   strk_tracking_face_2d(strk_tracking_face_2d const& tf);
00066   ~strk_tracking_face_2d();
00067   //:accessors
00068   vtol_intensity_face_sptr face() const { return intf_; }
00069   bool gradient_needed() const { return gradient_info_; }
00070   bool color_needed() const { return color_info_; }
00071   float Ix(int i) const { return Ix_[i]; }
00072   float Iy(int i) const { return Iy_[i]; }
00073   float hue(int i) const { return hue_[i]; }
00074   float sat(int i) const { return sat_[i]; }
00075   float int_mutual_info() const { return intensity_mi_; }
00076   float grad_mutual_info() const { return gradient_dir_mi_; }
00077   float color_mutual_info() const { return color_mi_; }
00078   float total_info() const { return total_info_; }
00079   vnl_matrix_fixed<double, 3, 3>& trans() { return trans_; }
00080   //:mutators
00081   void set_min_gradient(float min_gradient) { min_gradient_=min_gradient; }
00082   void set_parzen_sigma(float parzen_sigma) { parzen_sigma_=parzen_sigma; }
00083   void set_Ix(int i, float Ix) { Ix_[i] = Ix; }
00084   void set_Iy(int i, float Iy) { Iy_[i] = Iy; }
00085   void set_hue(int i, float Ix) { hue_[i] = Ix; }
00086   void set_sat(int i, float Iy) { sat_[i] = Iy; }
00087   void set_int_mutual_info(float mi);
00088   void set_grad_mutual_info(float mi);
00089   void set_color_mutual_info(float mi);
00090   void set_max_intensity(float max_intensity) { max_intensity_=max_intensity; }
00091   //:controls
00092   void set_renyi_joint_entropy() { renyi_joint_entropy_=true; }
00093   void unset_renyi_joint_entropy() { renyi_joint_entropy_=false; }
00094   //:histogram properties
00095   void set_intensity_hist_bins(const unsigned int n_bins)
00096     {intensity_hist_bins_=n_bins;}
00097   void set_gradient_dir_bins(const unsigned int n_bins)
00098     {gradient_dir_hist_bins_ = n_bins;}
00099   void set_color_dir_bins(const unsigned int n_bins)
00100     {color_hist_bins_ = n_bins;}
00101   unsigned int intensity_hist_bins() const { return intensity_hist_bins_;}
00102   unsigned int gradient_dir_hist_bins() const {return gradient_dir_hist_bins_;}
00103   unsigned int color_hist_bins() const { return color_hist_bins_; }
00104 
00105   //: internal entropies for debugging purposes
00106   float model_intensity_entropy() const { return model_intensity_entropy_; }
00107   float intensity_entropy() const { return intensity_entropy_; }
00108   float intensity_joint_entropy() const { return intensity_joint_entropy_; }
00109 
00110   float model_gradient_entropy() const { return model_gradient_dir_entropy_; }
00111   float gradient_entropy() const { return gradient_dir_entropy_; }
00112   float gradient_joint_entropy() const { return gradient_joint_entropy_; }
00113 
00114   float model_color_entropy() const { return model_color_entropy_; }
00115   float color_entropy() const { return color_entropy_; }
00116   float color_joint_entropy() const { return color_joint_entropy_; }
00117 
00118   float intensity_info_diff() const { return intensity_info_diff_; }
00119   float color_info_diff() const { return color_info_diff_; }
00120   float total_info_diff();
00121   //     -----------   utilities   ----------------
00122   bool compute_mutual_information(vil1_memory_image_of<float> const& image,
00123                                   vil1_memory_image_of<float> const& Ix,
00124                                   vil1_memory_image_of<float> const& Iy,
00125                                   vil1_memory_image_of<float> const& hue,
00126                                   vil1_memory_image_of<float> const& sat);
00127 
00128   bool compute_mutual_information(vcl_vector <vcl_vector< vgl_point_2d<int> > > region_map,
00129                                   int base_x, int base_y,
00130                                   vil1_memory_image_of<float> const& image,
00131                                   vil1_memory_image_of<float> const& Ix,
00132                                   vil1_memory_image_of<float> const& Iy,
00133                                   vil1_memory_image_of<float> const& hue,
00134                                   vil1_memory_image_of<float> const& sat);
00135 
00136   bool compute_only_gradient_mi(vil1_memory_image_of<float> const& Ix,
00137                                 vil1_memory_image_of<float> const& Iy);
00138 
00139   //: from the face vertices
00140   void centroid(double& x, double& y) const;
00141 
00142   //: copy of intf interface
00143   void reset() const { intf_->reset(); }
00144   bool next() const { return intf_->next(); }
00145   float Xo() const { return intf_->Xo(); }
00146   float Yo() const { return intf_->Yo(); }
00147   void set_X(float x) { intf_->set_X(x); }
00148   void set_Y(float y) { intf_->set_Y(y); }
00149   int Npix()const { return intf_->Npix(); }
00150   float X() const { return intf_->X(); }
00151   float Y() const { return intf_->Y(); }
00152   unsigned short I() const { return intf_->I(); }
00153 
00154   //: transformation: translate by (tx,ty), rotate by theta, zoom by scale
00155   void transform(double tx, double ty, double theta, double scale);
00156 
00157   void transform(vnl_matrix_fixed<double,3,3> const& T);
00158 
00159   //: utilities involving another tracking face (background)
00160 
00161   //: select a random set of intensities from the interior
00162   vcl_vector<float> random_intensities(int& n_pix);
00163 
00164   //: select a random set of colors from the interior
00165   bool random_colors(int& n_pix,
00166                      vcl_vector<float>& hue, vcl_vector<float>& sat);
00167 
00168   //:an alternative model for explaining current intensity values inside *this
00169   float intensity_mutual_info_diff(strk_tracking_face_2d_sptr const& other,
00170                                    vil1_memory_image_of<float> const& image,
00171                                    bool verbose = false);
00172 
00173 
00174   float color_mutual_info_diff(strk_tracking_face_2d_sptr const& other,
00175                                vil1_memory_image_of<float> const& hue,
00176                                vil1_memory_image_of<float> const& sat,
00177                                bool verbose = false);
00178 
00179   //: a background model consisting of cloned faces surrounding *this face.
00180   float intensity_mutual_info_diff(vcl_vector<strk_tracking_face_2d_sptr> const& others,
00181                                    vil1_memory_image_of<float> const& image,
00182                                    bool verbose = false);
00183 
00184   float color_mutual_info_diff(vcl_vector<strk_tracking_face_2d_sptr> const& others,
00185                                vil1_memory_image_of<float> const& hue,
00186                                vil1_memory_image_of<float> const& sat,
00187                                bool verbose = false);
00188 
00189 
00190   //: for debugging
00191   void print_pixels(vil1_memory_image_of<float> const& image);
00192 
00193   void face_points(vcl_vector<vtol_topology_object_sptr>& points);
00194 
00195   void print_intensity_histograms(vil1_memory_image_of<float> const& image);
00196   void print_gradient_histograms(vil1_memory_image_of<float> const& Ix,
00197                                   vil1_memory_image_of<float> const& Iy);
00198   void print_color_histograms(vil1_memory_image_of<float> const& hue,
00199                               vil1_memory_image_of<float> const& sat);
00200   bsta_histogram<float>
00201     intensity_histogram(vil1_memory_image_of<float> const& image);
00202   bsta_histogram<float>
00203     gradient_histogram(vil1_memory_image_of<float> const& Ix,
00204                        vil1_memory_image_of<float> const& Iy);
00205   bsta_histogram<float>
00206     color_histogram(vil1_memory_image_of<float> const& hue,
00207                     vil1_memory_image_of<float> const& sat);
00208 
00209  private:
00210   // local functions
00211   void init_bins();
00212 
00213   void set_gradient(vil1_memory_image_of<float> const& Ix,
00214                     vil1_memory_image_of<float> const& Iy);
00215   void set_color(vil1_memory_image_of<float> const& hue,
00216                  vil1_memory_image_of<float> const& sat);
00217 
00218   void init_intensity_info(vtol_face_2d_sptr const& face,
00219                            vil1_memory_image_of<float> const& image);
00220 
00221   void init_gradient_info(vil1_memory_image_of<float> const& Ix,
00222                           vil1_memory_image_of<float> const& Iy);
00223 
00224   void init_color_info(vil1_memory_image_of<float> const& hue,
00225                        vil1_memory_image_of<float> const& sat);
00226 
00227   float
00228     compute_intensity_mutual_information(vil1_memory_image_of<float> const& image);
00229 
00230   float
00231     compute_intensity_mutual_information(vcl_vector <vcl_vector< vgl_point_2d<int> > > region_map,
00232                                          int base_x, int base_y,
00233                                          vil1_memory_image_of<float> const& image);
00234 
00235   float
00236     compute_gradient_mutual_information(vil1_memory_image_of<float> const& Ix,
00237                                         vil1_memory_image_of<float> const& Iy);
00238 
00239   float
00240     compute_gradient_mutual_information(vcl_vector <vcl_vector< vgl_point_2d<int> > > region_map,
00241                                         int base_x, int base_y,
00242                                         vil1_memory_image_of<float> const& Ix,
00243                                         vil1_memory_image_of<float> const& Iy);
00244 
00245   float
00246     compute_color_mutual_information(vil1_memory_image_of<float> const& hue,
00247                                      vil1_memory_image_of<float> const& sat);
00248 
00249   float
00250     compute_color_mutual_information(vcl_vector <vcl_vector< vgl_point_2d<int> > > region_map,
00251                                      int base_x, int base_y,
00252                                      vil1_memory_image_of<float> const& hue,
00253                                      vil1_memory_image_of<float> const& sat);
00254 
00255   float
00256     compute_intensity_joint_entropy(strk_tracking_face_2d_sptr const& other,
00257                                     vil1_memory_image_of<float> const& image);
00258 float
00259   compute_model_intensity_joint_entropy(strk_tracking_face_2d_sptr const& other);
00260 
00261  float compute_color_joint_entropy(strk_tracking_face_2d_sptr const& other,
00262                                     vil1_memory_image_of<float> const& hue,
00263                                     vil1_memory_image_of<float> const& sat);
00264 
00265   //: helper function for transform(): transformation: rotate gradients by theta
00266   void transform_gradients(double theta);
00267 
00268   // members
00269   float min_gradient_;
00270   float parzen_sigma_;
00271   vtol_intensity_face_sptr intf_;
00272   bool gradient_info_;
00273   bool color_info_;
00274   bool renyi_joint_entropy_;
00275   float intensity_mi_;
00276   float gradient_dir_mi_;
00277   float color_mi_;
00278   float total_info_;
00279   float* Ix_;
00280   float* Iy_;
00281   float* hue_;
00282   float* sat_;
00283   unsigned int intensity_hist_bins_;
00284   unsigned int gradient_dir_hist_bins_;
00285   unsigned int color_hist_bins_;
00286   float model_intensity_entropy_;
00287   float model_gradient_dir_entropy_;
00288   float model_color_entropy_;
00289   float intensity_entropy_;
00290   float gradient_dir_entropy_;
00291   float color_entropy_;
00292   float intensity_joint_entropy_;
00293   float model_intensity_joint_entropy_;
00294   float gradient_joint_entropy_;
00295   float color_joint_entropy_;
00296   float intensity_info_diff_;
00297   float color_info_diff_;
00298   vnl_matrix_fixed<double, 3, 3> trans_;
00299   float max_intensity_;
00300 };
00301 
00302 #endif // strk_tracking_face_2d_h_

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