00001
00002 #ifndef strk_tracking_face_2d_h_
00003 #define strk_tracking_face_2d_h_
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
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
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
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
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
00092 void set_renyi_joint_entropy() { renyi_joint_entropy_=true; }
00093 void unset_renyi_joint_entropy() { renyi_joint_entropy_=false; }
00094
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
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
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
00140 void centroid(double& x, double& y) const;
00141
00142
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
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
00160
00161
00162 vcl_vector<float> random_intensities(int& n_pix);
00163
00164
00165 bool random_colors(int& n_pix,
00166 vcl_vector<float>& hue, vcl_vector<float>& sat);
00167
00168
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
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
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
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
00266 void transform_gradients(double theta);
00267
00268
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_