【问题标题】:Is it possible to read webcam frames in parallel?是否可以并行读取网络摄像头帧?
【发布时间】:2015-12-30 04:28:21
【问题描述】:

我有一个简单的Python 脚本,它使用OpenCV 捕获网络摄像头。 My webcam 有可能流式传输 30 FPS,但由于我的 Raspberry Pi 不够强大,我只能读取 ~ 20 FPS。运行脚本时,我的 CPU 的一个核心最高达到 100%,但其余核心保持不变,所以我试图将读数分成我能做到的最多线程,以最大限度地使用我的 CPU潜力并轻松达到 30 FPS。

那么是否可以并行读取网络摄像头帧?

这是我的尝试:

import numpy as np
import cv2
import time
from threading import Thread


CV_CAP_PROP_FPS = 5

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output.avi', fourcc, cap.get(CV_CAP_PROP_FPS), (640, 480))
threads = []

class MyThread(Thread):
    def run(self):
        ret, frame = cap.read()

if __name__ == '__main__':
    try: 
        while(cap.isOpened()):
            thread = MyThread()
            thread.start()
            threads.append(thread)
            time.sleep(0.035)
    except KeyboardInterrupt:
        for thread in threads:
            thread.join()
        cap.release()
        out.release()

运行此脚本时,我在终端中收到了几个VIDIOC_QBUF: Invalid argument(通常是 4 次)。睡眠值越大,我收到的错误消息就越少。例如,如果我time.sleep(0.1),我可能会收到 2-3 条错误消息而不是 4 条。

这是有问题的,因为在我的脚本的第二部分(未在此处发布)中生成的视频文件已损坏。此错误仅在并行读取网络摄像头源时发生。按顺序执行所有内容时,视频文件很好,我可以毫无问题地阅读它。

非常感谢任何见解。干杯!

编辑: 我认为同样重要的是要注意VIDIOC_QBUF: Invalid argument 错误消息发生在阅读前几帧之后。例如,我可以启动我的脚本,这几乎会立即触发这些错误,但随后我的脚本可以在“无限”时间内正常运行而不会出现任何错误消息。

【问题讨论】:

    标签: python multithreading opencv frame-rate webcam-capture


    【解决方案1】:

    在启动大量线程之前等待第一帧被完全读取时,VIDIOC_QBUF: Invalid argument 消失!

    ...
    try: 
        ret, frame = cap.read()
        while(cap.isOpened()):
            thread = MyThread()
            thread.start()
            threads.append(thread)
            time.sleep(0.035)
    ...
    

    请注意,即使所有 CPU 内核都使用此算法,我能够达到的最大 FPS 也是 24。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 2013-09-25
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      相关资源
      最近更新 更多