The core calibration was broken because the green quad corners didn't
correspond to the correct court corners (giving Z=15m camera positions).
New approach:
1. Detect white line segments on green court surface
2. Merge into distinct lines, find intersections
3. Match intersections to known court template using initial
homography from green quad (tries both left-right mirror mappings)
4. solvePnP with matched 2D-3D correspondences
5. Sanity check: camera Z must be 0-5m, prefers ~1m height
6. Fallback to quad-only calibration with both mappings if
not enough intersections detected
Also: CameraCalibrator now uses findHomography for N>4 points,
and get_half_court_intersections() provides the 6 template keypoints.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>