将大量图像帧numpy数据存储并加载到内存中

时间:2018-03-23 11:48:49

标签: python python-3.x numpy opencv

我想以优化的方式存储图像帧数据以及使用OpenCV提取的图像帧时间戳,然后将其加载回处理它,这里是代码:

import cv2
import pickle

video_capture = cv2.VideoCapture('/tmp/abc.mp4')
success, frame = video_capture.read()
fps = video_capture.get(5)
frame_number = 0

success = True
frames_arr = []

while success:
   timestamp = 1000 * float(frame_number) / fps

   '''
   frame is a numpy ndarray, Sample data given
   {'matrix': array([[[0., 0., 0.],
     [0., 0., 0.],
     [0., 0., 0.]],

    [[0., 0., 0.],
     [0., 0., 0.],
     [0., 0., 0.]],

    [[0., 0., 0.],
     [0., 0., 0.],
     [0., 0., 0.]]]), 'timstamp': 123}
   '''

   frame_dict = {
       'timestamp': timestamp,
       'frame_matrix': frame
   }


   # Appending to frame array  
   # Conveting each dictionary to string and encoding it
   frames_arr.append(str(frame_dict).encode('utf-8'))

   success, frame = video_capture.read()
   frame_number += 1

# Storing all frames data into one pickle file
with open('/tmp/frame_data.pkl', 'wb') as bf:
    pickle.dump(frames_arr, bf)

如果我直接保存字典需要时间和空间(对于1700帧为2.2 Gb - 1分钟视频文件),所以我想把它存储为字符串(1.5mb)并再次转换回字典。

我能够加载.pkl文件并访问数据但无法将其转换回字典,这里是加载和访问数据的代码

with open('/tmp/frames_data.pkl', 'rb') as f:
    data = pickle.load(f)

for i, single in enumerate(data):
    print(single.decode('utf-8'), type(single.decode('utf-8')))

我将type(single.decode('utf-8'))作为<class 'str'>,因此我尝试了ast.literal_eval但是它会抛出

ValueError: malformed node or string: <_ast.Call object at 0x7fa53e2c15c0>

如果不是这样,那么其他的解决方法是什么,我有4Gb的RAM和持续3-4分钟的视频,如果我没有转换为字符串并尝试保存直接字典,它会在保存时挂起。 / p>

请帮忙。

0 个答案:

没有答案