tl;dr: you need to capture the full resource image and then shrink it yourself
rpicam-still image quality regression on OV5647 — root cause and fix: Images captured with rpicam-still were noticeably softer than the old raspistill-based pipeline despite identical hardware. The cause was libcamera's sensor mode selection: the OV5647 only has one true native resolution (2592×1944); its other "modes" (640×480, 1296×972, 1920×1080) are binned/cropped sub-modes of that same sensor, not independent captures. When rpicam-still was asked for our working resolution (1296×972) directly, libcamera silently selected the corresponding binned mode, which degrades detail before the image is even demosaiced. The fix was to always capture at the sensor's full native mode (--mode 2592:1944:10:P) and downscale to the working resolution ourselves afterward using area-averaging resampling (cv2.INTER_AREA), rather than letting the ISP produce the smaller size directly. Combined with --denoise cdn_off and a modest `