我想以优化的方式存储图像帧数据以及使用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>
请帮忙。