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

时间:2015-10-02 01:05:58

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

我有一个简单的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错误消息。例如,我可以启动我的脚本,这几乎会瞬间触发这些错误,但是我的脚本可以在“无限”的时间内运行正常,没有任何错误消息。

1 个答案:

答案 0 :(得分: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。