Spaces:
Sleeping
Sleeping
File size: 1,645 Bytes
d2ada6d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | """Utility functions for the tracking pipeline."""
import hashlib
import logging
import cv2
import numpy as np
from pathlib import Path
from typing import Tuple
def get_color_for_id(track_id: int) -> Tuple[int, int, int]:
"""Generate a deterministic, visually distinct BGR color for a track ID."""
hash_bytes = hashlib.md5(str(track_id).encode()).digest()
# Use first 3 bytes, ensure brightness > 100 for visibility
r = 100 + hash_bytes[0] % 156
g = 100 + hash_bytes[1] % 156
b = 100 + hash_bytes[2] % 156
return (b, g, r) # BGR for OpenCV
def frame_to_time(frame_idx: int, fps: float) -> str:
"""Convert frame index to MM:SS.ms timestamp."""
total_seconds = frame_idx / fps
minutes = int(total_seconds // 60)
seconds = total_seconds % 60
return f"{minutes:02d}:{seconds:05.2f}"
def save_screenshot(frame: np.ndarray, frame_idx: int, output_dir: str):
"""Save a frame as a screenshot PNG."""
output_path = Path(output_dir)
output_path.mkdir(parents=True, exist_ok=True)
filepath = output_path / f"frame_{frame_idx:06d}.png"
cv2.imwrite(str(filepath), frame)
return str(filepath)
def setup_logging(level: int = logging.INFO) -> logging.Logger:
"""Configure pipeline logging."""
logger = logging.getLogger("tracking_pipeline")
if not logger.handlers:
handler = logging.StreamHandler()
formatter = logging.Formatter(
"%(asctime)s | %(levelname)-7s | %(message)s",
datefmt="%H:%M:%S",
)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(level)
return logger
|