# Pickle Vision Real-time referee system for pickleball with 2 CSI cameras on Jetson. ## Current Product Scope Three tabs in the web UI: 1. `Camera` - live feeds from both cameras. 2. `Calibration` - step-by-step court calibration flow (ROI -> lines -> intersections -> template match -> camera pose). 3. `Trajectory` - 3D court + ball trajectory + VAR overlay. Dagster pipeline has been removed from active project runtime. ## Run ### Local (Jetson) ```bash python3 jetson/main.py --port 8080 ``` Open: `http://:8080` ### Docker ```bash docker-compose up --build ``` Open: `http://localhost:8080` ## Calibration Flow Calibration is launched from the `Calibration` tab with `Run Calibration Flow`. Per camera, UI shows each step status: 1. Court ROI (green mask) 2. White line segments detection 3. Segment merge into court lines 4. Line intersections 5. Template point match 6. Camera pose solve (PnP) 7. Geometry overlay Output is stored in: - `jetson/config/cam0_calibration.json` - `jetson/config/cam1_calibration.json` ## Main Runtime Files - `jetson/main.py` - dual-camera loop, calibration, detection, VAR events - `src/web/app.py` - Flask API + tab endpoints - `src/web/templates/index.html` - 3-tab UI - `src/calibration/camera_calibrator.py` - camera geometry / projection - `src/physics/trajectory.py` - trajectory model - `src/physics/event_detector.py` - close-call logic ## Dependencies Install from `requirements.txt`. ```bash pip install -r requirements.txt ``` ## Notes - Calibration is required before trajectory/VAR logic becomes fully useful. - Each camera is calibrated independently against known half-court geometry.