python - 从 OpenCV-python 中的视频中保存感兴趣的帧
问题描述
下面的代码存储视频中的所有帧,然后选择并存储感兴趣的帧,在这种情况下是每 90 帧一帧。
import cv2
import numpy as np
import matplotlib.pyplot as plt
vidcap = cv2.VideoCapture("video .wmv")
success,image = vidcap.read()
count = 0
success = True
frames = []
while success:
frames.append(image)
success,image = vidcap.read()
count += 1
vidcap.release()
#print(len(frames))
interval = 90
selectframes = []
framenum = [] #frame number of the selected frame
for i in range(0,len(frames),interval):
selectframes.append(frames[i])
framenum.append(i)
虽然代码按预期工作,但我只是想知道是否有更好的方法。
解决方案
至少,你可以做if count % 90 == 0: frames.append(image)
有优化的潜力。OpenCV 的 VideoCapture 不仅有一个read()
方法,还有一对grab()
和retrieve()
方法,这正是 read() 所做的。grab() 只确保帧被获取,retrieve() 实际解码它。这可能适用于视频文件,也可能不适用(取决于后端/apiPreference 实现它的程度)。在没有retrieve() 的情况下调用grab() 将节省程序实际解码每一帧的工作量。
假设grab() 比read() 做的工作少,你可以尝试vidcap.grab() 90 次,一次vidcap.retrieve(),然后重复。
推荐阅读
- javascript - 单击以使用 Javascript 显示 div
- java - httpBasic() 和 authorizeRequest() 的区别
- c - C:尝试在不使用任何字符串库函数的情况下从字符串中删除空格
- php - 使用表单下载pdf文件后重定向
- python - py.test 没有*似乎*运行所有测试 - 并且没有失败 - 发生了什么?
- java - 如何取消 ThreadPoolTaskExecutor 任务
- css - CSS 自适应网格样式放置块
- r - 包或命名空间失败
- excel - 为 vba 用户窗体中的框架中动态创建的控件连接事件
- javascript - 在 JSXGraph 中绘制一条与直线相切的无差异曲线