PedestrainCounting
EstimatedGaussianDistribution.h
1 
5 #ifndef ESTIMATED_GAUSSIAN_HEADER
6 #define ESTIMATED_GAUSSIAN_HEADER
7 
8 #include "GlobalHeader.h"
9 
10 template<int N> class EstimatedGaussianDistribution {
11 public:
12  EstimatedGaussianDistribution(float pm = 1000.0f, float ps = 1000.0f, float rm = 0.01f, float rs = 0.01f);
13 
15 
19  inline void Reset(float pm = 1000.0f, float ps = 1000.0f, float rm = 0.01f, float rs = 0.01f) {
20  pMean = pm;
21  pSigma = ps;
22  rMean = rm;
23  rSigma = rs;
24  for (int i = 0; i < N; i++) {
25  mean[i] = 0.0f;
26  sigma[i] = 1.0f;
27  }
28  }
29 
33  void Update(const float *value);
34 
35  void SetValues(const float *m, const float *s);
36 
37  float mean[N], sigma[N];
38  float pMean, pSigma;
39  float rMean, rSigma;
40 
41 };
42 
44  float pm, float ps, float rm, float rs) {
45  Reset(pm, ps, rm, rs);
46 }
47 
49 
50 }
51 
52 template<int N> void EstimatedGaussianDistribution<N>::Update(const float *value) {
53  // Use Kalman filter to update the Gaussian distribution.
54  // K: Kalman gain.
55  float K;
56  float minFactor = 0.001f;
57 
58  // Update the mean.
59  K = pMean / (pMean + rMean);
60  if (K < minFactor)
61  K = minFactor;
62 
63  for (int i = 0; i < N; i++) {
64  mean[i] += K * (value[i] - mean[i]);
65  }
66  pMean = pMean * rMean / (pMean + rMean);
67 
68  // Update the sigma.
69  K = pSigma / (pSigma + rSigma);
70  if (K < minFactor)
71  K = minFactor;
72 
73  for (int i = 0; i < N; i++) {
74  float sigma2 = K * (mean[i] - value[i]) * (mean[i] - value[i]) +
75  (1.0f - K) * sigma[i] * sigma[i];
76  sigma[i] = sqrtf(sigma2);
77  if (sigma[i] < 1.0f)
78  sigma[i] = 1.0f;
79  }
80 
81  pSigma = pSigma * rSigma / (pSigma + rSigma);
82 }
83 
84 template<int N> void EstimatedGaussianDistribution<N>::SetValues(const float *m, const float *s) {
85  memcpy(mean, m, sizeof(float) * N);
86  memcpy(sigma, s, sizeof(float) * N);
87 }
88 
89 #endif
Definition: EstimatedGaussianDistribution.h:10
void Update(const float *value)
Definition: EstimatedGaussianDistribution.h:52
void Reset(float pm=1000.0f, float ps=1000.0f, float rm=0.01f, float rs=0.01f)
Definition: EstimatedGaussianDistribution.h:19