首页 > 解决方案 > 在给定时间码之间从视频中每秒保存 10 帧的更有效方法 - Python

问题描述

我有一组视频和一个带有标题(开始、结束、类别、季节、剧集)的 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])

标签: pythonpython-3.xopencv

解决方案


根据所使用的视频编解码器,寻找准确的时间可能会非常昂贵 - 最多几秒钟 - 而且很可能是这里的限制因素。你应该分析你的代码来确认这个理论。

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


推荐阅读