00001
00002 #ifndef GAUSSIAN_H
00003 #define GAUSSIAN_H
00004
00005 #include <iostream>
00006 #include <string>
00007 #include "covariance.h"
00008 #include "ObjectParser.h"
00009 #include "misc.h"
00010 #include "Vector.h"
00011 #include "covariance_set.h"
00012 #include "mean.h"
00013 #include "mean_set.h"
00014
00015
00016 namespace FD {
00017
00018 class GMM;
00019
00021 class Gaussian : public Object
00022 {
00023 protected:
00025 RCPtr<Mean> mean;
00026
00027
00029 RCPtr<Covariance> covariance;
00030
00032 int accum_count;
00033
00035 int dimension;
00036
00038 bool using_meanID;
00039
00041 bool using_covarianceID;
00042
00044 int meanID;
00045
00047 int covarianceID;
00048
00049 public:
00051 Gaussian()
00052 : dimension(0)
00053 , using_meanID(false)
00054 , using_covarianceID(false)
00055 {}
00056
00057 Gaussian(std::istream &in) {in >> *this;}
00058
00061 Gaussian(int dim, Covariance *(*cov_new)(int))
00062 : mean(new Mean (dim,0.0))
00063
00064 , covariance(cov_new (dim))
00065 , accum_count(0)
00066 , dimension(dim)
00067 , using_meanID(false)
00068 , using_covarianceID(false)
00069 {}
00070
00071 Gaussian(int dim, int _meanID, int _covarianceID)
00072 : accum_count(0)
00073 , dimension(dim)
00074 , using_meanID(true)
00075 , using_covarianceID(true)
00076 , meanID(_meanID)
00077 , covarianceID(_covarianceID)
00078 {}
00079
00081 Gaussian(const Gaussian &g)
00082 : mean(new Mean (*g.mean))
00083
00084 , covariance(g.covariance->copy())
00085 , accum_count (g.accum_count)
00086 , dimension (g.dimension)
00087 , using_meanID(false)
00088 , using_covarianceID(false)
00089 {}
00090
00092 ~Gaussian();
00093
00095 int getDimension() const { return dimension; }
00096
00098 Mean &getMean() const { return *mean; }
00099
00101 Covariance &getCovariance() const { return *covariance; }
00102
00104 void to_real();
00105
00107 int get_accum_count() const {return accum_count;}
00108
00110 double mahalanobis(const float * fr) const
00111 {
00112 return covariance->mahalanobisDistance(fr,&(*mean)[0]);
00113 }
00114
00116 double mahalanobis(const float * fr, Covariance *cov) const
00117 {
00118 return cov->mahalanobisDistance(fr,&(*mean)[0]);
00119 }
00120
00122 double euclidian(const float * fr) const
00123 {
00124 double dist=0;
00125 for (unsigned int i=0;i<dimension;i++)
00126 {
00127 dist+=FD::sqr<double>(fr[i]-(*mean)[i]);
00128 }
00129
00130 return dist;
00131 }
00132
00134 void accum_frame(const float * fr)
00135 {
00136 mean->accumFrame(fr);
00137 covariance->accumFrame(fr);
00138 accum_count++;
00139 }
00140
00142 void reset_to_accum_mode()
00143 {
00144 accum_count=0;
00145 covariance->reset();
00146 mean->resetToAccum();
00147 }
00148
00149 void toIDsUsing (MeanSet &means, CovarianceSet & covariances);
00150
00151 void toPtrsUsing (const MeanSet &means, const CovarianceSet & covariances);
00152
00154 void printOn(std::ostream &out = std::cout) const;
00155
00157 void readFrom (std::istream &in=std::cin);
00158
00159 friend std::istream &operator >> (std::istream &in, Gaussian &gauss);
00160 friend class GMM;
00161 };
00162
00163 std::istream &operator >> (std::istream &in, Gaussian &gauss);
00164
00165 }
00166 #endif