DVP & MIPI-CSI 摄像头方案介绍

[English]

常见应用场景

  1. 已有的视频 demo

  • ESP32-S3 狂飙刷毫秒【高帧率 125 fps】:ESP32-S3 加全局快门摄像头,高帧率达 125 FPS。可采集运动物体运动轨迹,如写字笔等场景的高帧率图像采集。再配合 ESP32-S3 的网络功能,物联网智能摄像头解决首选。

  • ESP32-S3 看萌猫吃播【高分辨率】:ESP32-S3-EYE 人工智能开发板,加一块 200 W 像素的摄像头。高分辨率实时观看猫主子吃播,宠物监测首选

  1. 二维码扫描的功能

  • 商品条码扫描、火车票扫描、地税发票扫描、资源扫描下载等

  • 自动聚焦 + 互联网

  1. Wi-Fi、LCD “拍立得”

  • 拍摄的照片立即刷新到网页上、刷新到 LCD 上显示

  1. 扫描仪、智能车辅助导航

  2. 人脸识别

  • 通过人脸进行身份确认或者身份查找的技术或系统

  1. 视频监控、光感氛围灯

  2. AI 应用

  • 手势识别

  • 数字识别

  • 食物识别

  • 坐姿检测

参考资料

性能测试数据附录

Camera 相关的方案主要关注下述性能指标:

  1. sensor 初始化时间(尤其是需要启动后立即抓拍的项目)

  2. 支持的分辨率与数据格式

  3. 在指定分辨率、数据格式下的帧率

  4. 和 Wi-Fi 一起使用时的传输速率

  5. 支持的图像处理功能(目前主要是通过软件执行 JPEG 编解码功能)

相关测试代码可参考 测试示例

sensor 初始化时间

Sensor init time

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 像素

数据格式主要取决于摄像头支持输出的数据格式。主要有:

  1. RGB

  2. YUV

  3. JPEG

  4. RAW Data

  5. BMP

  6. Only Y/Grayscale

当摄像头本身不支持输出 JPEG 数据时,可以由 ESP32 执行 JPEG 压缩,输出 JPEG 数据。

备注

特别地,当需要的分辨率过大,超过 1024*720 时,尽量考虑使用支持 JPEG 编码的摄像头。同时需要阐明由 ESP32 执行 JPEG 编解码将对 CPU 和内存造成压力。

对于 ESP32P4 的 MIPI CSI 接口,它可以支持 RGB、YUV、RAW Data 格式的数据。

在指定分辨率、数据格式下的帧率

Sensor init time

输出格式

芯片型号

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 的软件编码组件。

ESP32-S3 的编解码性能

常见 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 分为如下三种:

  1. JPEG sensor:即可以直接输出 JPEG 数据的传感器。这类传感器的内部结构可以简述为:RAW sensor + Internal ISP + JPEG encoder。其中 Internal ISP 将 RAW data 编码为 YUV、RGB格式的数据;JPEG encoder 将 RGB、YUV 格式的数据编码为 JPEG。它实际上有三个模块在工作。

  2. 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>`__。

  3. 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_storageuvc

图像帧率慢怎么办?

用户关心的图像数据往往是经过多个模块处理、传输后的数据了。因此需要分步骤地引导客户测试各个阶段的速率。

首先确认 camera sensor 实际输出的帧率。对于使用 esp32-camera 的用户,使用 test_framerate 示例;对于使用 esp-video 的用户,使用 capture_stream 示例。 然后逐步开启 ISP、encoder,分别测试开启这些编码模块后的速率。 最后,测试数据传输(网络、外设接口)的速率。