sensor – 摄像头
sensor 模块用于控制摄像头并采集图像帧。它的接口与 OpenMV 的 sensor 保持一致,因此大多数 OpenMV 脚本无需改动即可移植。
摄像头初始化与连续采集
典型流程是复位传感器、选择像素格式与分辨率、等待自动曝光和自动白平衡稳定,然后连续采集图像:
import sensor
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
while True:
img = sensor.snapshot()
sensor.reset() 会应用开发板的默认摄像头配置。RGB565 适用于显示、绘图和大多数 AI 工作流,GRAYSCALE 则可降低许多检测算法的内存占用和处理开销。sensor.snapshot() 返回由可复用帧缓冲承载的 image.Image,因此需要在下一次采集后继续保持图像内容不变时,应先复制该图像。
图像方向与摄像头状态
摄像头传感器的实际安装方向可能导致画面翻转,可通过水平镜像和垂直翻转进行校正。status() 返回当前分辨率、像素格式、传感器 ID、图像方向和裁剪信息,可用于诊断:
import sensor
sensor.reset()
sensor.set_hmirror(True)
sensor.set_vflip(False)
info = sensor.status()
print("sensor id:", info["id"])
print("output:", info["width"], "x", info["height"])
print("ready:", info["ready"])
镜像和翻转设置会影响后续采集的图像。产品代码可在初始化后调用 status(),确认摄像头已经就绪,并验证协商得到的输出尺寸与处理链路一致。
暂时停止采集
不需要采集时可以停止摄像头流,并在下一次采集前重新启动:
sensor.shutdown(True)
# 执行不需要摄像头的任务。
sensor.shutdown(False)
sensor.skip_frames(n=3)
img = sensor.snapshot()
重新启动摄像头流后,如果曝光或输入帧队列需要重新稳定,应丢弃少量图像帧。
运行时控制 IPA
IPA 和 ISP 控制接口是可选固件功能。使用前可通过 hasattr(sensor, "get_ipa") 或 hasattr(sensor, "get_isp") 检查;固件未包含该功能时,这些方法不存在。
使用 sensor.set_ipa(False) 停止图像处理算法(IPA)控制器,使用 sensor.set_ipa(True) 重新启动。调用前需要初始化摄像头。sensor.get_ipa() 返回控制器的当前状态;不支持运行时控制时返回 None。对不支持的摄像头设置 IPA 会抛出 OSError。
sensor.reset()
sensor.skip_frames(time=2000)
if hasattr(sensor, "get_ipa") and sensor.get_ipa() is not None:
sensor.set_ipa(False)
print("IPA:", sensor.get_ipa())
img = sensor.snapshot()
img.flush()
sensor.set_ipa(True)
切换 IPA 状态会短暂停止并重新启动采集,保留输出像素格式、分辨率、镜像和翻转设置。重复设置当前状态不会执行切换。sensor.reset() 以及 sensor.shutdown(True) 后重新启动摄像头会恢复默认 IPA 状态。
切换失败时摄像头不会退回原状态,而是被完全关闭:抛出 OSError 之前,采集缓冲、缩放器和摄像头设备都已释放。此时需调用 sensor.reset() 重新启动摄像头。
关闭 IPA 会停止其自动参数更新,但不会绕过 ISP 或清除已有调校参数,因此画面最初可能没有明显变化。对比时可以在预览中改变照度或光源颜色,再开启 IPA 并等待算法重新稳定。此开关控制哪些算法取决于当前 IPA 配置。
手动控制 ISP
初始化后,sensor.get_isp(block) 返回驱动当前参数的字典;不支持该处理模块时返回 None。摄像头驱动没有实现读取接口,或固件针对的芯片版本不具备相应硬件时,都属于不支持:lsc 需要 ESP32-P4 v1.0 及以上,blc 需要 v3.0 及以上;而 SC2336 等传感器的曝光是只写的,因此 sensor.get_isp("exposure") 通常返回 None,但仍可通过 sensor.set_isp("exposure", value=...) 设置曝光。手动写入前先调用 sensor.set_ipa(False)。sensor.set_isp(block, **params) 修改一个处理模块,未指定的字段沿用当前配置。IPA 运行期间写入会抛出 OSError,避免算法覆盖手动参数。
sensor.reset()
sensor.skip_frames(time=2000)
sensor.set_ipa(False)
print(sensor.get_isp("wb"))
sensor.set_isp("wb", enable=False)
sensor.set_isp("ccm", enable=False)
sensor.set_isp("gamma", enable=False)
sensor.snapshot().flush()
sensor.set_isp("wb", enable=True, rg=1.8, bg=1.4)
sensor.set_isp("exposure", value=10000) # 单位:微秒,按 100 微秒取整。
sensor.set_isp("pixel_gain", value=2.0) # 增益倍数。
sensor.set_ipa(True)
处理模块名与字段沿用调参参数的命名:
模块 |
字段 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
向已关闭的模块应用新参数时,应同时设置 enable=True。仅传入 enable=False 会关闭该处理模块,而不替换已保存的表数据。白平衡增益在关闭后仍然保留,再次打开时恢复。Gamma 读回红通道曲线;设置 x 或 y 会将合成后的曲线应用于三个通道,仅修改开关则保留各通道曲线。LSC 表复制到摄像头持有的存储中,在垃圾回收及 IPA 切换后仍然有效;在驱动接受新表之前,摄像头会保留已生效的旧表,因此写入被拒绝时画面不受影响。定点数参数和传感器设置可能被驱动量化。
未知模块、无效数值及数组长度错误会在应用修改前被拒绝。不支持的写入会抛出 OSError。设备错误可能留下部分已应用的配置,此时可调用 sensor.reset() 重新初始化。
example/01-Camera/04-IPA/isp_preview.py 示例先配置输出格式,再关闭 IPA,然后持续预览,每 2 秒随机调整曝光、增益、白平衡增益和 CCM,并打印请求的曝光值及驱动读回的增益、白平衡增益和 CCM 参数,直到按 Ctrl-C 停止。可以修改 UPDATE_INTERVAL_MS 及各参数范围常量调整试验;当前传感器不接受的取值会被打印并跳过,不会中断预览。停止后,IPA 保持关闭并保留最后一次设置。
参见
摄像头流水线 说明了一帧图像如何从图像传感器到达 image.Image;图像模型 介绍像素格式与 色彩空间。
可运行示例:example/01-Camera/00-Snapshot(采集并保存)与 example/01-Camera/03-MJPEG(Wi-Fi MJPEG 串流)。
Constants
- sensor.GRAYSCALE
Pixel format constants accepted by set_pixformat().
- sensor.RGB565
- sensor.QQVGA
Frame size constants accepted by set_framesize().
- sensor.QVGA
- sensor.VGA
Functions
- sensor.reset()
Reset and initialize the camera with the board default sensor configuration.
- sensor.shutdown(enable=...)
Stop or restart the camera stream.
- 参数:
enable – True shuts the camera down; False starts it again.
- sensor.set_pixformat(pixformat)
Select the output pixel format.
- 参数:
pixformat – sensor.GRAYSCALE or sensor.RGB565.
- sensor.get_pixformat()
Return the current pixel format constant.
- sensor.set_framesize(framesize)
Select the output frame size.
- 参数:
framesize – sensor.QQVGA, sensor.QVGA, or sensor.VGA when supported by the board.
- sensor.get_framesize()
Return the current frame size constant.
- sensor.width()
Return the current output image width in pixels.
- sensor.height()
Return the current output image height in pixels.
- sensor.get_id()
Return the camera sensor ID.
- sensor.set_hmirror(enable)
Mirror the camera image horizontally.
- 参数:
enable – True enables horizontal mirror.
- sensor.get_hmirror()
Return whether horizontal mirror is enabled.
- sensor.set_vflip(enable)
Flip the camera image vertically.
- 参数:
enable – True enables vertical flip.
- sensor.get_vflip()
Return whether vertical flip is enabled.
- sensor.set_ipa(enable)
Optional API: present only in firmware with IPA/ISP control enabled. Start or stop the IPA controller after camera initialization; briefly pauses capture. Existing ISP tuning is retained when disabled. Unsupported cameras raise OSError.
- sensor.get_ipa()
Optional API: present only in firmware with IPA/ISP control enabled. Return the IPA controller state, or None when runtime control is unsupported. A supported camera must be initialized first.
- sensor.get_isp(block)
Optional API: present only in firmware with IPA/ISP control enabled. Read current ISP block parameters, or None if unsupported. Initialize the camera first. Blocks the camera driver or chip revision does not implement return None, including “exposure” on sensors whose driver makes it write-only.
- sensor.set_isp(block, **params)
Optional API: present only in firmware with IPA/ISP control enabled. Update one ISP block using keyword parameters; unspecified fields retain their values. Disable IPA before writing. Invalid parameters raise ValueError; device errors raise OSError.
- sensor.skip_frames(time=..., n=...)
Drop frames while camera exposure and processing settle.
- 参数:
time – milliseconds to wait. n: number of frames to skip.
- sensor.snapshot(buffer=...)
Capture one image from the camera.
- 参数:
buffer – reserved for compatibility; pass None in current ESP-VISION builds.
- sensor.status()
Return camera readiness, size, format, mirror, flip, and crop status.
Classes
- class sensor.SensorStatus
Dictionary returned by status().