Skip to content

Commit b4f0709

Browse files
Expose session.tracks for DISTANCE kinematics on VideoTrackingSession.
Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent bb5f325 commit b4f0709

1 file changed

Lines changed: 19 additions & 0 deletions

File tree

sports/common/video_tracking.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@
1818
gap_fill_speed_transforms,
1919
replay_gated_transforms,
2020
)
21+
from sports.common.kinematics import (
22+
PlayerTrack,
23+
collect_tracks,
24+
compute_kinematics,
25+
)
2126
from sports.common.goalkeeper import apply_goalkeeper_teams, derive_gk_locks
2227
from sports.common.team import (
2328
TeamLocks,
@@ -64,6 +69,7 @@ class VideoTrackingSession:
6469
_speed_transforms: dict | None = field(default=None, repr=False)
6570
_gap_filled_transforms: dict | None = field(default=None, repr=False)
6671
_minimap_transforms: dict | None = field(default=None, repr=False)
72+
_tracks: dict[int, PlayerTrack] | None = field(default=None, repr=False)
6773

6874
def team_locks(self) -> TeamLocks:
6975
"""Return clip-level team locks, cached."""
@@ -112,6 +118,19 @@ def minimap_transforms_by_frame(self) -> dict:
112118
self._minimap_transforms = build_minimap_transform_map(self.kp_by_frame)
113119
return self._minimap_transforms
114120

121+
@property
122+
def tracks(self) -> dict[int, PlayerTrack]:
123+
"""Per-track cumulative distance from gated homography (not gap-filled)."""
124+
if self._tracks is None:
125+
raw = collect_tracks(self.iter_tracked())
126+
self._tracks = compute_kinematics(
127+
raw,
128+
self.fps,
129+
mode="homography",
130+
frame_transforms=self._gated_speed_transforms(),
131+
)
132+
return self._tracks
133+
115134
def iter_tracked(self):
116135
"""Yield frame_idx and tracked detections with blocked ids removed."""
117136
for frame_idx, dets in self.frames:

0 commit comments

Comments
 (0)