我有一组视频,还有一个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])
答案 0 :(得分:0)
根据所使用的视频编解码器,寻找准确的时间可能会非常昂贵-高达几秒的数量级-并且很可能是此处的限制因素。您应该分析代码以确认这一理论。
当您提取多个连续的帧时,打开视频文件一次,查找要提取的第一个帧,然后继续逐帧解码文件会更快。写出您感兴趣的框架,而忽略其余部分。将代码重组为每个文件只有一个VideoCapture
,每个提取帧范围只有一个set(cv2.CAP_PROP_POS_MSEC, float(timecode))
。