| | |
| |
|
| | from collections import OrderedDict |
| |
|
| | import numpy as np |
| |
|
| |
|
| | class TrackState: |
| | """Enumeration of possible object tracking states.""" |
| |
|
| | New = 0 |
| | Tracked = 1 |
| | Lost = 2 |
| | Removed = 3 |
| |
|
| |
|
| | class BaseTrack: |
| | """Base class for object tracking, handling basic track attributes and operations.""" |
| |
|
| | _count = 0 |
| |
|
| | track_id = 0 |
| | is_activated = False |
| | state = TrackState.New |
| |
|
| | history = OrderedDict() |
| | features = [] |
| | curr_feature = None |
| | score = 0 |
| | start_frame = 0 |
| | frame_id = 0 |
| | time_since_update = 0 |
| |
|
| | |
| | location = (np.inf, np.inf) |
| |
|
| | @property |
| | def end_frame(self): |
| | """Return the last frame ID of the track.""" |
| | return self.frame_id |
| |
|
| | @staticmethod |
| | def next_id(): |
| | """Increment and return the global track ID counter.""" |
| | BaseTrack._count += 1 |
| | return BaseTrack._count |
| |
|
| | def activate(self, *args): |
| | """Activate the track with the provided arguments.""" |
| | raise NotImplementedError |
| |
|
| | def predict(self): |
| | """Predict the next state of the track.""" |
| | raise NotImplementedError |
| |
|
| | def update(self, *args, **kwargs): |
| | """Update the track with new observations.""" |
| | raise NotImplementedError |
| |
|
| | def mark_lost(self): |
| | """Mark the track as lost.""" |
| | self.state = TrackState.Lost |
| |
|
| | def mark_removed(self): |
| | """Mark the track as removed.""" |
| | self.state = TrackState.Removed |
| |
|
| | @staticmethod |
| | def reset_id(): |
| | """Reset the global track ID counter.""" |
| | BaseTrack._count = 0 |
| |
|