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

标签 python opencv opencv-python

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

以及我们如何提高视频的帧速率,以便加载的视频看起来像是快进的。

最佳答案

下面的代码可以满足您的要求。它在视频显示窗口中添加了 2 个轨迹栏,用于控制下一帧和播放速度。
首次打开视频时,将检索帧总数。这用于设置“框架”轨迹栏的最大值。当您移动该轨迹栏上的 slider 时,将调用一个函数来设置要读取的下一帧的变量。
“速度”轨迹栏设置帧之间的等待时间,以毫秒为单位。该等待时间是显示帧和可以处理用户输入的时间。这意味着当您将其设置得较低时,等待时间会较短,因此视频移动速度会更快。它从 50 开始,因此大约为 1000/50=20 fps。但请注意,实际速度还受到 while 循环中运行的代码的影响,这会添加到等待时间中。例如,当我以 1 毫秒的等待时间运行视频时,实际时间平均为 6 毫秒。
为了获得最大速度,请删除更新“框架” slider 位置的代码行。

代码:

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()

关于python - 我们如何在 Open CV 中创建一个轨迹栏,以便我可以使用它跳到视频的特定部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54674343/

相关文章:

numpy - python opencv2,错误的摄像头界面,仅cam light

python - cv2.imshow() 循环打开多个窗口

python - 找出最低营业额账户

python - 绘制法国国旗

python - 填充经过过滤的轮廓OpenCV Python内部

c++ - 如何在 C++ 或 OpenCV SubMatrix 中的 2D 子 vector 上使用 OpenACC?

python - 如何处理CV2(Cv2.imwrite)中的错误?

python - Dask Dataframe 形状属性给出了错误的形状

c# - 打开CV非基本形状检测

python - 在 Windows 上通过 Anaconda 安装 OpenCV for Python 时出现 UnsatisfiableError