我正在使用Python OpenCV读取视频数据,并希望存储K个帧。目前,我有一个循环执行以下操作(伪代码):
我现在有一个名为
这是我现在正在做的事情,但这并不起作用(它太慢了):
更新: 这是我从OpenCV读取帧的方法:
frame_list = 1:K
frame_buffer = list(map(ReadFrameNumber, frame_list))
我现在有一个名为
frame_buffer
的列表,其中包含K个帧,数据是一个NxMx3的numpy数组。这一切都很好,但现在我想重新组织数据,以便我可以有效地使用scikit-learn尝试一些模型。为了做到这一点,我需要创建一个可以结构化为((N*M*3) x (K))或((K) x (N*M*3)矩阵的numpy数组。我可以成功地做到这一点,但数据正在被复制,这使得该函数非常缓慢。我使用numpy.ravel
、numpy.asarray
和numpy.transpose
的组合来完成我的缓慢方法。我基本上只想要一个新的数据视图。这是我现在正在做的事情,但这并不起作用(它太慢了):
def RearrangeData(data):
b = list(map(np.ravel, data))
b = np.asarray(b, dtype=np.float32)
return b
更新: 这是我从OpenCV读取帧的方法:
import numpy as np
import cv2
K= 10
num_frames = K
cap = cv2.VideoCapture(filename)
def PopulateBuffer(num):
cap.set(cv2.CAP_PROP_POS_FRAMES, num)
ret, frame = cap.read()
if not ret:
print("Fatal Error: Could not read/decode frame %d" % num)
exit(-1)
return frame
frame_nums = list(range(0, int(num_frames)))
return (list(map(PopulateBuffer, frame_nums)))
np.array([arr1,arr2,...,arrK])
会生成一个(K,N,M,3)
的数组。是的,每个arr_i.data
缓冲区都将被复制到目标缓冲区。在列表中,它们分散在内存中,在目标位置它们是在一起的。但是,由于这种形状,复制将按块进行。 - hpaulj