00001
00002
00003
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
00030
00031
00033
00089
00090
00091
00092 #ifndef FGBGSEGMENT_H
00093 #define FGBGSEGMENT_H
00094
00095 #include <vector>
00096 #include <stdint.h>
00097 #include "pyra/tpimage.h"
00098 #include "matrix3.h"
00099
00103 class CudaSegment;
00104
00106 class FgBgSegment {
00107
00108 friend class CudaSegment;
00109
00110
00111 static const float eps = 1e-6f;
00112 public:
00114 static const int hist_size = 12;
00115
00117 class ColorModel {
00118 protected:
00120 FgBgSegment &segm;
00121
00122 public:
00123 static const float weight = 0.01;
00124 public:
00125 float histogram[hist_size*hist_size];
00126 float greyhist[hist_size];
00127 float colorcost[hist_size*hist_size];
00128 float greycost[hist_size];
00130 ColorModel *prior;
00132
00133 ColorModel(FgBgSegment &segm);
00135
00136 ColorModel(const ColorModel &model);
00138 ColorModel &operator=(const ColorModel &model);
00139 ~ColorModel();
00140
00142
00145 float CreateHistogram(Image<float> &probabilities, bool allPoints);
00147 void SmoothAndNormalizeHist( float const* hist, float const* phist,
00148 int size,
00149 float* const histogram, float* const cost);
00150 void NormalizeHist( float* const histogram,
00151 float* const cost,
00152 int size);
00154
00155 void CreateHistogram(Image<uint8_t> &mask, bool allPoints);
00157 virtual void Update() { };
00158 };
00159
00160 protected:
00161
00163 class FlatSurface : public ColorModel {
00164 public:
00165 static const float weight_a = 100.0f*100.0f;
00166 static const float weight_b = 50.0f*50.0f;
00167 static const float weight_d = 1.0f*1.0f;
00168 static const float strength = 10.0f;
00169 public:
00170 float alpha, beta, disp, spread_d;
00171 float min_x, min_y, max_x, max_y;
00173 Image<float> probabilities;
00174 public:
00176
00181 FlatSurface(FgBgSegment &segm, int width, int height);
00183 void Initialize();
00185 virtual void Update();
00186 };
00187
00189 class Foreground : public ColorModel {
00190 public:
00191 static const float weight_p = 0.005f*0.005f;
00192 static const float weight_d = 0.5f*0.5f;
00193 static const float strength = 10.0f;
00194 public:
00195
00197 float window_size;
00198 float ball_size;
00199
00201 bool combined;
00202 Vector3 position3d;
00203 Matrix3 spread3d;
00205 Image<float> probabilities;
00206 public:
00208
00213 Foreground(FgBgSegment &segm, int width, int height);
00215
00219 void Initialize(int startx, int starty);
00221 virtual void Update();
00222
00225 void SetInitParams( float l_window_size, float l_ball_size);
00226
00227 };
00228
00230 class Background : public ColorModel {
00231 public:
00232 static const float weight_d = 0.1f*0.1f;
00233 static const float strength = 10.0f;
00234 public:
00235 float disp, spread_d;
00237 Image<float> probabilities;
00238 public:
00240
00245 Background(FgBgSegment &segm, int width, int height);
00247 void Initialize();
00249 virtual void Update();
00250 };
00251
00253 bool withSurface;
00255 bool withColors;
00257 bool withDisparities;
00259 bool withColorHoles;
00260
00261
00262
00263 bool uniform;
00265 int verbose;
00266
00268 Background ground;
00270 FlatSurface surface;
00272 std::vector<Foreground*> figures;
00273
00275 Image<uint8_t> hue;
00277 Image<uint8_t> saturation;
00279 Image<uint8_t> grey;
00281 Image<float> *disparities;
00283 std::vector<ColorModel> colorPriors;
00284
00286 int width;
00288 int height;
00290 int drange;
00292 float gradWeight;
00293
00295 float windowSize;
00296 float ballSize;
00297
00299 CudaSegment *cudaSegment;
00301 bool gpuopt;
00302
00304
00306 void CreateHistograms(bool allPoints);
00308 void InitSegmentation();
00310
00313 template <int numFigures> static void PixSegment(FgBgSegment &segm);
00315
00318 void RGBToHSV(Image<uint8_t> &cimg);
00319
00320 public:
00322
00328 FgBgSegment(int width, int height, int drange, float gradWeight = 20.0,
00329 float w_size = 0.20f, float b_size = 0.20f);
00330 ~FgBgSegment();
00332 void UseGPU(bool gpuopt = true);
00334
00342 void Execute(Image<uint8_t> &image, Image<float> &disp,
00343 bool initialize, int loops = 1,
00344 int startx = -1, int starty = -1);
00346
00352 void SetNewForeground(int startx, int starty, Image<float> &dimg, int drange_);
00354
00359 void SetNewForeground(Image<uint8_t> &mask, Image<float> &dimg,
00360 int drange, bool reuseLast = false);
00361
00363 void GetSurfaceParameters( float &alpha, float &beta, float &disp);
00364
00365
00366 void GetSurfaceMinMax( float &min_x,
00367 float &min_y,
00368 float &max_x,
00369 float &max_y );
00370
00371
00373 void SetWithColors( bool val);
00375 bool GetWithColors();
00376
00378 void SetWithColorHoles( bool val);
00380 bool GetWithColorHoles();
00381
00383 void SetUniform( bool val);
00385 bool GetUniform();
00386
00388 void SetWithSurface( bool val);
00390 bool GetWithSurface();
00391
00393 void SetWithDisparities( bool val);
00395 bool GetWithDisparities();
00396
00398 void SetGradWeight( float val);
00400 float GetGradWeight();
00401
00403
00406 void MakeSegmentImage(Image<uint8_t> &image);
00408
00413 void MakeMaskImage(Image<uint8_t> &image, int val = 255, int obj = 0);
00415
00418 void MakeBorderImage(Image<uint8_t> &image);
00419
00420 };
00421
00422 #endif // FGBGSEGMENT_H