TrackableObjectHistory.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. class TrackableObjectHistory<T> where T : TrackableObject
  9. {
  10. private static List<int> usedIDs = new List<int>();
  11. public int ID { get; private set; }
  12. public List<T> TrackedObjects { get; private set; }
  13. public List<TrackingState> States { get; private set; }
  14. public TrackableObject LastObject { get; private set; }
  15. public TrackableObject CurrentObject { get { return TrackedObjects[TrackedObjects.Count - 1]; } }
  16. public TrackingState CurrentState { get { return States[States.Count - 1]; } }
  17. public int NumFramesInCurrentState { get; private set; }
  18. private int numFramesUntilTracked;
  19. public TrackableObjectHistory(int numFramesUntilTracked) {
  20. ID = getNextUnusedID();
  21. TrackedObjects = new List<T>();
  22. States = new List<TrackingState>();
  23. TrackedObjects.Add(null);
  24. States.Add(TrackingState.None);
  25. NumFramesInCurrentState = 1;
  26. this.numFramesUntilTracked = numFramesUntilTracked;
  27. }
  28. ~TrackableObjectHistory() {
  29. setIDUnused(ID);
  30. }
  31. public void addObjectToHistory(T detectedObject) {
  32. TrackingState previousState = CurrentState;
  33. TrackingState newState = TrackingState.None;
  34. if (detectedObject != null)
  35. {
  36. if (previousState == TrackingState.Tracked)
  37. newState = TrackingState.Tracked;
  38. else if (previousState == TrackingState.Detected)
  39. {
  40. if (NumFramesInCurrentState == numFramesUntilTracked)
  41. newState = TrackingState.Tracked;
  42. else
  43. newState = TrackingState.Detected;
  44. }
  45. LastObject = detectedObject;
  46. detectedObject.setTracked(ID);
  47. }
  48. else
  49. newState = TrackingState.Lost;
  50. if (newState == previousState)
  51. NumFramesInCurrentState++;
  52. TrackedObjects.Add(detectedObject);
  53. States.Add(newState);
  54. }
  55. public static int getNextUnusedID()
  56. {
  57. int id = 1;
  58. while (usedIDs.Contains(id))
  59. id++;
  60. usedIDs.Add(id);
  61. return id;
  62. }
  63. public static void setIDUnused(int id)
  64. {
  65. usedIDs.Remove(id);
  66. }
  67. }
  68. }