From 36f4becbe9e798eb8f268440425e5e5e40938240 Mon Sep 17 00:00:00 2001 From: Peter Woolery Date: Tue, 14 Apr 2026 09:30:20 -0700 Subject: [PATCH] =?UTF-8?q?fix:=20camera=20downscale=20=E2=80=94=20centere?= =?UTF-8?q?d=20crop,=20explicit=20PSRAM=20frame=20buffer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- firmware/src/camera.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/firmware/src/camera.cpp b/firmware/src/camera.cpp index 7a5d5ba..095e30b 100644 --- a/firmware/src/camera.cpp +++ b/firmware/src/camera.cpp @@ -25,7 +25,8 @@ bool camera_init() { camera_config_t cfg = {}; - cfg.ledc_channel = LEDC_CHANNEL_0; + cfg.fb_location = CAMERA_FB_IN_PSRAM; + cfg.ledc_channel = LEDC_CHANNEL_0; cfg.ledc_timer = LEDC_TIMER_0; cfg.pin_d0 = CAM_PIN_D0; cfg.pin_d1 = CAM_PIN_D1; @@ -62,21 +63,22 @@ bool camera_init() { return true; } -// Box-filter downscale from QVGA (320x240) to 96x96 grayscale +// Box-filter downscale to CV_W x CV_H. +// Input region: center-cropped to (CV_W*bx) x (CV_H*by) before downscaling. +// For QVGA (320x240) → 96x96: bx=3, by=2, crops to 288x192, offset x=16 y=24. static void downscale(const uint8_t* src, int src_w, int src_h, uint8_t* dst) { - int bx = src_w / CV_W; - int by = src_h / CV_H; + int bx = src_w / CV_W; // 3 for QVGA + int by = src_h / CV_H; // 2 for QVGA + // Center the crop region + int x_off = (src_w - CV_W * bx) / 2; // 16 for QVGA + int y_off = (src_h - CV_H * by) / 2; // 24 for QVGA for (int dy = 0; dy < CV_H; dy++) { for (int dx = 0; dx < CV_W; dx++) { - int sum = 0, cnt = 0; + int sum = 0; for (int ky = 0; ky < by; ky++) - for (int kx = 0; kx < bx; kx++) { - int sx = dx * bx + kx; - int sy = dy * by + ky; - sum += src[sy * src_w + sx]; - cnt++; - } - dst[dy * CV_W + dx] = (uint8_t)(sum / cnt); + for (int kx = 0; kx < bx; kx++) + sum += src[(y_off + dy*by + ky)*src_w + (x_off + dx*bx + kx)]; + dst[dy*CV_W + dx] = (uint8_t)(sum / (bx * by)); } } }