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

如何解决同一树莓派摄像头被两个Python3程序同时调用的冲突问题

问题核心原因

树莓派的CSI摄像头设备为独占资源,同一时间仅允许一个进程访问,你两个程序分别调用VideoStream和cv2.VideoCapture本质都是抢占/dev/video0设备节点,因此必然出现调用冲突。

最优解决方案:合并两个程序逻辑到同一进程

该方案性能开销最低,适配成本最小,无需额外依赖:

  1. 仅保留一份摄像头初始化逻辑,直接复用口罩识别程序的VideoStream实例,删除二维码程序中cv2.VideoCapture(0)、cap.read()、cap.release()相关的摄像头操作代码
  2. 将二维码程序的全局变量(按键回调、QRCodeDetector实例、CSV读写逻辑等)全部迁移到口罩识别程序的初始化部分
  3. 在口罩识别的主循环中,每次拿到视频帧后,同时执行两个任务:
    • 原有口罩识别推理逻辑
    • 按键状态判断+二维码检测逻辑
      示例核心代码结构:
# 原有口罩识别的导入和初始化部分保留
from imutils.video import VideoStream
import cv2
# 新增二维码相关导入
import re
import datetime
import board

# 仅保留一份摄像头初始化
vs = VideoStream(src=0).start()
qr_detector = cv2.QRCodeDetector()

# 二维码相关全局变量和回调
def sw1Pressed():
    global sw1Press
    sw1Press = True
sw1.when_pressed = sw1Pressed
sw1Press = False

# 主循环
while True:
    frame = vs.read()
    # 1. 执行原有口罩检测逻辑
    detect_mask(frame, faceNet, maskNet)
    # 2. 执行二维码检测逻辑
    if sw1Press == True:
        led.toggle()
        data, bbox, _ = qr_detector.detectAndDecode(frame)
        # 原有二维码程序的框选、CSV读写、打印逻辑直接复用
        # ... 省略原有二维码业务代码
    if cv2.waitKey(1) == ord("q"):
        break

# 统一释放资源
vs.stop()
led.off()
cv2.destroyAllWindows()
备选方案:独立摄像头推流服务

如果必须保留两个独立程序的架构,可以单独运行一个摄像头推流进程,独占摄像头后将视频帧推到本地HTTP端口,两个业务程序都通过本地拉流的方式获取帧,不会产生设备抢占:

  1. 单独写一个推流脚本,用VideoStream读帧,启动轻量HTTP服务输出MJPEG流
  2. 两个业务程序都通过cv2.VideoCapture("http://127.0.0.1:8080/stream")的方式拉取视频流
    该方案可扩展性更高,但会额外占用10%左右的CPU资源,适合后续需要新增更多视觉任务的场景。
性能优化建议

树莓派3B+算力有限,双任务同时运行时可做如下优化:

  • 将摄像头分辨率设置为640*480,帧率限制在15-20帧
  • 口罩检测每帧执行,二维码检测可改为每2-3帧执行一次,降低CPU占用

内容的提问来源于stack exchange,提问作者sya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:54:03