python - 在给定时间码之间从视频中每秒保存 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])
解决方案
根据所使用的视频编解码器,寻找准确的时间可能会非常昂贵 - 最多几秒钟 - 而且很可能是这里的限制因素。你应该分析你的代码来确认这个理论。
当您提取多个连续帧时,打开视频文件一次会更快,寻找您要提取的第一帧,然后继续逐帧解码文件。写下你感兴趣的框架,然后忽略其余的。VideoCapture
将代码重构为每个文件只有一个,set(cv2.CAP_PROP_POS_MSEC, float(timecode))
每个提取的帧范围只有一个。
推荐阅读
- nativescript - Nativescript observableArray with observable.fromObject - 自动更新视图
- grafana - prometheus:是否可以使用仪表的事件编号作为计数器?
- typescript - rxjs 管道和订阅(在主题上)在两个单独的步骤中没有按预期工作
- jquery - 将特定表数据排序为日期,但在 DataTables 中作为文本进行排序
- c# - 如何在运行时将一些 MP3 文件从 android 存储添加到流媒体资产文件夹?
- java - android如何在onBackPressed()时为viewpager设置特定的项目位置?
- c - &array[0], &array 或数组
- powershell - Remove-WmiObject 不起作用,而且 $profile.Delete()
- laravel - 如何转换为 laravel 雄辩
- c# - 将不同图片框中的多个图像保存到database.c中的不同字段#