- Blue = cam0 only, Pink = cam1 only, Purple = overlap
- Grid-based fill, no dashed lines or edge artifacts
- White court lines on top
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Camera FOV coverage fills court with visible color (opacity 0.4)
- All court lines now white (no more red/grey)
- Lines raised above coverage so they stay visible
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- FOV clipped to court boundaries (0,0)-(13.4,6.1)
- Colored overlay shows which court areas each camera covers
- Dashed center line shows each camera's look direction
- cam0 (blue) -28° from +Y, cam1 (pink) +28° from +Y
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Court and Trajectory tabs: 3D viewport full screen, cameras small
at bottom center as horizontal thumbnails
- Fix net orientation (was perpendicular, now spans court width)
- Default camera: center line, 1m from net, 1m height
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Cameras now display as a horizontal panorama (cam1 left, cam0 right)
on Detection, Court, and Trajectory tabs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- src/calibration: 3D camera calibration (solvePnP, homography)
- src/physics: trajectory model with gravity/drag, close call event detector
- src/streaming: camera reader + ring buffer for VAR clips
- src/web: Flask app with 3-tab UI (Detection, Court, Trajectory) + Three.js
- jetson/main.py: unified entry point wiring all components
Court tab: one-click calibration button, 3D scene with camera positions
Trajectory tab: accumulated ball path, VAR panel with snapshot + timer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
GStreamer hardware ISP capture, YOLOv8n CUDA inference,
JPEG snapshot-based web UI for both cameras simultaneously.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>