【问题标题】:Efficient way to import a large amount of images from a video in python从python中的视频导入大量图像的有效方法
【发布时间】:2019-11-28 05:38:32
【问题描述】:

我目前正在为计算机视觉问题制作数据集。我想在之前的数据中添加一些数据。所以我想从 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)

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

【问题讨论】:

    标签: python opencv dataset


    【解决方案1】:

    假设通过制作数据集,您的意思是要单独保存所有帧以供在数据集中使用,最简单的选择可能是使用 ffmpeg 之类的工具来执行此操作。有关这样做的示例,请参阅here。 ffmpeg 将支持多种图像文件格式,可能包括您要保存图像的格式。

    【讨论】:

    • 我会研究它以与 cv2.imwrite 进行比较
    【解决方案2】:

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

    【讨论】:

    • 感谢您提供的信息!我不认为它会那么重,但当你想到它时,它是很明显的。在保存到数组或按照您提到的那样保存之前,我会尝试减小帧的形状:)
    猜你喜欢
    • 2021-06-23
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    相关资源
    最近更新 更多