TrackableObjectHistory.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using bbiwarg.Utility;
  7. namespace bbiwarg.Recognition.Tracking
  8. {
  9. class TrackableObjectHistory<T> where T : TrackableObject
  10. {
  11. private static List<int> usedIDs = new List<int>();
  12. public int ID { get; private set; }
  13. public List<T> TrackedObjects { get; private set; }
  14. public List<TrackingState> States { get; private set; }
  15. public TrackableObject LastObject { get; private set; }
  16. public TrackableObject CurrentObject { get { return TrackedObjects[TrackedObjects.Count - 1]; } }
  17. public TrackingState CurrentState { get { return States[States.Count - 1]; } }
  18. public int NumFramesInCurrentState { get; private set; }
  19. private String className;
  20. private LogSubject logSubject;
  21. private int numFramesUntilTracked;
  22. public TrackableObjectHistory(LogSubject logSubject, int numFramesUntilTracked)
  23. {
  24. ID = getNextUnusedID();
  25. TrackedObjects = new List<T>();
  26. States = new List<TrackingState>();
  27. TrackedObjects.Add(null);
  28. States.Add(TrackingState.None);
  29. NumFramesInCurrentState = 1;
  30. this.className = typeof(T).Name;
  31. this.logSubject = logSubject;
  32. this.numFramesUntilTracked = numFramesUntilTracked;
  33. }
  34. ~TrackableObjectHistory()
  35. {
  36. setIDUnused(ID);
  37. }
  38. public void addObjectToHistory(T detectedObject)
  39. {
  40. TrackingState previousState = CurrentState;
  41. TrackingState newState = TrackingState.None;
  42. if (detectedObject != null)
  43. {
  44. if (previousState == TrackingState.None)
  45. {
  46. newState = TrackingState.Detected;
  47. Logger.log(className + " #" + ID + " detected", logSubject);
  48. }
  49. else if (previousState == TrackingState.Lost)
  50. {
  51. newState = TrackingState.Tracked;
  52. Logger.log(className + " #" + ID.ToString() + " re-tracked", logSubject);
  53. }
  54. else if (previousState == TrackingState.Tracked)
  55. newState = TrackingState.Tracked;
  56. else if (previousState == TrackingState.Detected)
  57. {
  58. if (NumFramesInCurrentState == numFramesUntilTracked)
  59. {
  60. newState = TrackingState.Tracked;
  61. Logger.log(className + " #" + ID.ToString() + " tracked", logSubject);
  62. }
  63. else
  64. newState = TrackingState.Detected;
  65. }
  66. LastObject = detectedObject;
  67. detectedObject.setTracked(ID);
  68. }
  69. else
  70. newState = TrackingState.Lost;
  71. if (newState == previousState)
  72. NumFramesInCurrentState++;
  73. TrackedObjects.Add(detectedObject);
  74. States.Add(newState);
  75. }
  76. public static int getNextUnusedID()
  77. {
  78. int id = 1;
  79. while (usedIDs.Contains(id))
  80. id++;
  81. usedIDs.Add(id);
  82. return id;
  83. }
  84. public static void setIDUnused(int id)
  85. {
  86. usedIDs.Remove(id);
  87. }
  88. }
  89. }