gpt4 book ai didi

python - 将视频加载到帧中时出现内存问题

转载 作者:太空宇宙 更新时间:2023-11-03 22:02:41 25 4
gpt4 key购买 nike

我有一个包含 160 个 FLV 视频的文件夹,每个视频有 120 帧大小为 152、360 的 RGB 颜色(3 channel ),我想加载到 numpy 数组中 frames .我用代码来做到这一点:

import numpy as np
import cv2
import os

directory = "data/"
# frames = []
frames = np.empty(shape=(160 * 120, 152, 360,3), dtype=np.float32)

for file in os.listdir(directory):
if file.endswith(".flv"):

# Create a VideoCapture object and read from input file
cap = cv2.VideoCapture(os.path.join(directory, file))

# Read until video is completed
while (cap.isOpened()):
# Capture frame-by-frame
ret, frame = cap.read()
if ret == True:
# frames.append(frame.astype('float32') / 255.)
frames[nr_frame, :, :, :] = frame.astype('float32') / 255.
nr_frame = nr_frame + 1
nb_frames_in_file = nb_frames_in_file + 1
else:
break

# When everything done, release the video capture object
cap.release()

# frames = np.array(frames)

最初我尝试使用列表 frames (请参阅注释行),而不是预先分配的 numpy 数组,但这似乎占用了太多内存 - 虽然不知道为什么。

然而,这似乎并没有太大帮助:尽管我的视频只有几 KB 大,但代码仍然非常耗费内存(许多 GB)。我想是因为cap的资源-objects(cv2.VideoCapture -objects)可能没有释放尽管我使用了cap.release() - 那是对的吗?我能做些什么来提高我的代码内存效率?

最佳答案

我推荐使用 pims为了这个任务。这是我最近一直在使用的一个非常好的 PIL 扩展。您可以将视频中的帧加载到一个对象中,该对象会在需要时调用它们。

例如,如果您有一个视频,

import pims
V = pims.Video('filename.avi')

然后您可以使用 numpy 访问视频的帧,例如索引/切片

im = V[100]

只有当你将它们转换为 numpy 数组时,它们才会保存在内存中

import numpy as np 
im = np.array(im)

您可以使用管道对整个视频进行预处理,而无需将它们调用到内存中

@pims.pipeline
def grayscale(vid):
return np.array(vid)[...,0].astype('float')/255 # float grayscale

gray = grayscale(vid)

关于python - 将视频加载到帧中时出现内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52313376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com