TrackableObjectHistory.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. public class TrackingStateChangeEventArgs : EventArgs
  10. {
  11. public TrackingState NextState { get; private set; }
  12. public TrackingState PreviousState { get; private set; }
  13. public TrackingStateChangeEventArgs(TrackingState nextState, TrackingState previousState)
  14. {
  15. NextState = nextState;
  16. PreviousState = previousState;
  17. }
  18. }
  19. public delegate void TrackingStateChangedEventHandler(object sender, TrackingStateChangeEventArgs e);
  20. class TrackableObjectHistory<T> where T : TrackableObject
  21. {
  22. private static List<int> usedIDs = new List<int>();
  23. public int ID { get; private set; }
  24. public List<T> TrackedObjects { get; private set; }
  25. public List<TrackingState> States { get; private set; }
  26. public T LastObject { get; private set; }
  27. public T CurrentObject { get { return TrackedObjects[TrackedObjects.Count - 1]; } }
  28. public TrackingState CurrentState { get { return States[States.Count - 1]; } }
  29. public int NumFramesInCurrentState { get; private set; }
  30. private int numFramesDetectedUntilTracked;
  31. private int numFramesLostUntilDeleted;
  32. public event TrackingStateChangedEventHandler StateChanged;
  33. protected virtual void OnStateChanged(TrackingStateChangeEventArgs e) { if (StateChanged != null) StateChanged(this, e); }
  34. public TrackableObjectHistory(int numFramesDetectedUntilTracked, int numFramesLostUntilDeleted)
  35. {
  36. ID = getNextUnusedID();
  37. TrackedObjects = new List<T>();
  38. TrackedObjects.Add(null);
  39. States = new List<TrackingState>();
  40. States.Add(TrackingState.None);
  41. NumFramesInCurrentState = 1;
  42. this.numFramesDetectedUntilTracked = numFramesDetectedUntilTracked;
  43. this.numFramesLostUntilDeleted = numFramesLostUntilDeleted;
  44. }
  45. ~TrackableObjectHistory()
  46. {
  47. setIDUnused(ID);
  48. }
  49. public void addObjectToHistory(T detectedObject)
  50. {
  51. TrackingState previousState = CurrentState;
  52. TrackingState newState = TrackingState.None;
  53. //get newState
  54. if (detectedObject != null)
  55. {
  56. if (previousState == TrackingState.None)
  57. newState = TrackingState.Detected;
  58. else if (previousState == TrackingState.Lost)
  59. newState = TrackingState.Tracked;
  60. else if (previousState == TrackingState.Tracked)
  61. newState = TrackingState.Tracked;
  62. else if (previousState == TrackingState.Detected)
  63. {
  64. if (NumFramesInCurrentState == numFramesDetectedUntilTracked)
  65. newState = TrackingState.Tracked;
  66. else
  67. newState = TrackingState.Detected;
  68. }
  69. }
  70. else if (previousState == TrackingState.Lost && NumFramesInCurrentState == numFramesLostUntilDeleted)
  71. newState = TrackingState.Delete;
  72. else
  73. newState = TrackingState.Lost;
  74. //update numFramesInCurrentState
  75. if (newState == previousState)
  76. NumFramesInCurrentState++;
  77. else
  78. NumFramesInCurrentState = 1;
  79. //update lastObject
  80. if (detectedObject != null)
  81. {
  82. LastObject = detectedObject;
  83. detectedObject.setTrackID(ID);
  84. }
  85. TrackedObjects.Add(detectedObject);
  86. States.Add(newState);
  87. OnStateChanged(new TrackingStateChangeEventArgs(newState, previousState));
  88. }
  89. public static int getNextUnusedID()
  90. {
  91. int id = 1;
  92. while (usedIDs.Contains(id))
  93. id++;
  94. usedIDs.Add(id);
  95. return id;
  96. }
  97. public static void setIDUnused(int id)
  98. {
  99. usedIDs.Remove(id);
  100. }
  101. }
  102. }