PedestrainCounting
ParticleFilter.h
1 
12 #ifndef PARTICLEFILTER_HEADER
13 #define PARTICLEFILTER_HEADER
14 
15 #include "StrongClassifier.h"
16 #include "IntegralImage.h"
17 #include "MatchMatrix.h"
18 
20 public:
21 
26  ParticleFilter(int n = 100, int szParticle = 2);
27 
28  ~ParticleFilter();
29 
33  void InitBuffer();
34 
38  void InitTarget(const Rect &target);
39 
45  void Propagate(const Size &imgSize);
46 
50  void Observe(const StrongClassifier *classifier, const IntegralImage *intImage);
51 
55  void Observe(const StrongClassifier *classifier, const IntegralImage *intImage,
56  const Rect &detection, float detectionWeight);
57 
61  void ResampleWithBest();
62 
67 
68 
69  // Draw the particles.
70  void DrawParticles(cv::Mat &img, const cv::Scalar &color) const;
71  void DrawParticlesWithConfidence(cv::Mat &img, const cv::Scalar &color) const;
72 
73  // Draw the target;
74  void DrawTarget(cv::Mat &img, const cv::Scalar &color) const;
75 
76  inline const Rect &GetTarget() const {
77  return target;
78  }
79 
80  inline void SetTarget(const Rect &t) {
81  prevDets.push_back(t);
82  if (prevDets.size() == 5) {
83  prevDets.pop_front();
84  }
85 
86  // Set the target size as the average of last four detections.
87  int width = 0, height = 0;
88  for (const auto &det : prevDets) {
89  width += det.width;
90  height += det.height;
91  }
92 
93  target.width = width / prevDets.size();
94  target.height = height / prevDets.size();
95  }
96 
97 protected:
98 
99  // The sizeof particles. Here it should be 2. Its structure like:
100  // struct Particle {
101  // int upper;
102  // int left;
103  // }
104  const int numParticles;
105  int *particles;
106  const int sizeParticle;
107 
108  float *confidence;
109 
110  Rect target;
111 
112  std::deque<Rect> prevDets;
113 
114  // Seed.
115  std::default_random_engine generator;
116 
117  // Gaussian random generator.
118  std::normal_distribution<float> gaussian;
119 
120  // Uniform random generator.
121  std::uniform_real_distribution<float> resampler;
122 
123  // A buffer used in resampling.
124  int *resampleBuffer;
125 
126  // Binary search, used in resample.
127  inline int BinarSearch(float prob) const {
128  // A corner case.
129  if (prob <= confidence[0])
130  return 0;
131  int start = 0;
132  int end = numParticles - 1;
133  int mid = (start + end) / 2;
134  while (start < end - 1) {
135  if (prob <= confidence[mid]) {
136  end = mid;
137  }
138  else {
139  start = mid;
140  }
141  mid = (start + end) / 2;
142  }
143  return end;
144  }
145 
149  void InitParticles();
150 
151 };
152 
153 #endif
Definition: Geometry.h:34
void InitBuffer()
Definition: ParticleFilter.cpp:9
ParticleFilter(int n=100, int szParticle=2)
Definition: ParticleFilter.cpp:3
void Propagate(const Size &imgSize)
Definition: ParticleFilter.cpp:29
void ResampleWithBest()
Definition: ParticleFilter.cpp:90
Definition: Geometry.h:14
void InitParticles()
Definition: ParticleFilter.cpp:185
void Observe(const StrongClassifier *classifier, const IntegralImage *intImage)
Definition: ParticleFilter.cpp:51
void InitTarget(const Rect &target)
Definition: ParticleFilter.cpp:15
Definition: IntegralImage.h:11
Definition: ParticleFilter.h:19
Definition: StrongClassifier.h:15
void ResampleWithConfidence()
Definition: ParticleFilter.cpp:108