""" motion_capture/filter.py Custom signal filter: convert pixel coordinates to millimetres. Usage in Signals → Channels pipeline: type: pixel_to_mm px_per_mm: pixels per millimetre Calibration: measure a known distance on-screen (e.g. a ruler in frame) and count how many pixels it spans. Divide pixels by mm → px_per_mm. """ from core.signal_processor import FilterBase class PixelToMMFilter(FilterBase): """ y = (x - zero_px) / px_per_mm Converts pixel position to millimetres. Optionally zero at a reference point (useful when origin matters more than absolute position). """ name = "pixel_to_mm" def __init__(self, px_per_mm: float = 10.0, zero_px: float = 0.0): self.params = {"px_per_mm": px_per_mm, "zero_px": zero_px} def __call__(self, value: float) -> float: return (value - self.params["zero_px"]) / max(self.params["px_per_mm"], 1e-9) def reset(self): pass