从Picamera迁移到Picamera2:如何快速拍摄3张不同曝光图片?
解决方案:Picamera2连续拍摄不同曝光速度的照片
核心原理
Picamera2启动后无需重启相机,直接通过set_controls()方法实时修改曝光时间(ExposureTime),配合capture_file()或capture_array()就能快速完成多曝光拍摄。要保证速度,需避免重复启动/停止相机,同时合理配置相机的捕获模式。
代码实现
from picamera2 import Picamera2 import time picam2 = Picamera2() # 配置相机为快速捕获模式,关闭不必要的预览功能 still_config = picam2.create_still_configuration( main={"size": (1920, 1080)}, controls={"FrameDurationLimits": (33333, 33333), "AeEnable": False}, # 固定30fps,关闭自动曝光 buffer_count=4 # 增加缓冲区,提升连续捕获效率 ) picam2.configure(still_config) picam2.start() time.sleep(0.5) # 给相机预留初始配置时间 # 定义三组不同的曝光时间,单位:微秒 exposure_times = [1000, 10000, 100000] start_total = time.time() for idx, exp_time in enumerate(exposure_times): # 实时更新曝光参数 picam2.set_controls({"ExposureTime": exp_time, "AnalogueGain": 1.0}) # 极短延时确保参数生效,可根据实际硬件微调 time.sleep(0.05) # 捕获并保存照片 picam2.capture_file(f"exposure_{idx}.jpg") end_total = time.time() picam2.stop() print(f"拍摄完成,总耗时: {end_total - start_total:.2f}秒")
提速关键细节
- 单次启动相机:相机启动是高耗时操作,全程仅启动一次,修改参数后直接捕获,避免重复初始化。
- 固定帧率与缓冲区:配置
FrameDurationLimits固定帧率,增加buffer_count减少IO等待,提升连续捕获的流畅度。 - 最小化等待延时:参数设置后的等待时间可根据实际测试调整,只要相机完成参数切换即可,无需过长等待。
- 锁定手动参数:固定
AnalogueGain=1.0并关闭自动曝光,避免自动控制逻辑干扰手动曝光设置。
常见问题排查
如果曝光参数修改后未生效,检查以下几点:
- 确认自动曝光已完全关闭:配置或
set_controls中必须设置AeEnable=False,否则手动参数会被自动逻辑覆盖。 - 曝光时间未超出传感器限制:不同传感器的最大曝光时间不同,可通过
picam2.sensor_modes查看硬件参数,避免设置超出范围的值。 - 关闭不必要的流:配置时不要包含preview流,减少资源占用,提升捕获速度。
内容的提问来源于stack exchange,提问作者Milchgraf
相关产品推荐
相关产品推荐

