我们如何在Open CV中创建一个trackbar,以便我可以使用它跳到视频的特定部分?

2024-04-18 07:20:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须使用opencv-Python跳过视频的特定部分,就像我们通常在普通视频播放器中看到的轨迹条一样。我如何创建这样的轨迹栏,可以用来跳到视频的特定部分?在

以及如何提高视频的帧速率,使加载的视频看起来像是快速转发的。在


Tags: 视频速率轨迹播放器opencv
2条回答

实现这一点的最简单方法是将所有图像读入一个列表(第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()

下面的代码可以满足您的需要。它在视频显示窗口中添加了2个轨迹条,用于控制下一帧和播放速度。
首先打开视频时,检索总帧数。用于设置“帧”轨迹条的最大值。当您移动该轨迹条上的滑块时,会调用一个函数来设置要读取的下一帧的变量。
“速度”轨迹条设置帧之间的等待时间,以毫秒为单位缩放。等待时间是显示帧和处理用户输入的时间。这意味着,当你设置得更低时,等待时间会更短,因此视频移动得更快。它从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()

相关问题 更多 >