Ashutosh Naveen
Deploy to Hugging Face Spaces: Multi-Object Tracking Pipeline
d2ada6d
Raw
History Blame Contribute Delete
1.65 kB
"""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