VAT  3.0
Video Analysis Tool
ReliabilityTracker2D.h
1 #ifndef RELIABILITYTRACKER2D_H
2 #define RELIABILITYTRACKER2D_H
3 
4 #include <QDomNode>
5 #include "Datapool.h"
6 #include "ReliabilityMerge2D.h"
7 #include "ReliableMobileObjectList2D.h"
8 #include "blob.h"
9 #include "TimeStamp.h"
10 #include "calibration.h"
11 #include "sharedTrackingClasses2D.h"
12 
14 
15 public:
16  Datapool *m_data;
17  ReliabilityMerge2D *m_RMerge;
18  ReliabilityMerge2D *m_PreMerge;
19  QImage *m_pSegmentation;
20 
21  std::deque<IdBlobPair2D> biggestBlobForNewMobile;
22  std::set<long int> usedIdsByAlternative;
23  std::map< long int, std::set<SpMobileObject2D, orderedByBestCoherenceOperator2D> > mobileAlternativesMap;
24  std::map< int, std::deque<long int> > mobileIdsUsingABlob;
25 
31 
36  std::map<long int, SpMobileObject2D> mobilesOutList;
37 
38  bool parametersInitialised;
39  static int m_alternativeNumber;
40  static bool m_newOuts;
41  int lastMilliSecondsDifference;
42 
43  //PARAMETERS:
44  bool activatePreMerge;
45  int m_BlobBufferSize;
46 
47  int m_maximumRetainedAlternativeSolutions;
48  int m_maximumGeneratedAlternativesPerMobile;
49  int maximumAlternativeMobilePaths;
50  QString eliminationStrategy;
51 
52  double SpatialCoherenceReliabilityThreshold;
53  double SpatialCoherenceProbabilityThreshold;
54  double alternativeSolutionsProbabilityThreshold;
55 
56  double IgnoreByDimensionalCoherenceThreshold;
57  double IgnoreByVelocityCoherenceThreshold;
58  double ImportanceRateForBestMobileAlternativeProbability;
59 
60  double m_mobile2DCoverageRateToConsiderEqual;
61  static double m_highVisualSupportThreshold;
62  double m_lowVisualSupportThreshold;
63  double m_blobCompletellySupportedThreshold;
64 
65  bool m_internalOutputActivated;
66  bool m_reducedOutputActivated;
67 
68  static int m_meanMillisecondsDifferenceBetweenFrames;
69 
70  double m_acceptedPixelError;
71  double m_max2DSpeed;
72 
73  bool speed_set, object_length;
74 
75  //VARIABLES:
76  int *g_intersectionAreas;
77 
78  Blob **blobsVector;
79  bool *usedBlobs;
80  int *involvedRMobilesCounter;
81  bool **initialMergeMap;
82  int *initialGroups;
83  bool firstFrame;
84  bool initialPreparation;
85 
86  bool *checkedMobilePairValidity, *validMobilePair;
87 
88  int blobsNumber;
89 
90  unsigned long mobile_id_counter;
91  unsigned long rmobile_id_counter;
92  int currentFrameNumber;
93  unsigned long currentTimeMilliSeconds;
94  TimeStamp lastTimeStamp;
95 
96  //Data used to generate the alternative paths for a mobile
97  int g_inserted_for_alternative, g_NumCurrentlyLost;
98  SpRMAlternativeSolution2D g_baseAlternative;
99 
100  std::set<SpRMAlternativeSolution2D, alternatives2DOrderedByBestProbabilityOperator> g_newAlternatives;
101  std::set<SpRMAlternativeSolution2D, alternatives2DOrderedByBestProbabilityOperator> g_completeAlternatives;
102  std::set<SpMobileObject2D, orderedByBestCoherenceOperator2D> g_newMobiles;
103  std::set<SpMobileObject2D, orderedByBestCoherenceOperator2D> g_newSpecialMobiles;
104  std::deque<Blob *> g_includedBlobsInNewMobiles;
105  std::deque<Blob *> g_allocatedBlobs;
106  double g_bestGlobalP;
107  int g_numberOfNewMobiles, g_NumLocallyAddedAlternatives, *g_numberOfNewMobileVersions, *g_mobileVersionIndex, g_totalNumberOfMobileVersions;
108  std::set<SpMobileObject2D, orderedByBestCoherenceOperator2D>::iterator *g_mobileIterators, *g_setBegins;
109  std::set<SpBestAlternativesNode2D, orderedByBestAlternativeProbabilityCooperationOperator2D> g_leaves;
110 
111  std::map<long int, std::set<SpMobileObject2D, orderedByBestCoherenceOperator2D> > *g_newObjectsList;
112  bool *g_acceptable2DCoherenceForMobile;
113  double *g_variableContribution;
114 
115  double *distanceBetweenBlobs;
116 
119 
120  bool setParameters(QDomNode& config);
121  static int getBetaDirection(SceneModel *, QImage *);
122 
127  void computeInclusiveProbabilities(std::set<SpRMAlternativeSolution2D,
128  alternatives2DOrderedByBestProbabilityOperator>* alternativeSolutions,
129  int k, double sum, bool *mark, double *piT);
130 
135  bool init();
136 
137  bool initialPrepareRun();
138 
139  bool prepareRun();
140 
141  void initStaticMobileObject();
142 
148  void getMostLikelyMobileObjects(std::deque<SpMobileObject2D> &mobileObjectsOutput);
149 
150  void preMerge(std::vector<Blob>&);
151 
152  void preSplit(std::vector<Blob>&);
153 
154  void update();
155 
156  void eliminateUnlikelyMobiles();
157 
163  void run(std::vector<Blob>&);
164 
165  void followExistingMobiles();
166 
167  void setInvolvedBlobs();
168 
169  void createMobilePossibilities();
170 
171  void mergeInvolvedRMobiles();
172 
173  void mergeReliableMobiles(SpReliableMobileObject2D firstRMobile, SpReliableMobileObject2D secondRMobile);
174 
175  void determineInvolvedBlobsForMobile(SpMobileObject2D mobile);
176 
177  void insertNewMobiles(SpRMAlternativeSolution2D asolution, SpReliableMobileObject2D rmobile);
178 
179  void setBlobsVector(std::vector<Blob>&);
180 
181  void freeBlobsVector();
182 
183  void presetBlobsVectorAndInitialMergeTable(std::vector<Blob>&);
184 
185  void freeBlobsVectorAndInitialMergeTable();
186 
187  SpMobileObject2D setNotVisibleBlobMobile(SpMobileObject2D currentMobile, DetectionProblemType dp_type);
188 
189  int setGroups(int elementsVector[], bool **relations, int elementsNumber, int *elementsToAnalyzeVector);
190 
191  void setGroup(int elementsVector[], bool **relations, int elementsNumber, int groupId, int startPoint, int referencePoint, int *elementsToAnalyzeVector);
192 
193  void generateNewMobiles(int blobNumberToAnalyze, int *blobsToAnalyze, int groupsNumber, int *blobGroupVector);
194 
195  void generateAlternativesForMobile(int *blobsToMerge, int blobsToMergeNumber);
196 
197  void recursiveComboGenerator(int position, int value, int *alternativesCombo, int *blobsToMerge, int blobsToMergeNumber);
198 
199  bool validBlobMergeConfiguration(int mergeGroupNumber, int mergeLength, int blobsToMergeNumber, int *blobsToMerge, int *alternativesCombo);
200 
201  void processMergeVector(int *alternativesCombo, int *blobsToMerge, int blobsToMergeNumber);
202 
203  void checkConnectivity(bool groupVector[], int elementsNumber, int referencePoint, int *elementsToAnalyzeVector);
204 
205  void insertNewMergeSolution(Blob **mergedBlobs, int finalBlobsNumber, bool *usedBlobsMatrix);
206 
207  SpMobileObject2D getNewMobileFromBlob(Blob *blob);
208 
209  void setCurrentTimeAndFrame();
210 
211  void getMergeConnections(bool *listToUpdate, int startingBlobIndex);
212 
213  void getRecursiveMergeConnections(bool *mergeList, int blobIndex);
214 
215  Blob *generateMostLikelyAlternativeForMobile(SpMobileObject2D mobile);
216 
217  //Quicksort
218  void orderAscending(int *array, int top, int bottom);
219  int getMiddle(int *array, int top, int bottom);
220 
221  SpMobileObject2D setNotVisibleBlobMobile(DetectionProblemType dp_type, SpMobileObject2D currentObject);
222 
223  void filterUnseenMobiles();
224 
225  void filterRepeatedAlternatives(SpReliableMobileObject2D rmobile);
226 
227  void separateReliableSolutions();
228 
229  double getMaxFocalDistanceToImageCorner();
230 
231  double getObjectSizeForMaxReliability(double w, double l, double h);
232 
233  double getObjectDistanceForMaxReliability();
234 
235  void getNearest2DBlobPointToFocalPoint(Blob *blob, double *x, double *y);
236  void getNearest2DBlobPointToFocalPoint(int position, double xCenter, double yCenter, double W, double H, double *x, double *y);
237  void getNearest2DBlobPointToFocalPoint(int position, Rectangle<int> *rect, double *x, double *y);
238 
239  void getHighest3DVariations(double x, double y, double X, double Y, double dX, double dY, double *dx, double *dy);
240 
241  void determineInvolvedBlobsForMobileObject(SpMobileObject2D mobile);
242 
243  bool combinationAlreadyIncluded(Blob **blobsForAlternative, int blobsNumberForAlternative);
244 
245  int getMobileId(Blob *blob);
246 
247  bool notUsedId(long int id);
248 
249  void insertInMobileAlternativesMap(SpMobileObject2D mobile, long int id);
250 
251  bool incoherentMobile(SpMobileObject2D mobile);
252 
253  void generateAlternativesForMobilePath(int length, int position, int value, int *alternativesCombo,
254  int blobsToMergeNumber, int *blobsToMerge, SpMobileObject2D mobile);
255 
256  void generateMobilePath(SpMobileObject2D mobile);
257 
258  bool mobilesCombinationIsValid();
259 
260 
261  bool mobilePairValidityChecked(int index1, int index2);
262 
263  bool mobilePairIsValid(int index1, int index2);
264 
265  bool checkMobilePairValidity(SpMobileObject2D m1, int mindex1, int vindex1, SpMobileObject2D m2, int mindex2, int vindex2);
266 
267  bool checkMobilePairValidity(SpMobileObject2D m1, int mindex1, int vindex1, SpMobileObject2D m2, int mindex2, int vindex2, bool firstVerifiable);
268 
269  bool checkMobilePairValidity(SpMobileObject2D m1, SpMobileObject2D m2);
270 
271  bool checkMobilePairValidity(SpMobileObject2D m1, SpMobileObject2D m2, bool firstVerifiable);
272 
273  bool setPairValidityAndGo(int index1, int index2, bool ret_value);
274 
275  void initValidityMatrices(int size);
276 
277  bool alternativeWith3DInformation(SpRMAlternativeSolution2D alternative);
278 
279  bool blobAlreadyIncludedInNewMobilesSet(Blob *blob);
280 
281  void generateAlternativesWithBestSolutionsTree();
282 
283  void generateNewLeavesFromCurrentBests();
284 
285  void buildNewAlternativesFromLeaves(SpRMAlternativeSolution2D currentAlternative);
286 
287  double getTentativeAlternativeProbabilityValue(std::set<SpMobileObject2D, orderedByBestCoherenceOperator>::iterator *mobileIterators);
288 
289  SpRMAlternativeSolution2D getAlternativeFromNodeIfValid(SpBestAlternativesNode2D node);
290 
291  bool equalMobiles(SpRMAlternativeSolution2D alt1, SpRMAlternativeSolution2D alt2);
292 
293  bool sameUsed(SpMobileObject2D m1, SpMobileObject2D m2);
294 
295  void filterEquallyConvergedMobiles();
296 
297  bool highCoverage(SpMobileObject2D m1, SpMobileObject2D m2);
298 
299  void filterRepeatedAlternatives();
300 
301  bool acceptableInformationForNewMobile(SpMobileObject2D newMobile, SpMobileObject2D oldMobile);
302 
303  SpMobileObject2D setSpecialCaseMobile(DetectionProblemType dp_type, SpMobileObject2D currentObject, Blob *blobToAdd);
304 
305  SpMobileObject2D generateAndValidateNewMobile(SpMobileObject2D currentMobile, Blob *blobToTest);
306 
307  void generateBestPossiblePathsForMobiles(SpRMAlternativeSolution2D alternative);
308 
309  void generateMobilePathFromInitialBlob(SpMobileObject2D mobile, Blob *initialBlob, int numUsed, bool *usedBlobs, double *blobSupport, Rectangle<int> *mobileBBox);
310 
311  void generateAlternativesForMobilePathFromInitialBlob(int length, int position, int value, int *alternativesCombo, int blobsToMergeNumber, int *blobsToMerge,
312  SpMobileObject2D mobile, Blob *initialBlob, int numUsed, bool *usedBlobs, Rectangle<int> *mobileBBox);
313 
314  bool equal2DDimensions(SpMobileObject2D m1, SpMobileObject2D m2);
315 
316  bool blobCanBeIncludedForMerge(int currentMergeLength, int *mergedBlobIndexes, int currentBlobIndex);
317 
318  void cleanByEnsureUsedBlobs(SpRMAlternativeSolution2D newAlternative);
319 
320  SpMobileObject2D checkSpecialCases(SpMobileObject2D currentMobile, Blob *blobToTest);
321 
322 };
323 
324 typedef QSharedPointer<ReliabilityTracker2D> SpReliabilityTracker2D;
325 
326 
327 #endif // RELIABILITYTRACKER2D_H
void getMostLikelyMobileObjects(std::deque< SpMobileObject2D > &mobileObjectsOutput)
clears the current mobiles list and gives the processed list of most likely mobiles ...
Definition: ReliabilityTracker2D.cpp:30
void computeInclusiveProbabilities(std::set< SpRMAlternativeSolution2D, alternatives2DOrderedByBestProbabilityOperator > *alternativeSolutions, int k, double sum, bool *mark, double *piT)
compute inclusive probabilities for a random linear elimination strategy
Definition: ReliabilityTracker2D.cpp:2602
Definition: ReliabilityTracker2D.h:13
Definition: ReliabilityMerge2D.h:11
ReliableMobileObjectList2D rMobilesList
pointer to the tracking results
Definition: ReliabilityTracker2D.h:30
Definition: calibration.h:51
Definition: RMAlternativeSolution2D.h:16
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
Definition: blob.h:79
void run(std::vector< Blob > &)
reliability tracker process main call
Definition: ReliabilityTracker2D.cpp:2622
Definition: ReliableMobileObjectList2D.h:11