优化树莓派Camera V3实现DIY书籍扫描仪快速12MP图像采集
树莓派Camera V3 12MP快速采集方案(解决单张6+秒耗时问题)
核心问题定位
你当前用subprocess.run()调用libcamera-jpeg的方式,本质是每次触发拍摄都要重新启动相机进程、完成传感器唤醒、模式配置、ISP初始化等全流程——从你贴的日志能看到,光是两次模式选择和流配置就占了近5秒,这就是单张耗时超标的核心原因。手机能1秒内完成拍摄,是因为相机始终处于活跃待机状态,触发只是抓帧,没有启停开销。
解决方案:用Picamera2保持相机常开,触发式捕获
Picamera2支持持续运行相机实例,只在需要时捕获单帧,完全避免重复初始化的开销。以下是适配你GPIO触发场景的实现代码,光线固定的书籍扫描场景下,单张采集时间能压缩到1秒以内:
import os import re import time import RPi.GPIO as GPIO from picamera2 import Picamera2 # 配置参数 output_folder = "your_output_folder" base_filename = "image" file_extension = "jpg" gpio_pin = 18 resolution = (4608, 2592) # 12MP原生分辨率 # 初始化输出目录 if not os.path.exists(output_folder): os.makedirs(output_folder) # 计算起始编号 existing_files = [f for f in os.listdir(output_folder) if f.endswith(f".{file_extension}")] last_number = 0 if existing_files: last_file = max(existing_files, key=lambda x: int(re.search(r'\d+', x).group())) last_number = int(re.search(r'\d+', last_file).group()) # 初始化GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(gpio_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 初始化相机(仅执行一次) picam2 = Picamera2() # 配置为静态捕获模式,直接指定12MP分辨率 capture_config = picam2.create_still_configuration(main={"size": resolution}) picam2.configure(capture_config) # 启动相机,进入待机状态 picam2.start() # 固定曝光和白平衡(书籍扫描光线稳定,避免自动调整耗时) time.sleep(2) # 给相机时间完成初始自动校准 picam2.set_controls({"AeEnable": False, "AwbEnable": False}) print("相机已就绪,等待GPIO触发...") try: while True: GPIO.wait_for_edge(gpio_pin, GPIO.FALLING) start_time = time.time() last_number += 1 output_filename = f"{base_filename}{last_number:04d}.{file_extension}" output_path = os.path.join(output_folder, output_filename) # 直接捕获单帧,无需重启相机 picam2.capture_file(output_path) elapsed_time = round(time.time() - start_time, 1) print(f"已捕获: {output_filename}, 耗时: {elapsed_time}秒") finally: picam2.stop() GPIO.cleanup()
关键优化点
- 相机持续运行:初始化和启动仅做一次,后续捕获直接调用
capture_file(),跳过所有初始化流程。 - 关闭自动控制:固定曝光、白平衡,避免每次捕获时ISP的自动调整耗时。
- 原生分辨率直出:直接指定12MP分辨率,避免libcamera自动选择低分辨率再缩放的额外开销。
额外性能提升建议
- 若对JPEG质量要求不高,可添加参数降低编码耗时:
picam2.capture_file(output_path, quality=80) - 关闭降噪(书籍扫描文字清晰,降噪反而可能模糊细节):在创建配置时添加
controls={"NoiseReductionMode": 0}
内容的提问来源于stack exchange,提问作者konos93
相关产品推荐
相关产品推荐

