首页 > 解决方案 > 从 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)

虽然代码按预期工作,但我只是想知道是否有更好的方法。

标签: pythonopencvframe

解决方案


至少,你可以做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(),然后重复。


推荐阅读