TrackedObject.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. public enum TrackingState
  9. {
  10. Undefined = 0,
  11. Detected = 1,
  12. Tracked = 2,
  13. Lost = 3,
  14. Deleted = 4
  15. }
  16. public abstract class TrackedObject<T> where T : TrackableObject
  17. {
  18. private int numFramesDetectedUntilTracked;
  19. private int numFramesLostUntilDeleted;
  20. private bool wasTrackedBefore;
  21. public int ID { get; private set; }
  22. public List<T> DetectedObjects;
  23. public T CurrentObject { get { return DetectedObjects[DetectedObjects.Count - 1]; } }
  24. public List<TrackingState> States;
  25. public TrackingState CurrentState { get { return States[States.Count - 1]; } }
  26. public int NumFramesInCurrentState { get; private set; }
  27. public TrackedObject(int id, T detectedObject, int numFramesDetectedUntilTracked, int numFramesLostUntilDeleted)
  28. {
  29. ID = id;
  30. this.numFramesDetectedUntilTracked = numFramesDetectedUntilTracked;
  31. this.numFramesLostUntilDeleted = numFramesLostUntilDeleted;
  32. wasTrackedBefore = false;
  33. DetectedObjects = new List<T>();
  34. States = new List<TrackingState>();
  35. DetectedObjects.Add(detectedObject);
  36. States.Add(TrackingState.Detected);
  37. NumFramesInCurrentState = 1;
  38. }
  39. public abstract float calculateSimilarity(T detectedObject);
  40. public virtual void updateFrame(T detectedObject)
  41. {
  42. if (detectedObject != null)
  43. detectedObject.setTracked(ID);
  44. TrackingState previousState = CurrentState;
  45. TrackingState newState = getNewState(detectedObject);
  46. if (!wasTrackedBefore && newState == TrackingState.Tracked)
  47. wasTrackedBefore = true;
  48. DetectedObjects.Add(detectedObject);
  49. States.Add(newState);
  50. if (previousState == newState)
  51. NumFramesInCurrentState++;
  52. else
  53. NumFramesInCurrentState = 1;
  54. }
  55. private TrackingState getNewState(T detectedObject)
  56. {
  57. TrackingState previousState = CurrentState;
  58. TrackingState newState = TrackingState.Undefined;
  59. if (detectedObject != null)
  60. {
  61. switch (previousState)
  62. {
  63. case TrackingState.Lost:
  64. if (wasTrackedBefore)
  65. newState = TrackingState.Tracked;
  66. else
  67. newState = TrackingState.Detected;
  68. break;
  69. case TrackingState.Tracked:
  70. newState = TrackingState.Tracked;
  71. break;
  72. case TrackingState.Detected:
  73. if (NumFramesInCurrentState >= numFramesDetectedUntilTracked)
  74. newState = TrackingState.Tracked;
  75. else
  76. newState = TrackingState.Detected;
  77. break;
  78. }
  79. }
  80. else if (previousState == TrackingState.Lost && NumFramesInCurrentState >= numFramesLostUntilDeleted)
  81. newState = TrackingState.Deleted;
  82. else
  83. newState = TrackingState.Lost;
  84. return newState;
  85. }
  86. }
  87. }