VAT  3.0
Video Analysis Tool
RMMTracker.h
1 #ifndef RMMTRACKER_H
2 #define RMMTRACKER_H
3 
4 #include <QDomNode>
5 #include "Datapool.h"
6 #include "src/ReliabilityMerge.h"
7 #include "RMMHypothesisSetList.h"
8 #include "src/blob.h"
9 #include "src/TimeStamp.h"
10 #include "src/calibration.h"
11 #include "src/sharedTrackingClasses.h"
12 #include "src/groundtruth.h"
13 
14 //#define RMTT_OUTPUT
15 
16 class bestHypothesesNode;
17 
18 typedef QSharedPointer<bestHypothesesNode> SpBestHypothesesNode;
19 
21  public:
22  static int numVariables;
23  static int variablesSum;
24  static int *variablesNumFrames;
25 
26  static std::set<SpRMMMobileObject, RMMorderedByBestCoherenceOperator>::iterator *newObjectsListEnds;
27 
28  double value;
29  int mobileIndex;
30  int *versionIndex;
31  bool added;
32  std::set<SpRMMMobileObject, RMMorderedByBestCoherenceOperator>::iterator *mobileIterators;
33  double *variableContribution;
34 
35  bestHypothesesNode(double i_value, int i_index);
36  bestHypothesesNode(SpBestHypothesesNode toCopy, int indexToMove);
38 
39  void setNextHypothesisValue(int index);
40 
41 };
42 
44  bool operator()(SpBestHypothesesNode altNode1, SpBestHypothesesNode altNode2);
45 };
46 
47 
48 /*class IdBlobPair {
49  public:
50  long id;
51  Blob *blob;
52 
53  IdBlobPair(long i_id, Blob *i_blob);
54  ~IdBlobPair();
55  bool operator<(IdBlobPair &P);
56 };*/
57 
58 
59 
60 class RMMTracker {
61 
62 public:
63  Datapool *m_data;
64  //Template for building the hierarchy by operator=
65  ReliabilityMultiModelTemplate m_multiModelTemplate;
66  ReliabilityMerge *m_RMerge;
67  ReliabilityMerge *m_PreMerge;
68  //ReliabilityClassification *m_rclassif;
69  SceneModel* smodel;
70  QImage *m_pSegmentation;
71  bool activatePreMerge;
72  double maxObjectSpeed;
73 // std::map<ObjectType, SpModelInterface> *objectModels;
74 
75  int m_MultiModelBufferSize;
76  double meanw, meanl, meanh;
82 
83 
84  int m_maximumGeneratedHypothesesPerMobile;
85 
90  int m_maximumRetainedHypotheses;
91 
97 
103  int m_maximumHypothesesPerMobile;
104 
116  std::deque<IdBlobPair> biggestBlobForNewMobile;
117  std::set<long int> usedIdsByHypothesis;
118  std::map< long int, std::set<SpRMMMobileObject, RMMorderedByBestCoherenceOperator> > mobileAlternativesMap;
119  std::map< int, std::deque<long int> > mobileIdsUsingABlob;
120 
125  RMMHypothesisSetList hypothesisSets;
126 
127  std::map<long int, SpRMMMobileObject> mobilesOutList;
128 
129  bool parametersInitialised;
130 
131  QString m_MultiModelConfig;
132 
133 
134  static int m_hypothesisNumber;
135  static bool m_newOuts;
136  static int acceptedPixelError;
137  static int acceptedPixelDistance;
138  static double accepted3DFeatureError;
139  static double acceptedOrientationError;
140  static double m_highVisualSupportThreshold;
141  static int m_meanMillisecondsDifferenceBetweenFrames;
142  int lastMilliSecondsDifference;
143 
144  //PARAMETERS:
145  double CoherenceReliabilityThreshold;
146  double CoherenceProbabilityThreshold;
147 
148  double IgnoreByDimensionalCoherenceThreshold;
149  double IgnoreByVelocityCoherenceThreshold;
150 
151  double ImportanceRateForBestMobileHypothesisProbability;
152 
153  double m_mobile2DCoverageRateToConsiderEqual;
154 
155  bool m_internalOutputActivated;
156  bool m_reducedOutputActivated;
157 
158  double m_lowVisualSupportThreshold;
159  double m_blobCompletellySupportedThreshold;
160 
161  double m_InvolvedVisualEvidenceMultiplyingFactor;
162  int m_InvolvedVisualEvidenceSumFactor;
163  double m_InvolvedVisualEvidenceMinIntersectionRatio;
164 
165  bool m_setObjectLog;
166  QString m_objectLogRootName;
167  QString m_objectLogModelName;
168  bool m_logModelFound;
169  bool m_logFirstTime;
170  std::map<unsigned long, QString> logFileNames;
171 
172  bool m_useKalman;
173  int m_kalmanMaxPixelError;
174 
175  int *g_intersectionAreas;
176 
177  Blob **blobsVector;
178  bool *usedBlobs;
179  int *involvedHypothesisSetsCounter;
180  bool **initialMergeMap;
181  int *initialGroups;
182  bool initialPreparation;
183 
184  bool *checkedMobilePairValidity, *validMobilePair;
185 
186  int blobsNumber;
187 
188  unsigned long mobile_id_counter;
189  unsigned long hset_id_counter;
190  int currentFrameNumber;
191  unsigned long currentTimeMilliSeconds;
192  TimeStamp lastTimeStamp;
193 
194  //Data used to generate the alternative paths for a mobile
195  int g_inserted_for_hypothesis, g_NumCurrentlyLost;
196  SpRMMHypothesis g_baseHypothesis;
197 
198  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> g_newHypotheses;
199  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> g_completeHypotheses;
200  std::deque<Blob *> g_includedBlobsInNewMobiles;
201  std::deque<Blob *> g_allocatedBlobs;
202  double g_bestGlobalP;
203  int g_numberOfNewMobiles, g_NumLocallyAddedHypotheses, *g_numberOfNewMobileVersions, *g_mobileVersionIndex, g_totalNumberOfMobileVersions;
204  std::set<SpRMMMobileObject, RMMorderedByBestCoherenceOperator>::iterator *g_mobileIterators, *g_setBegins;
205  std::set<SpBestHypothesesNode, orderedByBestHypothesisProbabilityCooperationOperator> g_leaves;
206 
207  std::map<long int, std::set<SpRMMMobileObject, RMMorderedByBestCoherenceOperator> > *g_newObjectsList;
208  double *g_variableContribution;
209 
210  double *distanceBetweenBlobs;
211 
212  bool m_activatePauseOnLost, m_pauseOnLost;
213  bool m_activatePauseOnNew, m_pauseOnNew;
214 
215  //Trajectories log file
216  std::set<unsigned long> chosen_object_trajectories;
217  bool m_logTrajectories;
218  bool m_logTrajectoriesById;
219  QString m_logTrajectoryFileName;
220  std::map<unsigned long, simplifiedObject> simplifiedObjects;
221 
222  RMMTracker(Datapool *i_data);
223  ~RMMTracker();
224 
225  //Write chosen object trajectories
226  void writeObjectTrajectories();
227 
228  //Reset pause indicators.
229  void resetPauseCriterias();
230 
231  void activatePause();
232 
233  //Implements default multimodel hierarchy if failed to extract multi model from xml configuration file
234  void setDefaultMultiModelTemplate();
235 
236  //Sets the buffer sizes according to the maximal buffer defined for a submodel:
237  void setBufferSize();
238  void setBufferSize(int &max, std::vector<SpReliabilitySingleModelInterface> &models);
239 
240  QString initObjectLog(long object_id);
241  void writeObjectLog();
242 
243  void setRMMMobileObjectTemplates();
244 
245  bool setParameters(QDomNode& config);
246  bool processModelParameters(QString& filename);
247 
252  bool init();
253 
254  bool initialPrepareRun();
255 
256  bool prepareRun();
257 
258  void initStaticMobileObject();
259 
265  void getMostLikelyMobileObjects(std::deque<SpRMMMobileObject> &mobileObjectsOutput);
266 
267  void preMerge(std::vector<Blob>&);
268 
269  void update();
270 
271  void eliminateUnlikelyMobiles();
272 
278  void run(std::vector<Blob>&);
279 
280  void followExistingMobiles();
281 
282  void setInvolvedBlobs();
283 
284  void createMobilePossibilities();
285 
286  void mergeUsedHypothesisSets();
287 
288  void mergeConflictingHypothesisSets(SpRMMHypothesisSet first, SpRMMHypothesisSet second);
289 
290  void insertNewMobiles(std::deque<SpRMMHypothesisSet> &newHSets);
291  void insertNewMobiles(SpRMMHypothesis hypothesis, std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &newHypotheses);
292 
293  void setBlobsVector(std::vector<Blob>&);
294 
295  void freeBlobsVector();
296 
297  void presetBlobsVectorAndInitialMergeTable(std::vector<Blob>&);
298 
299  void freeBlobsVectorAndInitialMergeTable();
300 
301 
302  int setGroups(int elementsVector[], bool **relations, int elementsNumber, int *elementsToAnalyzeVector);
303 
304  void setGroup(int elementsVector[], bool **relations, int elementsNumber, int groupId, int startPoint, int referencePoint, int *elementsToAnalyzeVector);
305 
306 
307  int setNewGroups(int elementsVector[], int elementsNumber, std::vector<BoundingBox> &elementsToAnalyzeVector);
308 
309  void setNewGroup(int groupsVector[], int elementsNumber, int groupId, int startPoint, int referencePoint, std::vector<BoundingBox> &elementsToAnalyzeVector);
310 
311  bool boundingBoxesRelated(BoundingBox &b1, BoundingBox &b2);
312 
313  void generateNewMobiles(int bboxNumberToAnalyze, std::vector<BoundingBox> &bboxesToAnalyze, int groupsNumber, int *blobGroupVector,
314  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &new_hyps);
315  void generateNewMobiles(int bboxNumberToAnalyze, std::vector<BoundingBox> &bboxesToAnalyze, int groupsNumber, int *blobGroupVector,
316  std::deque<SpRMMHypothesisSet> &newHSets);
317 
318  void generateHypothesesForEvidences(std::vector<BoundingBox> &bboxesToMerge, int bboxesToMergeNumber,
319  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &new_hyps);
320 
321  void recursiveComboGenerator(int position, int value, int *hypothesesCombo, std::vector<BoundingBox> &bboxesToMerge, int bboxesToMergeNumber,
322  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &new_hyps);
323 
324  bool validBboxMergeConfiguration(int mergeGroupNumber, int mergeLength, int bboxesToMergeNumber, std::vector<BoundingBox> &bboxesToMerge, int *hypothesesCombo);
325 
326  void processMergeVector(int *hypothesesCombo, std::vector<BoundingBox> &bboxesToMerge, int bboxesToMergeNumber,
327  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &new_hyps);
328 
329  void checkConnectivity(bool groupVector[], int elementsNumber, int referencePoint, int *elementsToAnalyzeVector, std::vector<BoundingBox> &bboxesToMerge);
330 
331  void insertNewMergeSolution(BoundingBox mergedBboxes[], int finalBboxesNumber, std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &new_hyps);
332 
333  void setCurrentTimeAndFrame();
334 
335  void getMergeConnections(bool *listToUpdate, int startingBlobIndex);
336 
337  void getRecursiveMergeConnections(bool *mergeList, int blobIndex);
338 
339  //Quicksort
340  void orderAscending(int *array, int top, int bottom);
341  int getMiddle(int *array, int top, int bottom);
342 
343  void filterUnseenMobiles();
344 
345  void separateReliableHypotheses();
346 
347  void determineInvolvedBlobsForMobileObject(SpRMMMobileObject mobile);
348 
349  bool combinationAlreadyIncluded(BoundingBox mergedBboxes[], int bboxNumberForHypothesis);
350 
351  int getMobileId();
352 
353  bool checkDataPackDifference(SpReliabilitySingleModelInterface m1, SpReliabilitySingleModelInterface m2);
354 
355  void getNewHypothesesFromBoundingBox(BoundingBox &bbox, std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &newHypotheses);
356  void getHypothesesForExistingMobile(SpRMMMobileObject mobile, BoundingBox &bbox, DetectionProblemType dtype, std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &newHypotheses);
357  void getNewHypothesesFromMobile(SpRMMMobileObject mobile, std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &newHypotheses);
358  void setInitialHypothesisSet(SpRMMMobileObject mobile, std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &newHypotheses);
359  ModelInstanceGeneralPack *iterateMultiModel(int modelIndex, SpRMMMobileObject mobile, std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &hypotheses);
360  void generateNewHypotheses(SpRMMMobileObject mobile, std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &hypotheses);
361 
362  void regenHypotheses(std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &new_hypotheses,
363  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> hyps[],
364  SpRMMMobileObject mobiles[], int dsize);
365  void regenHypotheses(std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &new_hypotheses,
366  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> hyps[], int dsize);
367 
368  ModelInstanceGeneralPack *combineHypotheses(std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &new_hypotheses,
369  int modelIndex, SpRMMMobileObject mobile, int dsize,
370  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> hyps[],
371  ModelInstanceGeneralPack *post[]);
372  void checkRepeatedObject(std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &hyps, SpRMMMobileObject m, std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &new_hyps);
373 
374  bool equalHypotheses(unsigned long current_mobile_id, SpRMMHypothesis h1, SpRMMHypothesis h2);
375  bool equalHypotheses(SpRMMHypothesis h1, SpRMMHypothesis h2);
376 
377  double segmentationSimilarity(ModelInstanceGeneralPack &m1, ModelInstanceGeneralPack &m2);
378  void genROIFromFg(cv::Mat &image_roi, BoundingBox &roi);
379 
380  BoundingBox getMergedBoundingBox(int *mergeSequence, int sequenceLength, std::vector<BoundingBox> &bboxesToMerge);
381 
382  double areaOfIntersection(SpRMMMobileObject m1, SpRMMMobileObject m2);
383 
384  int getPairIndex(int mindex, int vindex);
385 
386  bool mobilePairValidityChecked(int index1, int index2);
387 
388  bool mobilePairIsValid(int index1, int index2);
389 
390  //It can be eliminated or reused
391  bool checkMobilePairValidity(SpRMMMobileObject m1, int mindex1, int vindex1, SpRMMMobileObject m2, int mindex2, int vindex2);
392 
393  bool setPairValidityAndGo(int index1, int index2, bool ret_value);
394 
395  bool blobAlreadyIncludedInNewMobilesSet(Blob *blob);
396 
397  bool equalMobiles(SpRMMHypothesis alt1, SpRMMHypothesis alt2);
398  bool equalMobiles(SpRMMMobileObject m1, SpRMMMobileObject m2);
399 
400  bool sameUsed(SpRMMMobileObject m1, SpRMMMobileObject m2);
401 
402  void filterContainedStartingMobiles();
403 
404  void filterEquallyConvergedMobiles();
405 
406  bool highCoverage(SpRMMMobileObject m1, SpRMMMobileObject m2);
407 
408  void filterRepeatedHypotheses();
409 
410  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> generateBestPossiblePathsForMobiles(SpRMMHypothesis hypothesis);
411 
412  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> generateHypothesesFromInitialBlob(
413  SpRMMMobileObject currentMobile, std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> newHypotheses,
414  Blob *initialBlob, int numUsed, bool *usedBlobs, double *blobSupport, Rectangle<int> &mobileBBox);
415 
416  void generateMobilePathFromInitialBlob(SpRMMMobileObject mobile, Blob *initialBlob, int numUsed, bool *usedBlobs, double *blobSupport,
417  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &newHypotheses);
418 
419  void addNewHypotheses(unsigned long current_mobile_id,
420  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &current_hypotheses,
421  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &new_hypotheses);
422  void addNewHypotheses(std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &current_hypotheses,
423  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &new_hypotheses);
424 
425  void generateHypothesesForMobilePathFromInitialBlob(int length, int position, int value, int *hypothesesCombo,
426  int blobsToMergeNumber, int *blobsToMerge, SpRMMMobileObject mobile,
427  Blob *initialBlob, int numUsed, bool *usedBlobs,
428  std::set<SpRMMHypothesis, hypothesesOrderedByBestProbabilityOperator> &newHypotheses);
429 
430  bool blobCanBeIncludedForMerge(int currentMergeLength, int *mergedBlobIndexes, int currentBlobIndex);
431 
432 
433 };
434 
435 typedef QSharedPointer<RMMTracker> SpRMMTracker;
436 
437 
438 #endif // RMMTRACKER_H
int maximumMobilePaths
The maximum number of retained generated mobile paths.
Definition: RMMTracker.h:96
QString eliminationStrategy
The elimination strategy to use : worst probability elimination s., random linear elimination s...
Definition: RMMTracker.h:110
Definition: RMMTracker.h:20
Definition: RMMTracker.h:60
Definition: ReliabilityMerge.h:65
Definition: calibration.h:51
Definition: reliabilitysinglemodelinterface.h:27
Definition: TimeStamp.h:4
An object of this class is instantiated at main code, and this object is used by every class to push ...
Definition: Datapool.h:39
double hypothesesProbabilityThreshold
hypotheses probability threshold parameter for pre-elimination
Definition: RMMTracker.h:81
Definition: reliabilitymultimodel.h:24
Definition: blob.h:79
Definition: RMMHypothesisSetList.h:11