资讯动态

esp-iot-solution Camera Basic 例程实战:ESP32/ESP32-S2/ESP32-S3 摄像头初始化与取帧全解析

发布时间:2026/9/19 21:24:31 来源:尧图企业网站定制
物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载导读本文围绕 esp-iot-solution 仓库中的 Camera Basic 示例 展开该例程演示了如何基于 esp32-camera 驱动完成摄像头传感器的初始化并通过帧缓冲frame buffer机制持续获取图像数据。读完本文你将掌握摄像头引脚配置方法、camera_config_t核心参数的含义与取舍、esp_camera_fb_get()/esp_camera_fb_return()的取帧闭环以及如何在 ESP32、ESP32-S2、ESP32-S3 三款芯片上跑通一个最简可用的拍照例程。Camera Basic 例程概览examples/camera/basic是整个 camera 例程目录 中最基础的一个它的目标非常单一初始化摄像头传感器然后持续获取传感器采集到的图像数据。官方支持目标芯片如下Supported TargetsESP32ESP32-S2ESP32-S3例程目录结构非常精简核心文件为examples/camera/basic/ ├── CMakeLists.txt # 项目入口project(camera_basic_example) ├── README.md # 例程说明本文主体 ├── sdkconfig.defaults # 默认构建配置240MHz / QIO / PSRAM ├── sdkconfig.ci # CI 专用配置关闭 SPIRAM └── main/ ├── CMakeLists.txt ├── idf_component.yml # 组件依赖声明 └── take_picture.c # 例程全部业务逻辑其中 main/idf_component.yml 声明了三项关键依赖dependencies: idf: 4.4.1 camera: version: * override_path: ../../../common_components/camera esp32-camera: version: 2.0.3也就是说该例程依赖 ESP-IDF 4.4.1 及以上版本、社区维护的esp32-camera驱动≥2.0.3以及本仓库自带的 common_components/camera 组件——后者专门提供摄像头引脚的定义与 Kconfig 配置项。注意根据 examples/camera/README.md 的说明ESP32 与 ESP32-S2 只能配合 esp32-camera 组件使用ESP32-S3 与 ESP32-P4 则推荐使用 esp-video 组件。本文 Basic 例程面向的是前三款芯片的 esp32-camera 路径。摄像头驱动工作流程在深入代码之前先理解 esp32-camera 的整体数据流。摄像头传感器通过 DVP并行数字视频端口接口把数据传输到 ESP32初始化时驱动会分配若干frame_buffer用于暂存传感器传来的图像初始化完成后摄像头立即开始工作应用层调用esp_camera_fb_get()获取一帧图像数据处理完毕后调用esp_camera_fb_return()把帧缓冲归还给驱动以便复用。这一闭环正是 Basic 例程的核心逻辑。硬件准备例程对硬件的要求非常简单一块带有摄像头模块的开发板例如ESP-EYE、ESP32-S2-Kaluga-1、ESP32-S3-EYE等一根用于供电和烧录的USB 数据线。由于摄像头引脚与开发板强相关esp-iot-solution 在 camera_pin.h 中为常见开发板预置了整套引脚映射包括开发板Kconfig 选项WROVER-KIT配 OV2640 模块CAMERA_MODULE_WROVER_KITESP-EYE DevKitCAMERA_MODULE_ESP_EYEESP32-S2-Kaluga-1 V1.3CAMERA_MODULE_ESP_S2_KALUGAESP-S3-EYE DevKitCAMERA_MODULE_ESP_S3_EYEESP-S3-Korvo-2CAMERA_MODULE_ESP_S3_KORVO2ESP32 Camera Development BoardCAMERA_MODEL_ESP32_CAM_BOARDM5Stack Camera With PSRAMCAMERA_MODULE_M5STACK_PSRAMM5Stack Camera FWideCAMERA_MODULE_M5STACK_WIDEESP32-CAM by AI-ThinkerCAMERA_MODULE_AI_THINKER自定义引脚CAMERA_MODULE_CUSTOM以 ESP-S3-EYE 为例camera_pin.h 中给出的引脚为VSYNC6、HREF7、PCLK13、XCLK15、SIOD4、SIOC5、D011、D19、D28、D310、D412、D518、D617、D716。这些宏最终通过CAMERA_PIN_*前缀暴露给应用代码使用。配置工程摄像头引脚选择运行工程配置菜单idf.py menuconfig在idf.py menuconfig - Camera Pin Configuration中选择与你开发板匹配的引脚方案。该菜单由 common_components/camera/Kconfig.projbuild 定义其核心结构是一个choice CAMERA_MODULE选项默认选中CAMERA_MODULE_WROVER_KIT列出上表中的全部开发板若选择CAMERA_MODULE_CUSTOM则还会出现 PWDN、RESET、XCLK、SIOD、SIOC、VSYNC、HREF、PCLK、Y2~Y9 等逐项自定义引脚配置例如config CAMERA_PIN_XCLK depends on CAMERA_MODULE_CUSTOM int XCLK pin range 0 33 default 21从源码结构看camera_pin.h中每个分支都通过#if CONFIG_CAMERA_MODULE_XXX预编译指令把对应宏展开为具体 GPIO 编号因此只要在 menuconfig 里选对开发板型号编译时即可自动获得正确的引脚定义无需修改任何源码。默认构建配置sdkconfig.defaults 预置了适合摄像头的构建参数主要包括CONFIG_ESP32_DEFAULT_CPU_FREQ_240y # CPU 主频 240MHz CONFIG_ESPTOOLPY_FLASHFREQ_80My # Flash 频率 80MHz CONFIG_ESPTOOLPY_FLASHMODE_QIOy # Flash 模式 QIO CONFIG_ESPTOOLPY_FLASHSIZE_4MBy # Flash 大小 4MB CONFIG_SPIRAM_SUPPORTy # 开启 PSRAM CONFIG_SPIRAM_MODE_OCTy # Octal PSRAM CONFIG_SPIRAM_SPEED_80My # PSRAM 频率 80MHz CONFIG_FREERTOS_HZ1000这些配置中开启 PSRAM 是摄像头例程的关键前提——大尺寸帧缓冲通常分配在 PSRAM 中见下文fb_location CAMERA_FB_IN_PSRAM。而 sdkconfig.ci 则用于 CI 场景显式关闭了 SPIRAMCONFIG_SPIRAM_SUPPORTn。核心源码逐行解析从初始化到取帧例程的全部逻辑位于 take_picture.c由init_camera()和app_main()两部分组成。第一步初始化摄像头init_camerainit_camera()接收四个参数并据此构造camera_config_t配置结构体static esp_err_t init_camera(uint32_t xclk_freq_hz, pixformat_t pixel_format, framesize_t frame_size, uint8_t fb_count) { camera_config_t camera_config { .pin_pwdn CAMERA_PIN_PWDN, .pin_reset CAMERA_PIN_RESET, .pin_xclk CAMERA_PIN_XCLK, .pin_sscb_sda CAMERA_PIN_SIOD, .pin_sscb_scl CAMERA_PIN_SIOC, .pin_d7 CAMERA_PIN_D7, .pin_d6 CAMERA_PIN_D6, .pin_d5 CAMERA_PIN_D5, .pin_d4 CAMERA_PIN_D4, .pin_d3 CAMERA_PIN_D3, .pin_d2 CAMERA_PIN_D2, .pin_d1 CAMERA_PIN_D1, .pin_d0 CAMERA_PIN_D0, .pin_vsync CAMERA_PIN_VSYNC, .pin_href CAMERA_PIN_HREF, .pin_pclk CAMERA_PIN_PCLK, // EXPERIMENTAL: Set to 16MHz on ESP32-S2 or ESP32-S3 to enable EDMA mode. .xclk_freq_hz xclk_freq_hz, .ledc_timer LEDC_TIMER_0, // This is only valid on ESP32/ESP32-S2. ESP32-S3 use LCD_CAM interface. .ledc_channel LEDC_CHANNEL_0, .pixel_format pixel_format, // YUV422,GRAYSCALE,RGB565,JPEG .frame_size frame_size, // QQVGA-UXGA, sizes above QVGA are not been recommended when not JPEG format. .jpeg_quality 30, // 0-63, used only with JPEG format. .fb_count fb_count, // For ESP32/ESP32-S2, if more than one, i2s runs in continuous mode. .grab_mode CAMERA_GRAB_WHEN_EMPTY, .fb_location CAMERA_FB_IN_PSRAM }; ... }对其中几个关键字段的理解直接决定了画面质量与取帧成功率引脚字段pin_*全部来自CAMERA_PIN_*宏即 menuconfig 所选开发板在 camera_pin.h 中对应的定义切勿在代码里写死。xclk_freq_hz摄像头的输入时钟频率。例程在app_main中传入10 * 100000010MHz源码注释特别指出在 ESP32-S2 / ESP32-S3 上可尝试 16MHz 以启用 EDMA 模式。ledc_timer/ledc_channel用于驱动 XCLK 的 LEDC 通道仅对 ESP32/ESP32-S2 有效ESP32-S3 使用的是 LCD_CAM 接口。pixel_format像素格式支持YUV422、GRAYSCALE、RGB565、JPEG。例程默认使用PIXFORMAT_RGB565。frame_size帧尺寸可选QQVGA~UXGA源码注释提醒非 JPEG 格式下不建议使用大于 QVGA 的尺寸裸数据量过大吞吐与带宽受限。jpeg_qualityJPEG 压缩质量取值 0~63仅在使用 JPEG 格式时生效。例程中设为 30。fb_count帧缓冲数量。对 ESP32/ESP32-S2若大于 1I2S 会运行在连续模式。grab_mode取帧模式例程使用CAMERA_GRAB_WHEN_EMPTY。fb_location帧缓冲存放位置例程使用CAMERA_FB_IN_PSRAM把帧缓冲分配在 PSRAM 中——这也是 sdkconfig.defaults 必须开启 SPIRAM 支持的原因。配置构造完成后调用esp_camera_init(camera_config)完成初始化esp_err_t ret esp_camera_init(camera_config); if (ret ! ESP_OK) { return ret; }第二步获取 sensor 并校正图像方向初始化成功后通过esp_camera_sensor_get()拿到传感器控制结构体随后调用其成员函数调整拍摄参数sensor_t *s esp_camera_sensor_get(); s-set_vflip(s, 1); // flip it back // initial sensors are flipped vertically and colors are a bit saturated if (s-id.PID OV3660_PID) { s-set_brightness(s, 1); // up the blightness just a bit s-set_saturation(s, -2); // lower the saturation } if (s-id.PID OV3660_PID || s-id.PID OV2640_PID) { s-set_vflip(s, 1); // flip it back } else if (s-id.PID GC0308_PID) { s-set_hmirror(s, 0); } else if (s-id.PID GC032A_PID) { s-set_vflip(s, 1); }这段代码对不同传感器型号做了差异化矫正OV2640/OV3660 默认图像上下翻转需要set_vflip翻转回来GC0308 需要处理水平镜像同时针对 OV3660 微调亮度与饱和度。此外take_picture.c 还调用esp_camera_sensor_get_info((s-id))查询传感器信息若当前使用 JPEG 格式且传感器原生支持 JPEG 压缩则置位auto_jpeg_support。源码注释特别提醒不要通过 sensor 接口调用设置分辨率、图像格式和 PLL 时钟的函数如需修改这些参数应重新初始化传感器。第三步主循环取帧并归还缓冲app_main()首先以 RGB565、QVGA、双帧缓冲、10MHz XCLK 的参数完成初始化然后进入每 2 秒拍一帧的循环void app_main() { if (ESP_OK ! init_camera(10 * 1000000, PIXFORMAT_RGB565, FRAMESIZE_QVGA, 2)) { ESP_LOGE(TAG, init camrea sensor fail); return; } // take a picture every two seconds and print the size of the picture. while (1) { ESP_LOGI(TAG, Taking picture...); camera_fb_t *pic esp_camera_fb_get(); if (pic) { // use pic-buf to access the image ESP_LOGI(TAG, Picture taken! Its size was: %zu bytes, pic-len); // To enable the frame buffer can be reused again. esp_camera_fb_return(pic); } vTaskDelay(pdMS_TO_TICKS(2000)); } }取帧闭环中有一个极易踩坑的点源码注释已明确警告如果调用了esp_camera_fb_get()却没有调用esp_camera_fb_return()归还缓冲下一次fb_get()会因为没有可用的帧缓冲空间而报错 Failed to get the frame on time!。因此fb_get/fb_return必须成对出现这也是把esp_camera_fb_return(pic)紧跟在读取pic-len之后的原因。构建、烧录与运行在examples/camera/basic目录下执行构建、烧录并打开串口监视器idf.py -p PORT flash monitor其中PORT替换为实际串口名如/dev/ttyUSB0。退出串口监视器请按Ctrl-]。完整的 ESP-IDF 环境配置与工程构建步骤可参考官方 Getting Started 指南。示例输出解读烧录运行后串口日志大致如下I (325) camera: Detected OV2640 camera I (325) camera: Camera PID0x26 VER0x42 MIDL0x7f MIDH0xa2 I (504) s2 ll_cam: node_size: 3840, nodes_per_line: 1, lines_per_node: 6 I (504) s2 ll_cam: dma_half_buffer_min: 3840, dma_half_buffer: 15360, lines_per_half_buffer: 24, dma_buffer_size: 30720 I (512) cam_hal: buffer_size: 30720, half_buffer_size: 15360, node_buffer_size: 3840, node_cnt: 8, total_cnt: 10 I (522) cam_hal: Allocating 153600 Byte frame buffer in PSRAM I (529) cam_hal: Allocating 153600 Byte frame buffer in PSRAM I (535) cam_hal: cam config ok I (539) ov2640: Set PLL: clk_2x: 1, clk_div: 3, pclk_auto: 1, pclk_div: 8 I (714) example:take_picture: Taking picture... I (855) example:take_picture: Picture taken! Its size was: 153600 bytes逐行解读这段日志可以帮助你理解驱动的内部行为Detected OV2640 camera/Camera PID0x26 ...驱动通过 SCCB即摄像头 I2C 总线成功识别传感器型号PID0x26 对应 OV2640s2 ll_cam:/cam_hal:系列日志LLlow-level层与 cam_hal 层汇报 DMA 缓冲区的组织情况——buffer_size: 30720、half_buffer_size: 15360、node_cnt: 8等是 DMA 描述符与缓冲切片的量化信息Allocating 153600 Byte frame buffer in PSRAM出现两次两帧 153600 字节的帧缓冲被分配到 PSRAM与fb_count2、QVGA(320×240)×RGB565(2 字节/像素)153600 字节完全吻合ov2640: Set PLL: clk_2x: 1, clk_div: 3, pclk_auto: 1, pclk_div: 8传感器内部 PLL 配置Taking picture...→Picture taken! Its size was: 153600 bytes一次完整的取帧成功图像大小为 153600 字节。常见问题排查例程 README 给出了两个高频问题的排障方向日志出现gpio: gpio_intr_disable(176): GPIO number error大概率是摄像头引脚配置错误。请在idf.py menuconfig的Component config - Camera Pin Config即前文所述 Camera Pin Configuration 菜单中核对引脚是否与你手上开发板的实际接线一致优先直接选择对应开发板的预设项。摄像头传感器初始化失败检查esp_camera_init()传入的初始化参数尤其是xclk_freq_hz、pixel_format、frame_size、fb_count等以及引脚配置是否符合传感器数据手册与硬件原理图。延伸esp32-camera 驱动 API 速览Basic 例程只是 esp32-camera 的冰山一角examples/camera/README.md 汇总了该驱动的主要 API可用于进一步扩展核心生命周期与取帧函数作用esp_err_t esp_camera_init(const camera_config_t* config)初始化摄像头驱动esp_err_t esp_camera_deinit()反初始化摄像头驱动camera_fb_t* esp_camera_fb_get()获取帧缓冲指针void esp_camera_fb_return(camera_fb_t *fb)归还帧缓冲以便复用sensor_t * esp_camera_sensor_get()获取传感器控制结构体指针esp_err_t esp_camera_save_to_nvs(const char *key)将摄像头设置保存到 NVS 非易失存储esp_err_t esp_camera_load_from_nvs(const char *key)从 NVS 加载摄像头设置格式转换fmt2jpg_cb()/frame2jpg_cb()/fmt2jpg()将图像缓冲或摄像头帧缓冲转换为 JPEGfmt2bmp()/frame2bmp()转换为 BMPfmt2rgb888()转换为 RGB888jpg2rgb565()JPEG 转 RGB565支持缩放esp_jpg_decode()JPEG 缩放解码。在 esp-iot-solution 仓库中除了本 Basic 例程还有 pic_server、test_framerate、video_stream_server、video_recorder 等进阶例程分别覆盖网页拍照预览、帧率评估与提升、HTTP 视频流、视频录制等场景可作为从“取到一帧”迈向“完整摄像头应用”的下一步参考。赞分享物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载相关推荐esp-iot-solution 中 I2S LCD 并行总线驱动API 详解与 ESP32 / ESP32-S2 / ESP32-S3 平台实现剖析esp iot solution 中 I2S LCD 并行总线驱动API 详解与 ESP32 / ESP32 S2 / ESP32 S3 平台实现剖析 本篇技物联网嵌入式驱动开发硬件开发esp-iot-solution USB Stream 麦克风扬声器示例实战基于 ESP32-S2/S3 的 UVC 摄像头与 UAC 音频流同步采集与回放esp iot solution USB Stream 麦克风扬声器示例实战基于 ESP32 S2/S3 的 UVC 摄像头与 UAC 音频流同步采集与回放物联网嵌入式驱动开发硬件开发ESP32-S2/S3/P4 USB 2.0 信号质量与眼图测试实战指南esp-iot-solutionESP32 S2/S3/P4 USB 2.0 信号质量与眼图测试实战指南esp iot solution 本指南以乐鑫 ESP IoT Solution 仓物联网嵌入式驱动开发硬件开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价