我必须使用Open CV-Python跳到视频的特定部分,就像我们通常在普通视频播放器中看到的轨迹栏一样。如何创建可用于跳至视频特定部分的跟踪栏?
以及如何提高视频的帧速率,以使加载的视频看起来像快进一样。
答案 0 :(得分:1)
以下代码可满足您的需求。它在视频显示窗口中添加了两个跟踪栏,用于控制下一帧和播放速度。
首先打开视频时,将检索总帧数。这用于设置“框架”轨迹栏的最大值。在该轨迹栏上移动滑块时,将调用一个函数,该函数设置要读取的下一帧的变量。
“速度”轨迹栏设置帧之间的等待时间,以毫秒为单位缩放。该等待时间是显示帧和可以处理用户输入的时间。这意味着当您将其设置得较低时,等待时间会缩短,因此视频移动速度更快。它从50开始,因此约为1000/50 = 20 fps。但是请注意,实际速度还受while循环中运行的代码的影响,这会添加到等待时间中。例如,当我在等待时间1毫秒播放视频时,实际时间平均为6毫秒。
为了获得最快的速度,请删除更新“框架”滑块位置的代码行。
代码:
import cv2
import numpy as np
# function called by trackbar, sets the next frame to be read
def getFrame(frame_nr):
global video
video.set(cv2.CAP_PROP_POS_FRAMES, frame_nr)
# function called by trackbar, sets the speed of playback
def setSpeed(val):
global playSpeed
playSpeed = max(val,1)
# open video
video = cv2.VideoCapture("video.webm")
# get total number of frames
nr_of_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
# create display window
cv2.namedWindow("Video")
# set wait for each frame, determines playbackspeed
playSpeed = 50
# add trackbar
cv2.createTrackbar("Frame", "Video", 0,nr_of_frames,getFrame)
cv2.createTrackbar("Speed", "Video", playSpeed,100,setSpeed)
# main loop
while 1:
# Get the next videoframe
ret, frame = video.read()
# show frame, break the loop if no frame is found
if ret:
cv2.imshow("Video", frame)
# update slider position on trackbar
# NOTE: this is an expensive operation, remove to greatly increase max playback speed
cv2.setTrackbarPos("Frame","Video", int(video.get(cv2.CAP_PROP_POS_FRAMES)))
else:
break
# display frame for 'playSpeed' ms, detect key input
key = cv2.waitKey(playSpeed)
# stop playback when q is pressed
if key == ord('q'):
break
# release resources
video.release()
cv2.destroyAllWindows()
答案 1 :(得分:0)
最简单的方法是将所有图像读入列表(第1部分)。将视频转换为图像列表后,使用轨迹栏在列表中选择所需的位置(第2部分)。
运行此脚本时,请打开内存分析器。
import cv2
frames = []
cap = cv2.VideoCapture(0)
# Read images into list (part 1)
while True:
_, img = cap.read()
frames.append(img)
cv2.imshow('img', img)
k = cv2.waitKey(1)
if k ==27: break
cap.release()
cv2.destroyAllWindows()
print(len(frames))
# Setup trackbars
def nothing(arg): pass
cv2.namedWindow('img')
cv2.createTrackbar('frame_number', 'img', 0,len(frames), nothing)
# Show the image selected by the trackbar (part 2)
while True:
frame_number = cv2.getTrackbarPos('frame_number', 'img')
print(frame_number)
img = frames[frame_number]
cv2.imshow('img', img)
k = cv2.waitKey(1)
if k ==27: break
cv2.destroyAllWindows()