DVP & MIPI-CSI 摄像头方案介绍
常见应用场景
已有的视频 demo
ESP32-S3 狂飙刷毫秒【高帧率 125 fps】:ESP32-S3 加全局快门摄像头,高帧率达 125 FPS。可采集运动物体运动轨迹,如写字笔等场景的高帧率图像采集。再配合 ESP32-S3 的网络功能,物联网智能摄像头解决首选。
ESP32-S3 看萌猫吃播【高分辨率】:ESP32-S3-EYE 人工智能开发板,加一块 200 W 像素的摄像头。高分辨率实时观看猫主子吃播,宠物监测首选
商品条码扫描、火车票扫描、地税发票扫描、资源扫描下载等
自动聚焦 + 互联网
拍摄的照片立即刷新到网页上、刷新到 LCD 上显示
扫描仪、智能车辅助导航
人脸识别
通过人脸进行身份确认或者身份查找的技术或系统
视频监控、光感氛围灯
AI 应用
手势识别
数字识别
食物识别
坐姿检测
参考资料
软件参考
摄像头驱动库 : 可以参考 esp32-camera, esp32-camera 是乐鑫的一个 camera 驱动库,提供了针对 ESP32/ESP32-S2/ESP32-S3 的 camera 外设驱动,包括底层 8 bit DVP 接口驱动、传感器驱动、图像编解码三部分。ESP32-P4 除支持 DVP 接口外,还支持 MIPI CSI 接口,该芯片使用全新的代码架构,您可以参考 esp-video-components。
相关模组/开发板购买
模组/开发板资料及选型参考
性能测试数据附录
Camera 相关的方案主要关注下述性能指标:
sensor 初始化时间(尤其是需要启动后立即抓拍的项目)
支持的分辨率与数据格式
在指定分辨率、数据格式下的帧率
和 Wi-Fi 一起使用时的传输速率
支持的图像处理功能(目前主要是通过软件执行 JPEG 编解码功能)
相关测试代码可参考 测试示例。
sensor 初始化时间
Sensor |
Init time (ms) |
---|---|
OV3660, JPEG |
604 |
OV3660, RGB565 |
1301 |
OV2640, JPEG |
200 |
OV5640, JPEG |
240 |
支持的分辨率与数据格式
支持的分辨率大小完全取决于摄像头的最大性能,但 DVP 本身以及 CPU DMA 的能力有限,过大的分辨率将对数据传输造成压力:
如 DVP 摄像头 sensor 能输出 JPEG 类型的图片,对应的分辨率建议最大不超过 500 w 像素
如 DVP 摄像头 sensor 不能输出 JPEG 类型的图片(此时图片的类型为 YUV422/RGB565 等),对应的分辨率建议最大不超过 100 w 像素
数据格式主要取决于摄像头支持输出的数据格式。主要有:
RGB
YUV
JPEG
RAW Data
BMP
Only Y/Grayscale
当摄像头本身不支持输出 JPEG 数据时,可以由 ESP32 执行 JPEG 压缩,输出 JPEG 数据。
备注
特别地,当需要的分辨率过大,超过 1024*720 时,尽量考虑使用支持 JPEG 编码的摄像头。同时需要阐明由 ESP32 执行 JPEG 编解码将对 CPU 和内存造成压力。
对于 ESP32P4 的 MIPI CSI 接口,它可以支持 RGB、YUV、RAW Data 格式的数据。
在指定分辨率、数据格式下的帧率
输出格式 |
芯片型号 |
sensor 型号 |
分辨率 |
帧率 |
---|---|---|---|---|
YUV422RGB565 |
ESP32-S3 |
SC030IOT(DVP) |
640*480 |
30 fps |
JPEG |
ESP32S3 |
OV5640(DVP) |
1600*1200 |
25 fps |
Only Y/MONO |
ESP32-S3/ESP32-S2 |
SC031GS(DVP) |
240*240 |
125 fps |
RGB RAW |
ESP32-P4 |
SC2336(MIPI) |
1920*1080 |
30 fps |
RGB565 |
ESP32-P4 |
OV5645(MIPI) |
2592*1944 |
15 fps |
YUV422 |
ESP32-P4 |
SC101IOT(DVP) |
1280*720 |
24 fps |
不同摄像头的速率差别较大。当测试 JPEG 速率时,应指定 JPEG 压缩的参数,并尽可能拍摄色彩鲜艳的图片,拍摄单色物体会包含更多低频信息,导致 JPEG 压缩后的数据量小,生成的数据不具备代表性。
对于 esp32-camera,同一摄像头在指定的数据格式、分辨率、主时钟 XCLK 的大小、空闲间隔时间参数设置不同时帧率差别较大。同时为了保证帧率,初始化摄像头时 fb_count 应不小于 2。目前大部分摄像头对接的驱动参数并不是最优的,不同摄像头的配置方法也不统一,因此上述性能数据完全有更大的优化调整空间。ESP32-S3 拥有独立的 CAM DVP 接口,该外设接口速率更高,是 ESP32 的 2~3 倍。
和 Wi-Fi 一起使用时的传输速率
通常,当用户需要的数据格式、分辨率、帧率等参数确定后,依据 Wi-Fi 的测试数据即可初步估计该方案是否可行。
以 JPEG@480* 320@20fps 为例子,通常该JPEG@480* 320 的一张图片在 30 KB ~ 50 KB,帧率要求 20 fps,则 Wi-Fi 需要的速率应该在 600 KB/s ~ 1000 KB/s。通过查看 ESP32-S3 的 Wi-Fi 吞吐量,可以发现 ESP32-S3 是符合需求的。
当前实测 ESP32-S3 上运行 esp-rtsp 示例,720p + MJPEG 视频流帧率可达 20 fps 左右。
ESP32-S3 的编解码性能
ESP32-S3 没有硬件编解码能力,其驱动代码包含了 TinyJPEG 的软件编码组件。
常见 Q&A
在 esp-video 中查询分辨率与输出格式的描述。
esp-video 中对 camera sensor 的输出格式有详细的描述,以 OV5645 为例,用户可以参考 这里 的描述了解其支持的输出格式,并在 menuconfig 中选择想要使用的输出格式。 如果正在使用 ESP32-P4,对于不支持的分辨率,用户可以使用 PPA 模块 对输出的原始图像进行缩放或者裁减。
修改 ESP32-P4 的 ISP 的参数。
对于输出 RAW 格式的数据的 sensor,需要使用 ISP 模块来完成图像亮度、彩色的优化。 ISP 系统有三部分组成:ISP 标定工具、ISP 控制算法、ISP 硬件 pipelines。 其中 ISP 标定工具需要专用的实验室和专业人员来使用。ISP 控制算法、ISP 模块的部分参数可以通过 JSON 文件来配置。以 OV2710 为例,其 JSON 文件在 这里。用户可以拷贝该默认的 JSON 文件,生成自定义的 JSON 文件,并通过配置菜单来指定该文件的路径。
如何区分 sensor 是否需要使能 ISP Pipelines Controller?
这需要查看 sensor 的 datasheet。按照输出特性,将 sensor 分为如下三种:
JPEG sensor:即可以直接输出 JPEG 数据的传感器。这类传感器的内部结构可以简述为:RAW sensor + Internal ISP + JPEG encoder。其中 Internal ISP 将 RAW data 编码为 YUV、RGB格式的数据;JPEG encoder 将 RGB、YUV 格式的数据编码为 JPEG。它实际上有三个模块在工作。
YUV sensor: 即可以直接输出 YUV422、RGB565 数据的传感器。这类传感器的内部结构可以简述为:RAW sensor + Internal ISP。它实际上有两个模块在工作。当需要获取 JPEG 数据时,SOC 需要执行 JPEG 编码。对于 ESP32-S3 可以使用 esp_new_jpeg 组件来完成软件编码。对于 ESP32-P4,它拥有`HW_JPEG_Encoder <https://docs.espressif.com/projects/esp-idf/zh_CN/v5.4.1/esp32p4/api-reference/peripherals/jpeg.html>`__。
RAW sensor:即仅能输出 RAW8、RAW10 数据的传感器。这类传感器内部结构仅有 RAW sensor。因此,当项目需要使用 RGB、YUV、JPEG 格式的数据时,需要 SOC 上部署 ISP、JPEG encoder。对于效率要求不高的项目,可以使用软件实现的 ISP,对于反之,则必须`使能 <https://github.com/espressif/esp-video-components/tree/master/esp_video/examples#enable-isp-pipelines>`__ SOC 上的 ISP Pipelines Controller。
对于 RAW sensor,如何快速得到 JPEG 图像、H.264 数据?
首先要启用 SOC 上的 ISP Pipelines Controller,这样可以在 ISP 的 output queue 中获取到 YUV、RGB 格式的数据。 然后使用 esp-video 提供的 M2M(MemoryToMemory) 中间件,将 ISP 的 output queue 的数据,传递到 encoder 的 input queue。 最后,从 encoder 的 output queue 取出编码后的数据。 使用 M2M 机制的示例有:image_storage、uvc。
图像帧率慢怎么办?
用户关心的图像数据往往是经过多个模块处理、传输后的数据了。因此需要分步骤地引导客户测试各个阶段的速率。
首先确认 camera sensor 实际输出的帧率。对于使用 esp32-camera 的用户,使用 test_framerate 示例;对于使用 esp-video 的用户,使用 capture_stream 示例。 然后逐步开启 ISP、encoder,分别测试开启这些编码模块后的速率。 最后,测试数据传输(网络、外设接口)的速率。