在python中从视频导入大量图像的有效方法

时间:2019-07-19 08:50:55

标签: python opencv dataset

我目前正在为计算机视觉问题制作数据集。我想向以前的数据中添加一些数据。所以我想从2个不同的视频中获得约3000帧。

我使用openCV是因为我知道捕获功能,但是我不确定,因为我的内存确实在爆炸。我正在对以前已经处理过的数据集使用pickle文件,并且我的内存中有这么多信息没有问题。也许我的代码很可怕,却没有引起注意...

这是我的代码,可以从视频中获取约3000帧:

import cv2
video_name1 = "videosDataset/AMAZExNHORMS2019_Lo-res.mp4"

video_name2 = "videosDataset/CAMILLATHULINS2019_Lo-res.mp4"

def getAllFrames(videoName):
    video_name = videoName
    property_id =int(cv2.CAP_PROP_FRAME_COUNT)
    cap = cv2.VideoCapture(video_name) #video_name is the video being called
    frames = []
    length = int(cv2.VideoCapture.get(cap, property_id))
    print(length)
    minL = int(length/2)
    maxL = int(2*length/3)
    print(minL,maxL)
    for i in range(minL,maxL):
        cap.set(1,i); # Where frame_no is the frame you want
        ret, frame = cap.read() # Read the frame
        frames.append(frame)
        print(str(round((i-minL)/(maxL-minL)*100, 2))+'%')
    return frames

frames1 = getAllFrames(video_name1)

我想知道是否有更好的方法可以做到这一点。谢谢

2 个答案:

答案 0 :(得分:1)

假设通过创建数据集,您的意思是要保存所有帧以供数据集中使用,最简单的选择可能是使用ffmpeg之类的工具。有关示例,请参见here。 Ffmpeg将支持多种图像文件格式,可能包括您要用于保存图像的格式。

答案 1 :(得分:1)

这里的问题是压缩-读取时,每个帧都存储为numpy数组,这非常昂贵。例如,一个1280 x 720像素的RGB帧以jpg格式约为200 kB,以png格式约为1.2 MB,以numpy uint8数组存储时为2.7 MB,而以numpy float64数组存储时为22 MB。 最简单的解决方案是将每个帧作为jpg图像存储到磁盘(例如,通过cv2.imwrite),而不是创建包含所有帧的数组。