sensor_exposure_control.py
# 本作品采用MIT许可证授权。
# 版权所有 (c) 2013-2023 OpenMV LLC。保留所有权利。
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# 传感器曝光控制
#
# 此示例展示了如何手动控制相机传感器的
# 曝光,而非让自动曝光控制运行。
# 增益控制和曝光控制有什么区别?
#
# 通过增加图像的曝光时间,您可以获得更多
# 相机上的光线。这为您提供了最佳的信噪比。
# 通常总是希望优先增加曝光时间...但是,当您
# 增加曝光时间时,最大可达帧率会降低,
# 而且若图像中有物体移动,曝光时间越长,
# 模糊就越明显。增益控制允许您通过模拟和数字乘法器
# 提高每个像素的输出...但它同时也会放大
# 噪声。因此,最好先让曝光尽可能增加,
# 然后再用增益控制来弥补剩余的差距。
import csi
import time
# 更改此值以调整曝光。试试10.0/0.1等。
EXPOSURE_TIME_SCALE = 1.0
csi0 = csi.CSI()
csi0.reset() # 重置并初始化传感器。
csi0.pixformat(csi.RGB565) # 将像素格式设置为RGB565 (or GRAYSCALE)
csi0.framesize(csi.QVGA) # 将帧大小设置为QVGA (320x240)
# 打印初始曝光时间以作对比。
print("Initial exposure == %d" % csi0.exposure_us())
csi0.snapshot(time=2000) # 等待设置生效。
clock = time.clock() # 创建一个时钟对象来跟踪FPS。
# 你必须关闭自动增益控制和自动白平衡
# 否则它们会调整图像增益来抵消任何曝光设置
# 你所设定的...
csi0.auto_gain(False)
csi0.auto_whitebal(False)
# 需要让上述设置生效...
csi0.snapshot(time=500)
current_exposure_time_in_microseconds = csi0.exposure_us()
print("Current Exposure == %d" % current_exposure_time_in_microseconds)
# 自动曝光控制(AEC)默认启用。调用以下函数
# 将禁用传感器自动曝光控制。额外的"exposure_us"
# 参数会在AEC禁用后覆盖自动曝光值
csi0.auto_exposure(
False, exposure_us=int(current_exposure_time_in_microseconds * EXPOSURE_TIME_SCALE)
)
print("New exposure == %d" % csi0.exposure_us())
# csi0.exposure_us()返回相机传感器的精确曝光时间
# (微秒单位)。但这个数值可能与指令值不同
# 因为传感器代码会将微秒曝光时间转换为
# 行/像素/时钟时间,无法完美匹配微秒...
# 如果想重新开启自动曝光,请执行:csi0.auto_exposure(True)
# 注意相机传感器将自行调整曝光时间
# 执行:csi0.auto_exposure(False)
# 仅禁用曝光值更新,不改变当前曝光
# 相机传感器确定的值是好的。
while True:
clock.tick() # 更新FPS时钟。
img = csi0.snapshot() # 拍照并返回图像。
print(clock.fps()) # 注意:OpenMV摄像头在连接至IDE时运行速度会降低约一半。
# 断开连接后,帧率应会提升。