Tracker.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace bbiwarg.Recognition.Tracking
  7. {
  8. abstract class Tracker<T, TrackedT>
  9. where T : TrackableObject
  10. where TrackedT : TrackedObject<T>
  11. {
  12. private float minSimilarity;
  13. private List<Similarity<T, TrackedT>> similarities;
  14. protected TrackIDPool idPool;
  15. public List<TrackedT> TrackedObjects;
  16. public Tracker(float minSimilarity)
  17. {
  18. this.minSimilarity = minSimilarity;
  19. reset();
  20. }
  21. public void reset()
  22. {
  23. idPool = new TrackIDPool();
  24. TrackedObjects = new List<TrackedT>();
  25. }
  26. public void updateFrame(List<T> detectedObjects)
  27. {
  28. if (TrackedObjects.Count == 0)
  29. {
  30. addNewTrackedObjects(detectedObjects);
  31. }
  32. else
  33. {
  34. updateTrackedObjects(detectedObjects);
  35. removeDeletableTrackedObjects();
  36. }
  37. }
  38. public void updateTrackedObjects(List<T> detectedObjects)
  39. {
  40. List<TrackedT> unasignedTrackedObjects = new List<TrackedT>(TrackedObjects);
  41. List<T> unasignedDetectedObjects = new List<T>(detectedObjects);
  42. createSimilarities(detectedObjects);
  43. while (similarities.Count > 0) {
  44. Similarity<T, TrackedT> maxSimilarity = similarities[0];
  45. maxSimilarity.TrackedObject.updateFrame(maxSimilarity.DetectedObject);
  46. unasignedDetectedObjects.Remove(maxSimilarity.DetectedObject);
  47. unasignedTrackedObjects.Remove(maxSimilarity.TrackedObject);
  48. removeConcurringSimilarities(maxSimilarity);
  49. }
  50. addNewTrackedObjects(unasignedDetectedObjects);
  51. foreach (TrackedT trackedObject in unasignedTrackedObjects) {
  52. trackedObject.updateFrame(null);
  53. }
  54. }
  55. private void addNewTrackedObjects(List<T> detectedObjects)
  56. {
  57. foreach (T detectedObject in detectedObjects)
  58. {
  59. TrackedT trackedObject = createTrackedObject(detectedObject);
  60. TrackedObjects.Add(trackedObject);
  61. }
  62. }
  63. private void createSimilarities(List<T> detectedObjects) {
  64. similarities = new List<Similarity<T, TrackedT>>();
  65. foreach (TrackedT trackedObject in TrackedObjects) {
  66. foreach (T detectedObject in detectedObjects) {
  67. float similarityValue = trackedObject.calculateSimilarity(detectedObject);
  68. Similarity<T, TrackedT> similarity = new Similarity<T,TrackedT>(trackedObject, detectedObject, similarityValue);
  69. if (similarity.Value > minSimilarity)
  70. similarities.Add(similarity);
  71. }
  72. }
  73. // sort depending on similarity-value
  74. similarities.Sort((s1, s2) => s2.Value.CompareTo(s1.Value));
  75. }
  76. private void removeConcurringSimilarities(Similarity<T, TrackedT> similarity) {
  77. for (int i = similarities.Count - 1; i >= 0; i--) {
  78. Similarity<T, TrackedT> s = similarities[i];
  79. if (s.TrackedObject == similarity.TrackedObject || s.DetectedObject == similarity.DetectedObject)
  80. similarities.RemoveAt(i);
  81. }
  82. }
  83. private void removeDeletableTrackedObjects() {
  84. for (int i = TrackedObjects.Count - 1; i >= 0; i--) {
  85. TrackedT trackedObject = TrackedObjects[i];
  86. if (trackedObject.CurrentState == TrackingState.Deleted) {
  87. idPool.setIDUnused(trackedObject.ID);
  88. TrackedObjects.RemoveAt(i);
  89. }
  90. }
  91. }
  92. protected List<T> getCurrentObjectsWithState(TrackingState state) {
  93. List<T> objects = new List<T>();
  94. foreach (TrackedT trackedObject in TrackedObjects) {
  95. if (trackedObject.CurrentState == state)
  96. objects.Add(trackedObject.CurrentObject);
  97. }
  98. return objects;
  99. }
  100. protected abstract TrackedT createTrackedObject(T detectedObject);
  101. }
  102. }