12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace bbiwarg.Recognition.FingerRecognition
- {
- public enum TrackingState
- {
- None,
- Detected,
- Tracked,
- Lost,
- }
- class FingerHistory
- {
- private static List<int> usedIDs = new List<int>();
- public int ID { get; private set; }
- public List<Finger> Fingers { get; private set; }
- public List<TrackingState> States { get; private set; }
- public Finger LastFinger { get; private set; }
- public Finger CurrentFinger { get { return Fingers[Fingers.Count - 1]; } }
- public TrackingState CurrentState { get { return States[States.Count - 1]; } }
- public FingerHistory(Finger finger)
- {
- ID = FingerHistory.getNextUnusedID();
- Fingers = new List<Finger>();
- States = new List<TrackingState>();
- Fingers.Add(finger);
- States.Add(TrackingState.Detected);
- LastFinger = finger;
- }
- ~FingerHistory() {
- FingerHistory.setIDUnused(ID);
- }
- public void addFinger(Finger finger)
- {
- TrackingState previousState = CurrentState;
- TrackingState newState = TrackingState.None;
- int numFramesInCurrentState = getNumFramesInCurrentState();
- if (finger == null)
- newState = TrackingState.Lost;
- else if (previousState == TrackingState.Tracked)
- newState = TrackingState.Tracked;
- else if (previousState == TrackingState.Detected)
- {
- if (numFramesInCurrentState == Constants.FingerNumFramesUntilTracked)
- newState = TrackingState.Tracked;
- else
- newState = TrackingState.Detected;
- }
- Fingers.Add(finger);
- States.Add(newState);
- if (finger != null)
- LastFinger = finger;
- }
- public int getNumFramesInCurrentState()
- {
- TrackingState currentState = CurrentState;
- int count = 0;
- for (int i = States.Count - 1; i >= 0; i--)
- {
- if (States[i] == currentState)
- count++;
- else
- break;
- }
- return count;
- }
- public static int getNextUnusedID() {
- int id = 1;
- while (usedIDs.Contains(id))
- id++;
- usedIDs.Add(id);
- return id;
- }
- public static void setIDUnused(int id) {
- usedIDs.Remove(id);
- }
- }
- }
|