[英]Is it possible to read webcam frames in parallel?
我有一个简单的Python脚本,可以使用OpenCV捕获网络摄像头。 我的网络摄像头可能具有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
错误消息出现在读取前几帧后。 例如,我可以启动我的脚本,这几乎会立即触发这些错误,但随后我的脚本可以在“无限”的时间内运行良好,而没有任何错误消息。
当等待开始读取大量线程之前完全读取第一帧时, 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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.