Извлечение видеокадров на python с помощью cv2

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

это даст вам точную частоту кадров