Как создать трекбар в Open CV, чтобы я мог использовать его для перехода к определенному разделу видео?
Я должен перейти к определенной части видео, используя Open CV - Python, как трек-бар, который мы обычно видим в обычном видеоплеере. Как создать такой трекбар, который можно использовать для перехода к определенному разделу видео?
А также, как мы можем увеличить частоту кадров видео, чтобы оно выглядело так, как будто загруженное видео быстро передается.
2 ответа
Код ниже делает то, что вы хотите. Он добавляет 2 трекбара в окно отображения видео, которые управляют следующим кадром и скоростью воспроизведения.
Когда видео открывается первым, получается общее количество кадров. Это используется для установки максимума трекбара "Frame". Когда вы перемещаете ползунок на эту дорожку, вызывается функция, которая устанавливает переменную для следующего считываемого кадра.
Трекбар "Скорость" устанавливает время ожидания между кадрами, оно масштабируется в миллисекундах. Это время ожидания - это время, когда отображается кадр и пользовательский ввод может быть обработан. Это означает, что когда вы установите его ниже, время ожидания будет меньше, поэтому видео будет двигаться быстрее. Он начинается с 50, то есть около 1000/50=20 кадров в секунду. Однако обратите внимание, что на фактическую скорость также влияет код, который выполняется в цикле 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). После того, как видео было преобразовано в список изображений, используйте трекбар, чтобы выбрать нужное место в списке (часть 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()