Один удивительно простой способ внести незначительное улучшение в это - использовать список Python для фактического сдвига / добавления, а затем повторно создать экземпляр буфера как новый массив NumPy, например:
import numpy as np
import cv2
import itertools
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
middle = 0
while i < total:
if not i:
start = time.time()
status, frame = cap.read()
t = time.time()
if i < total/2:
buffer[i] = frame
else:
list_buffer = [item for item in buffer[1:]]
list_buffer.append(frame)
buffer = np.asanyarray(list_buffer)
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))
На моей машине это занимает второе время с 1,7 секунды до 1,36 секунды. Не значительное улучшение, но и не незначительное (ускорение ~ 20%).
Однако, если мы вместо этого используем list_buffer во всем l oop, чтобы отслеживать содержимое буфера и просто делать оба наш срез и добавление к , что :
import numpy as np
import cv2
import itertools
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
middle = 0
list_buffer = []
while i < total:
if not i:
start = time.time()
status, frame = cap.read()
t = time.time()
if i < total/2:
buffer[i] = frame
list_buffer.append(frame)
else:
list_buffer = list_buffer[1:]
list_buffer.append(frame)
buffer = np.asanyarray(list_buffer)
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))
, внезапно наш вывод будет выглядеть так:
>>> 0.08505516052246094
>>> 0.08459827899932862
Надеюсь, что поможет!