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

树莓派Camera无法初始化:视频流传输至电脑/云服务器求助

解决树莓派Picamera2+Flask摄像头初始化失败问题

针对你遇到的“Camera init sequence did not complete”错误,结合你的硬件和软件环境,给你几个针对性的排查和修复方案:

1. 修复Flask Debug模式的摄像头占用问题

Flask的debug=True模式会自动重启进程,导致摄像头资源被重复占用,这是高频踩坑点。把初始化逻辑移到请求处理阶段,避免提前抢占摄像头:

修改后的核心代码:

from flask import Flask, Response, render_template
from picamera2 import Picamera2
import cv2
import time

app = Flask(__name__)
camera = None

def initialize_camera():
    global camera
    if camera is None:
        try:
            camera = Picamera2()
            # 改用YUV格式,后续转BGR适配OpenCV
            config = camera.create_preview_configuration(main={"format": "YUV420", "size": (640, 480)})
            camera.configure(config)
            camera.start()
            # 延长初始化等待时间
            time.sleep(3)
            return camera
        except Exception as e:
            app.logger.error(f"Camera initialization failed: {e}")
            return None

def generate_frames():
    initialize_camera()
    while camera:
        try:
            # YUV转BGR适配OpenCV编码要求
            frame = camera.capture_array()
            frame = cv2.cvtColor(frame, cv2.COLOR_YUV420p2BGR)
            ret, buffer = cv2.imencode('.jpg', frame)
            frame = buffer.tobytes()
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
        except Exception as e:
            app.logger.error(f"Error capturing frame: {e}")
            # 出错后释放摄像头,允许下次请求重新初始化
            global camera
            camera.stop()
            camera = None
            break

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/video_feed')
def video_feed():
    return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

2. 检查摄像头访问权限

即使预览能正常运行,Flask进程可能没有足够权限访问摄像头:

  • 临时测试:用sudo python3 your_script.py运行程序,看是否解决问题
  • 永久修复:将当前用户加入video组
    sudo usermod -a -G video $USER
    
    执行后重启树莓派生效

3. 优化摄像头初始化时序

Picamera2对初始化时序要求较高,替换固定sleep为主动等待帧捕获:

# 替换初始化函数中的time.sleep(2)
camera.start()
# 最多等待5秒,确认摄像头能捕获到帧
for _ in range(10):
    try:
        camera.capture_array()
        break
    except:
        time.sleep(0.5)
else:
    raise RuntimeError("Camera failed to capture initial frame")

4. 验证格式兼容性

OpenCV默认处理BGR格式,Picamera2的RGB888在部分场景下可能出现转换异常,改用YUV420格式再转BGR(如方案1代码),能减少格式不兼容导致的初始化失败。

如果以上方案无效,先运行极简测试脚本确认摄像头独立工作正常:

from picamera2 import Picamera2
import cv2
import time

picam2 = Picamera2()
config = picam2.create_preview_configuration(main={"format": "YUV420", "size": (640, 480)})
picam2.configure(config)
picam2.start()
time.sleep(2)

while True:
    frame = picam2.capture_array()
    frame = cv2.cvtColor(frame, cv2.COLOR_YUV420p2BGR)
    cv2.imshow("Camera Test", frame)
    if cv2.waitKey(1) == ord('q'):
        break

picam2.stop()
cv2.destroyAllWindows()

如果这个脚本能正常显示画面,说明问题出在Flask集成逻辑上,重点排查方案1和权限问题。

内容的提问来源于stack exchange,提问作者1000 Nerd Street

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:20:04