#python #python-3.x #video-processing #cv2
Вопрос:
Я хочу разбить свое видео на кадры.
Я использую следующий код:
import cv2
import numpy as np
import os
# Playing video from file:
cap = cv2.VideoCapture('myvideo.mp4')
cap.set(cv2.CAP_PROP_FPS, 5)
try:
if not os.path.exists('data'):
os.makedirs('data')
except OSError:
print ('Error: Creating directory of data')
currentFrame = 0
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Saves image of the current frame in jpg file
name = './data/frame' str(currentFrame) '.jpg'
print ('Creating...' name)
cv2.imwrite(name, frame)
# To stop duplicate images
currentFrame = 1
if not ret: break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
Я установил частоту кадров в секунду = 5, а «myvideo.mp4» длится 0:55 секунд. Итак, я ожидал бы, что у меня будет 55*5 = 275 кадров, но приведенный выше код дает мне намного больше кадров и не прекращает генерировать кадры. Что-то не так в коде?
Комментарии:
1.
cap.set(cv2.CAP_PROP_FPS, 5)
используется для захвата видео с камеры, где вы можете контролировать частоту кадров. Команда не влияет на считывание кадров из видеофайла. Вы можете пропускать кадры — например, сохранять каждый 5-й кадр. Например:if currentFrame % 5 == 0:
cv2.imwrite
… Примечание: Переместитесьif not ret: break
, чтобы быть сразу послеret, frame = cap.read()
этого .
Ответ №1:
если вам нужна правильная частота кадров, вы можете сделать
framerate = vid.get(5)
вместо
cap.set(cv2.CAP_PROP_FPS, 5)
это даст вам точную частоту кадров