赞
踩
我有一个简单的Python脚本,它使用OpenCV捕获网络摄像头。^{3fps}我只能读30帧流,但我不能读。当运行脚本时,我的一个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错误消息发生在读取前几帧之后。例如,我可以启动我的脚本,这几乎会立即触发这些错误,但是我的脚本可以在“无限”的时间内正常运行,而不会出现任何错误消息。在
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。