在OpenCVpython中保存视频中的感兴趣帧

2024-10-03 09:09:54 发布

您现在位置: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)

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


Tags: 代码imageimportreadframeslenascount
2条回答

至少,你可以做if count % 90 == 0: frames.append(image)

有优化的潜力。OpenCV的VideoCapture不仅有一个read()方法,还有一对grab()retrieve()方法,这正是read()所做的。grab()只确保获取了帧,retrieve()实际对其进行解码。这可能对视频文件起作用,也可能不起作用(取决于后端/API首选项实现它的效果)。在不使用retrieve()的情况下调用grab()可以节省程序实际解码每个帧的工作量

假设grab()比read()做的工作更少,您可以尝试vidcap.grab()90次,一次尝试vidcap.retrieve(),然后重复

你可以试试这个

import cv2
import os
count=1

vidcap = cv2.VideoCapture('video.wmv')
def getFrame(sec):
    vidcap.set(cv2.CAP_PROP_POS_MSEC,sec*1000)
    hasFrames,image = vidcap.read()
    if hasFrames:
        dim = (512, 512)
        resized = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
        cv2.imwrite("images/"+str(count)+".png", resized)
    return hasFrames
sec = 0
frameRate = 90/1000

success = getFrame(sec)
while success:
    count = count + 1
    sec = sec + frameRate
    sec = round(sec, 2)
    success = getFrame(sec)

相关问题 更多 >