树莓派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
相关产品推荐
相关产品推荐

