You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:13:19