【发布时间】:2020-06-20 03:00:41
【问题描述】:
如何构建可以执行 numpy 数组操作的高性能视频流缓冲区?
这是我目前的实现 - 我只是将前一个数组向前移动 1 帧并将最后一个元素分配给当前帧。
import numpy as np
import cv2
import time
cap = cv2.VideoCapture(0)
status, frame = cap.read()
buffer = np.empty([100, frame.shape[0], frame.shape[1], frame.shape[2]])
i=0
total = 100
while i < total:
if not i:
start = time.time()
status, frame = cap.read()
t = time.time()
if i < total/2:
buffer[i] = frame
else:
buffer[:-1] = buffer[1:]
buffer[-1] = frame
if i == total/2:
middle = t
i += 1
# Calculations on the buffer ommitted for brevity but include mean, std, etc.
stop = time.time()
print((middle-start)/(total/2))
print((stop-middle)/(total/2))
与简单地将帧的值分配给数组的元素相比,移动数组需要大约 350 倍的时间。我知道这是因为我正在移动数组中的所有指针,这是不必要且昂贵的。保持框架井井有条很好,但不是必需的。
【问题讨论】:
-
如果
buffer中存储的帧顺序对于预期的操作不重要,可以循环存储,即0,1,...99,0,1。 .. 等等。因此,我认为这取决于有关预期操作的缺失信息。还有,middle有什么意义? -
您能否进一步解释一下您的最终目标是什么? OpenCV 使用 Numpy 数组来显示图像,因此您可以直接在
frame上执行 numpy 数组操作@
标签: python arrays numpy linked-list video-streaming