deps: swap opencv-python → opencv-python-headless
PyAV and opencv-python both bundle libavdevice.*.dylib at different
major versions (61.3.100 vs 62.1.100) on macOS. Both load into the same
process, producing `objc[...]: Class AVFrameReceiver is implemented in
both ... .dylib` warning spam on every CLI invocation (observed on
`sol --help`) and a latent crash risk.
opencv-python-headless drops the ffmpeg/libav bundle and retains all
the image operations this codebase uses. Grep confirmed zero
VideoCapture / VideoWriter / imshow usage — cv2 is aruco + cvtColor +
imwrite only.
Verified: cv2.aruco.getPredefinedDictionary works, test_aruco.py passes
(12/12), `sol --help` clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>