在给定时间码之间,从视频中每秒保存10帧的更有效方法-Python

时间:2018-07-18 10:08:51

标签: python python-3.x opencv

我有一组视频,还有一个CSV文件,其标题(开始,结束,类别,季节,剧集)的标题是在文件的每一行的起点和终点之间每秒保存10张图像。我设计的方法(请参阅下文)首先读取CSV文件并创建一个整数列表(起点和终点之间每100毫秒)。然后使用cv2加载视频,转到列表中给定的帧,并逐步保存每个视频。

我的问题是,有一种更快的方法可以执行此操作,尽管我尚未进行任何速度测试或类似的测试,但该方法似乎有点慢且笨拙。任何帮助表示赞赏。

import csv
import cv2

def readCSV():
    times = []
    reader = csv.DictReader(open("timecode.csv"))
    for i in reader:       
        l = range( ((int(str(i["start"])[0:2]))*60000) + 
                   ((int(str(i["start"])[2:4]))*1000), 

                   ((int(str(i["end"])[0:2]))*60000) + 
                   ((int(str(i["end"])[2:4]))*1000) )
        for j in l[::100]:
            times.append([i["season"], i["episode"], j, i["interaction"]])

    return times

def vid_to_frame(season, episode, timecode, category):
    vid = cv2.VideoCapture("s{}_e{}.mp4".format(str(season).zfill(2),
                                                str(episode).zfill(2)))
    vid.set(cv2.CAP_PROP_POS_MSEC, float(timecode))
    success, image = vid.read()
    if success:
        cv2.imwrite("E:/Hammond/readingVideos/imageSamples/{}/{}.jpg"
                    .format(str(category), str(timecode)), image)

for n in readCSV():
    vid_to_frame(n[0], n[1], n[2], n[3])

1 个答案:

答案 0 :(得分:0)

根据所使用的视频编解码器,寻找准确的时间可能会非常昂贵-高达几秒的数量级-并且很可能是此处的限制因素。您应该分析代码以确认这一理论。

当您提取多个连续的帧时,打开视频文件一次,查找要提取的第一个帧,然后继续逐帧解码文件会更快。写出您感兴趣的框架,而忽略其余部分。将代码重组为每个文件只有一个VideoCapture,每个提取帧范围只有一个set(cv2.CAP_PROP_POS_MSEC, float(timecode))