Tracker.cs 4.2 KB

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