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