VAT  3.0
Video Analysis Tool
ReliabilityTracker.h
1 #ifndef RELIABILITYTRACKER_H
2 #define RELIABILITYTRACKER_H
3 
4 #include <QDomNode>
5 #include "Datapool.h"
6 #include "ReliabilityMerge.h"
7 #include "ReliableMobileObjectList.h"
8 #include "blob.h"
9 #include "TimeStamp.h"
10 #include "calibration.h"
11 #include "sharedTrackingClasses.h"
13 
15 
16 public:
17  Datapool *m_data;
18  ReliabilityMerge *m_RMerge;
19  ReliabilityMerge *m_PreMerge;
20  ReliabilityClassification *m_rclassif;
21  SceneModel* smodel;
22  QImage *m_pSegmentation;
23  bool activatePreMerge;
24  double maxObjectSpeed;
25  std::map<ObjectType, SpModelInterface> *objectModels;
26 
27  int m_BlobBufferSize;
28  double meanw, meanl, meanh;
34 
39  int m_maximumRetainedAlternativeSolutions;
40 
45  int maximumAlternativeMobilePaths;
46 
52  int m_maximumGeneratedAlternativesPerMobile;
53 
59  QString eliminationStrategy;
65  std::deque<IdBlobPair> biggestBlobForNewMobile;
66  std::set<long int> usedIdsByAlternative;
67  std::map< long int, std::set<SpMobileObject, orderedByBestCoherenceOperator> > mobileAlternativesMap;
68  std::map< int, std::deque<long int> > mobileIdsUsingABlob;
69 
75 
80  std::map<long int, SpMobileObject> mobilesOutList;
81 
82  bool parametersInitialised;
83  static int m_alternativeNumber;
84  static bool m_newOuts;
85  static int acceptedPixelError;
86  static double accepted3DFeatureError;
87  static double acceptedOrientationError;
88  static double m_highVisualSupportThreshold;
89  static int m_meanMillisecondsDifferenceBetweenFrames;
90  int lastMilliSecondsDifference;
91 
92  //PARAMETERS:
93  double SpatialCoherenceReliabilityThreshold;
94  double SpatialCoherenceProbabilityThreshold;
95 
96  double IgnoreByDimensionalCoherenceThreshold;
97  double IgnoreByVelocityCoherenceThreshold;
98 
99  double ImportanceRateForBestMobileAlternativeProbability;
100 
101  bool m_internalOutputActivated;
102  bool m_reducedOutputActivated;
103 
104  double m_maximal3DBaseOverlapping;
105  double m_mobile2DCoverageRateToConsiderEqual;
106 
107  double m_lowVisualSupportThreshold;
108  double m_blobCompletellySupportedThreshold;
109 
110  int *g_intersectionAreas;
111 
112  Blob **blobsVector;
113  bool *usedBlobs;
114  int *involvedRMobilesCounter;
115  bool **initialMergeMap;
116  int *initialGroups;
117  bool firstFrame;
118  bool initialPreparation;
119 
120  bool *checkedMobilePairValidity, *validMobilePair;
121 
122  int blobsNumber;
123 
124  unsigned long mobile_id_counter;
125  unsigned long rmobile_id_counter;
126  int currentFrameNumber;
127  unsigned long currentTimeMilliSeconds;
128  TimeStamp lastTimeStamp;
129 
130  //Data used to generate the alternative paths for a mobile
131  int g_inserted_for_alternative, g_NumCurrentlyLost;
132  SpRMAlternativeSolution g_baseAlternative;
133 
134  std::set<SpRMAlternativeSolution, alternativesOrderedByBestProbabilityOperator> g_newAlternatives;
135  std::set<SpRMAlternativeSolution, alternativesOrderedByBestProbabilityOperator> g_completeAlternatives;
136  std::set<SpMobileObject, orderedByBestCoherenceOperator> g_newMobiles;
137  std::set<SpMobileObject, orderedByBestCoherenceOperator> g_newSpecialMobiles;
138  std::deque<Blob *> g_includedBlobsInNewMobiles;
139  std::deque<Blob *> g_allocatedBlobs;
140  double g_bestGlobalP;
141  int g_numberOfNewMobiles, g_NumLocallyAddedAlternatives, *g_numberOfNewMobileVersions, *g_mobileVersionIndex, g_totalNumberOfMobileVersions;
142  std::set<SpMobileObject, orderedByBestCoherenceOperator>::iterator *g_mobileIterators, *g_setBegins;
143  std::set<SpBestAlternativesNode, orderedByBestAlternativeProbabilityCooperationOperator> g_leaves;
144 
145  std::map<long int, std::set<SpMobileObject, orderedByBestCoherenceOperator> > *g_newObjectsList;
146  bool *g_acceptable3DCoherenceForMobile;
147  double *g_variableContribution;
148 
149  double *distanceBetweenBlobs;
150 
151  ReliabilityTracker(Datapool *i_data);
153 
154  bool setParameters(QDomNode& config);
155  static int getBetaDirection(SceneModel *, QImage *);
156 
157  void computeInclusiveProbabilities(std::set<SpRMAlternativeSolution,
158  alternativesOrderedByBestProbabilityOperator>* alternativeSolutions,
159  int k, double sum, bool *mark, double *piT);
160 
165  bool init();
166 
167  bool initialPrepareRun();
168 
169  bool prepareRun();
170 
171  void initStaticMobileObject();
172 
178  void getMostLikelyMobileObjects(std::deque<SpMobileObject> &mobileObjectsOutput);
179 
180  void preMerge(std::vector<Blob>&);
181 
182  void preSplit(std::vector<Blob>&);
183 
184  void update();
185 
186  void eliminateUnlikelyMobiles();
187 
193  void run(std::vector<Blob>&);
194 
195  void followExistingMobiles();
196 
197  void setInvolvedBlobs();
198 
199  void createMobilePossibilities();
200 
201  void mergeInvolvedRMobiles();
202 
203  void mergeReliableMobiles(SpReliableMobileObject firstRMobile, SpReliableMobileObject secondRMobile);
204 
205  void determineInvolvedBlobsForMobile(SpMobileObject mobile);
206 
207  void insertNewMobiles(SpRMAlternativeSolution asolution, SpReliableMobileObject rmobile);
208 
209  void setBlobsVector(std::vector<Blob>&);
210 
211  void freeBlobsVector();
212 
213  void presetBlobsVectorAndInitialMergeTable(std::vector<Blob>&);
214 
215  void freeBlobsVectorAndInitialMergeTable();
216 
217  SpMobileObject setNotVisibleBlobMobile(SpMobileObject currentMobile, DetectionProblemType dp_type);
218 
219  int setGroups(int elementsVector[], bool **relations, int elementsNumber, int *elementsToAnalyzeVector);
220 
221  void setGroup(int elementsVector[], bool **relations, int elementsNumber, int groupId, int startPoint, int referencePoint, int *elementsToAnalyzeVector);
222 
223  void generateNewMobiles(int blobNumberToAnalyze, int *blobsToAnalyze, int groupsNumber, int *blobGroupVector);
224 
225  void generateAlternativesForMobile(int *blobsToMerge, int blobsToMergeNumber);
226 
227  void recursiveComboGenerator(int position, int value, int *alternativesCombo, int *blobsToMerge, int blobsToMergeNumber);
228 
229  bool validBlobMergeConfiguration(int mergeGroupNumber, int mergeLength, int blobsToMergeNumber, int *blobsToMerge, int *alternativesCombo);
230 
231  void processMergeVector(int *alternativesCombo, int *blobsToMerge, int blobsToMergeNumber);
232 
233  void checkConnectivity(bool groupVector[], int elementsNumber, int referencePoint, int *elementsToAnalyzeVector);
234 
235  void insertNewMergeSolution(Blob **mergedBlobs, int finalBlobsNumber, bool *usedBlobsMatrix);
236 
237  SpMobileObject getNewMobileFromBlob(Blob *blob);
238 
239  void setCurrentTimeAndFrame();
240 
241  void getMergeConnections(bool *listToUpdate, int startingBlobIndex);
242 
243  void getRecursiveMergeConnections(bool *mergeList, int blobIndex);
244 
245  Blob *generateMostLikelyAlternativeForMobile(SpMobileObject mobile);
246 
247  //Quicksort
248  void orderAscending(int *array, int top, int bottom);
249  int getMiddle(int *array, int top, int bottom);
250 
251  SpMobileObject setNotVisibleBlobMobile(DetectionProblemType dp_type, SpMobileObject currentObject);
252 
253  void filterUnseenMobiles();
254 
255  void filterRepeatedAlternatives(SpReliableMobileObject rmobile);
256 
257  void separateReliableSolutions();
258 
259  double getMaxFocalDistanceToImageCorner();
260 
261  double getObjectSizeForMaxReliability(double w, double l, double h);
262 
263  double getObjectDistanceForMaxReliability();
264 
265  void getNearest2DBlobPointToFocalPoint(Blob *blob, double *x, double *y);
266  void getNearest2DBlobPointToFocalPoint(int position, double xCenter, double yCenter, double W, double H, double *x, double *y);
267  void getNearest2DBlobPointToFocalPoint(int position, Rectangle<int> *rect, double *x, double *y);
268 
269  void getHighest3DVariations(double x, double y, double X, double Y, double dX, double dY, double *dx, double *dy);
270 
271  void determineInvolvedBlobsForMobileObject(SpMobileObject mobile);
272 
273  bool combinationAlreadyIncluded(Blob **blobsForAlternative, int blobsNumberForAlternative);
274 
275  int getMobileId(Blob *blob);
276 
277  bool notUsedId(long int id);
278 
279  void insertInMobileAlternativesMap(SpMobileObject mobile, long int id);
280 
281  bool incoherentMobile(SpMobileObject mobile);
282 
283  void generateAlternativesForMobilePath(int length, int position, int value, int *alternativesCombo,
284  int blobsToMergeNumber, int *blobsToMerge, SpMobileObject mobile);
285 
286  void generateMobilePath(SpMobileObject mobile);
287 
288  bool mobilesCombinationIsValid();
289 
290  double areaOfIntersection(SpMobileObject m1, SpMobileObject m2);
291 
292  double areaOfIntersectionFirstNo3D(SpMobileObject m1, SpMobileObject m2, double *areaOfNo3D);
293 
294  int getPairIndex(int mindex, int vindex);
295 
296  bool mobilePairValidityChecked(int index1, int index2);
297 
298  bool mobilePairIsValid(int index1, int index2);
299 
300  bool checkMobilePairValidity(SpMobileObject m1, int mindex1, int vindex1, SpMobileObject m2, int mindex2, int vindex2);
301 
302  bool checkMobilePairValidity(SpMobileObject m1, int mindex1, int vindex1, SpMobileObject m2, int mindex2, int vindex2, bool firstVerifiable);
303 
304  bool checkMobilePairValidity(SpMobileObject m1, SpMobileObject m2);
305 
306  bool checkMobilePairValidity(SpMobileObject m1, SpMobileObject m2, bool firstVerifiable);
307 
308  bool setPairValidityAndGo(int index1, int index2, bool ret_value);
309 
310  void initValidityMatrices(int size);
311 
312  bool alternativeWith3DInformation(SpRMAlternativeSolution alternative);
313 
314  bool blobAlreadyIncludedInNewMobilesSet(Blob *blob);
315 
316  void generateAlternativesWithBestSolutionsTree();
317 
318  void generateNewLeavesFromCurrentBests();
319 
320  void buildNewAlternativesFromLeaves(SpRMAlternativeSolution currentAlternative);
321 
322  double getTentativeAlternativeProbabilityValue(std::set<SpMobileObject, orderedByBestCoherenceOperator>::iterator *mobileIterators);
323 
324  SpRMAlternativeSolution getAlternativeFromNodeIfValid(SpBestAlternativesNode node);
325 
326  bool equalMobiles(SpRMAlternativeSolution alt1, SpRMAlternativeSolution alt2);
327 
328  bool sameUsed(SpMobileObject m1, SpMobileObject m2);
329 
330  void filterEquallyConvergedMobiles();
331 
332  bool highCoverage(SpMobileObject m1, SpMobileObject m2);
333 
334  void filterRepeatedAlternatives();
335 
336  bool acceptableInformationForNewMobile(SpMobileObject newMobile, SpMobileObject oldMobile);
337 
338  SpMobileObject setSpecialCaseMobile(DetectionProblemType dp_type, SpMobileObject currentObject, Blob *blobToAdd);
339 
340  SpMobileObject generateAndValidateNewMobile(SpMobileObject currentMobile, Blob *blobToTest);
341 
342  void generateBestPossiblePathsForMobiles(SpRMAlternativeSolution alternative);
343 
344  void generateMobilePathFromInitialBlob(SpMobileObject mobile, Blob *initialBlob, int numUsed, bool *usedBlobs, double *blobSupport, Rectangle<int> *mobileBBox);
345 
346  void generateAlternativesForMobilePathFromInitialBlob(int length, int position, int value, int *alternativesCombo, int blobsToMergeNumber, int *blobsToMerge,
347  SpMobileObject mobile, Blob *initialBlob, int numUsed, bool *usedBlobs, Rectangle<int> *mobileBBox);
348 
349  bool equal2DDimensions(SpMobileObject m1, SpMobileObject m2);
350 
351  bool blobCanBeIncludedForMerge(int currentMergeLength, int *mergedBlobIndexes, int currentBlobIndex);
352 
353  void cleanByEnsureUsedBlobs(SpRMAlternativeSolution newAlternative);
354 
355  SpMobileObject checkSpecialCases(SpMobileObject currentMobile, Blob *blobToTest);
356 
357 };
358 
359 typedef QSharedPointer<ReliabilityTracker> SpReliabilityTracker;
360 
361 
362 #endif // RELIABILITYTRACKER_H
void computeInclusiveProbabilities(std::set< SpRMAlternativeSolution, alternativesOrderedByBestProbabilityOperator > *alternativeSolutions, int k, double sum, bool *mark, double *piT)
compute inclusive probabilities for a random linear elimination strategy
Definition: ReliabilityTracker.cpp:3335
void getMostLikelyMobileObjects(std::deque< SpMobileObject > &mobileObjectsOutput)
clears the current mobiles list and gives the processed list of most likely mobiles ...
Definition: ReliabilityTracker.cpp:31
Definition: ReliabilityMerge.h:65
void run(std::vector< Blob > &)
reliability tracker process main call
Definition: ReliabilityTracker.cpp:3356
double alternativeSolutionsProbabilityThreshold
alternative solutions probability threshold parameter for pre-elimination
Definition: ReliabilityTracker.h:33
Definition: calibration.h:51
Definition: ReliabilityClassification.h:37
Definition: ReliabilityTracker.h:14
Definition: ReliableMobileObjectList.h:11
Definition: TimeStamp.h:4
Definition: RMAlternativeSolution.h:24
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
ReliableMobileObjectList rMobilesList
pointer to the tracking results
Definition: ReliabilityTracker.h:74