Tracker.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using bbiwarg.Graphics;
  7. using bbiwarg.Utility;
  8. namespace bbiwarg.Recognition.Tracking
  9. {
  10. public enum TrackingState
  11. {
  12. None,
  13. Detected,
  14. Tracked,
  15. Lost,
  16. }
  17. struct SimilarityContainer<T> where T : TrackableObject
  18. {
  19. public float similarity;
  20. public TrackableObjectHistory<T> history;
  21. public T detectedObject;
  22. }
  23. class Tracker<T> where T : TrackableObject
  24. {
  25. public List<TrackableObjectHistory<T>> Histories { get; private set; }
  26. public List<T> TrackedObjects { get; private set; }
  27. private List<SimilarityContainer<T>> similarities;
  28. private String className;
  29. private Logger.LogSubject logSubject;
  30. private int numFramesUntilTracked;
  31. private int numFramesUntilLost;
  32. private float minSimilarityForTracking;
  33. public Tracker(Logger.LogSubject logSubject, int numFramesUntilTracked, int numFramesUntilLost, float minSimilarityForTracking)
  34. {
  35. this.className = typeof(T).Name;
  36. this.logSubject = logSubject;
  37. this.numFramesUntilTracked = numFramesUntilTracked;
  38. this.numFramesUntilLost = numFramesUntilLost;
  39. this.minSimilarityForTracking = minSimilarityForTracking;
  40. reset();
  41. }
  42. public void reset()
  43. {
  44. Histories = new List<TrackableObjectHistory<T>>();
  45. TrackedObjects = new List<T>();
  46. }
  47. public void updateFrame(List<T> detectedObjects)
  48. {
  49. if (Histories.Count == 0)
  50. {
  51. foreach (T detectedObject in detectedObjects)
  52. {
  53. TrackableObjectHistory<T> history = new TrackableObjectHistory<T>(numFramesUntilTracked);
  54. history.addObjectToHistory(detectedObject);
  55. addToHistories(history);
  56. }
  57. }
  58. else
  59. {
  60. updateHistories(detectedObjects);
  61. removeLongLostObjects();
  62. }
  63. }
  64. private void updateHistories(List<T> detectedObjects)
  65. {
  66. TrackedObjects = new List<T>();
  67. List<TrackableObjectHistory<T>> unasignedHistories = new List<TrackableObjectHistory<T>>();
  68. foreach (TrackableObjectHistory<T> history in Histories)
  69. unasignedHistories.Add(history);
  70. List<TrackableObject> unasignedDetectedObjects = new List<TrackableObject>();
  71. foreach (T detectedObject in detectedObjects)
  72. unasignedDetectedObjects.Add(detectedObject);
  73. //asign previously tracked objects to their best fits of detectedObjects
  74. createSimilarities(detectedObjects);
  75. while (similarities.Count > 0)
  76. {
  77. SimilarityContainer<T> maxSimilarity = similarities[0];
  78. TrackableObjectHistory<T> history = maxSimilarity.history;
  79. T detectedObject = maxSimilarity.detectedObject;
  80. history.addObjectToHistory(detectedObject);
  81. TrackedObjects.Add(detectedObject);
  82. unasignedHistories.Remove(history);
  83. unasignedDetectedObjects.Remove(detectedObject);
  84. removeConcurringSimilarities(maxSimilarity);
  85. }
  86. //add new history for each new unasigned detectedObject
  87. foreach (T unasignedDetectedObject in unasignedDetectedObjects)
  88. {
  89. TrackableObjectHistory<T> newHistory = new TrackableObjectHistory<T>(numFramesUntilTracked);
  90. newHistory.addObjectToHistory(unasignedDetectedObject);
  91. addToHistories(newHistory);
  92. }
  93. //add null-object to each unasigned history (didn't find a best fit during this frame -> lost track)
  94. foreach (TrackableObjectHistory<T> unasignedHistory in unasignedHistories)
  95. {
  96. if (unasignedHistory.CurrentState != TrackingState.Lost)
  97. Logger.log(className + " #" + unasignedHistory.ID + " lost", logSubject);
  98. unasignedHistory.addObjectToHistory(null);
  99. }
  100. }
  101. private void createSimilarities(List<T> detectedObjects)
  102. {
  103. similarities = new List<SimilarityContainer<T>>();
  104. foreach (TrackableObjectHistory<T> history in Histories)
  105. {
  106. foreach (T detectedObject in detectedObjects)
  107. {
  108. float similarity = detectedObject.getSimilarity(history.LastObject);
  109. if (similarity > minSimilarityForTracking)
  110. {
  111. SimilarityContainer<T> similarityContainer = new SimilarityContainer<T>();
  112. similarityContainer.similarity = similarity;
  113. similarityContainer.history = history;
  114. similarityContainer.detectedObject = detectedObject;
  115. similarities.Add(similarityContainer);
  116. }
  117. }
  118. }
  119. // sort depending on similarity-value
  120. similarities.Sort((fs1, fs2) => fs2.similarity.CompareTo(fs1.similarity));
  121. }
  122. private void removeConcurringSimilarities(SimilarityContainer<T> removeSimilarity)
  123. {
  124. for (int i = similarities.Count - 1; i >= 0; i--)
  125. {
  126. SimilarityContainer<T> similarity = similarities[i];
  127. if (similarity.history == removeSimilarity.history || similarity.detectedObject == removeSimilarity.detectedObject)
  128. similarities.RemoveAt(i);
  129. }
  130. }
  131. private void removeLongLostObjects()
  132. {
  133. for (int i = Histories.Count - 1; i >= 0; i--)
  134. {
  135. TrackableObjectHistory<T> history = Histories[i];
  136. if (history.CurrentState == TrackingState.Lost && history.NumFramesInCurrentState >= numFramesUntilLost)
  137. {
  138. Histories.RemoveAt(i);
  139. Logger.log(className + " #" + history.ID + " deleted", logSubject);
  140. }
  141. }
  142. }
  143. private void addToHistories(TrackableObjectHistory<T> history)
  144. {
  145. Histories.Add(history);
  146. Logger.log(className + " #" + history.ID + " detected", logSubject);
  147. }
  148. }
  149. }