Извлечение кадров из нескольких видео в несколько папок - PullRequest
3 голосов
/ 09 мая 2020

Я хочу извлекать кадры каждые N секунды из 3 видео (например, vid1.flv , vid2.flv & vid3.flv ) и сохраните соответствующие кадры в их определенных c папках (где имя папки - это имя видео, то есть vid1 , vid2 & vid3 ). Как я могу это сделать?

В настоящее время я могу извлекать кадры только для одного видео, а вот мой код для одного видео:

import cv2
import os
import logging


def read_video(input_filename):
    return cv2.VideoCapture(input_filename)


def save_frame(count, sec, vid_cap, output_directory):
    vid_cap.set(cv2.CAP_PROP_POS_MSEC, sec * 1000)
    hasFrames, frame = vid_cap.read()

    if hasFrames:
        name = os.path.join(os.getcwd(), output_directory, "frame" + str(count) + ".png")
        cv2.imwrite(name, frame)

    return hasFrames


def get_frames(input_filename, output_directory, frameRate):
    """
    Capture images from a video at every (i.e, 5 sec, 5 mn, etc.)
    :param frameRate: time we want to capture the images, in seconds.
    """
    try:
        if not os.path.exists(output_directory):
            os.makedirs(output_directory)
    except OSError:
        logging.error('Error creating directory')

    sec = 0
    count = 1
    vid_cap = read_video(input_filename)
    success = save_frame(count, sec, vid_cap, output_directory)

    while success:
        count += 1
        sec = sec + frameRate
        sec = round(sec, 2)
        success = save_frame(count, sec, vid_cap, output_directory)


if __name__ == "__main__":
    input_filename = 'videos/vid1.flv'
    output_directory = 'frames'
    seconds = 30

    get_frames(input_filename, output_directory, seconds)

1 Ответ

0 голосов
/ 09 мая 2020

вы можете заменить:

if __name__ == "__main__":
    input_filename = 'videos/01_123.flv'
    output_directory = 'frames'
    seconds = 30

    get_frames(input_filename, output_directory, seconds)

на:

if __name__ == "__main__":
    input_filename = 'videos/01_123.flv'
    output_directory = 'frames01'
    seconds = 30

    get_frames(input_filename, output_directory, seconds)

    input_filename = 'videos/02_123.flv'
    output_directory = 'frames02'
    seconds = 30

    get_frames(input_filename, output_directory, seconds)

Копировать / вставить - ваш друг, чтобы добавить больше видео, если вам нужно.


если вы любите приключения, вы можете даже попробовать создать al oop:

if __name__ == "__main__":
    for num in range(3) :
        input_filename = 'videos/%02d_123.flv' % (num+1)
        output_directory = 'frames%02d' % (num+1)
        seconds = 30

        get_frames(input_filename, output_directory, seconds)

наконец, вы можете автоматически l oop поверх существующих видео:

if __name__ == "__main__":
    root, dirs, files = os.walk( 'videos' ).next()
    for f in files :
        input_filename = os.path.join( root, f )
        output_directory = f.split('.')[0]
        seconds = 30
        get_frames(input_filename, output_directory, seconds)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...