Артефакт вырезания видеосцены на основе OpenCV

OpenCV

окрестности

  • windows 10 64bit
  • anaconda with python 3.7
  • pyscenedetect 0.5.5

Введение

Любой, кто знаком с видеоклипами, должен знать слово «переход». Переход от одной видеосцены к другой, а также переход или переход между сценами называется переходом. В этой статье представлен мощный инструмент с открытым исходным кодом.PySceneDetect, который основан наopencvИнструмент обнаружения и анализа переключения видеосцен, адрес проекта:GitHub.com/breakDiva Мягкий свет…

Установить

Во-первых, мы создаем совершенно новую виртуальную среду

conda create -n pyscenedetect python=3.7
conda activate pyscenedetect

Далее вам нужно будет установить видеообработкуffmpeg. Скачайте скомпилированные бинарники с официального сайтаffmpeg.org/download.Контракты…и добавьте его путь в переменную системной среды

pyscenedetect

Наконец, войдите в настоящую стадию установки, на самом деле всего одно предложение

pip install scenedetect opencv-python

Да, это так просто

тест командной строки

pyscenedetectПредоставляет инструмент командной строки, к которому можно получить доступ через-hпараметр для просмотра справочной информации

Usage: scenedetect [OPTIONS] COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]...

  For example:

  scenedetect -i video.mp4 -s video.stats.csv detect-content list-scenes

  Note that the following options represent [OPTIONS] above. To list the
  optional [ARGS] for a particular COMMAND, type `scenedetect help COMMAND`.
  You can also combine commands (e.g. scenedetect [...] detect-content save-
  images --png split-video).

Options:
  -i, --input VIDEO             [Required] Input video file. May be specified
                                multiple times to concatenate several videos
                                together. Also supports image sequences and
                                URLs.
  -o, --output DIR              Output directory for all files (stats file,
                                output videos, images, log files, etc...).
  -f, --framerate FPS           Force framerate, in frames/sec (e.g. -f
                                29.97). Disables check to ensure that all
                                input videos have the same framerates.
  -d, --downscale N             Integer factor to downscale frames by (e.g. 2,
                                3, 4...), where the frame is scaled to width/N
                                x height/N (thus -d 1 implies no downscaling).
                                Each increment speeds up processing by a
                                factor of 4 (e.g. -d 2 is 4 times quicker than
                                -d 1). Higher values can be used for high
                                definition content with minimal effect on
                                accuracy. [default: 2 for SD, 4 for 720p, 6
                                for 1080p, 12 for 4k]
  -fs, --frame-skip N           Skips N frames during processing (-fs 1 skips
                                every other frame, processing 50% of the
                                video, -fs 2 processes 33% of the frames, -fs
                                3 processes 25%, etc...). Reduces processing
                                speed at expense of accuracy.  [default: 0]
  -m, --min-scene-len TIMECODE  Minimum size/length of any scene. TIMECODE can
                                be specified as exact number of frames, a time
                                in seconds followed by s, or a timecode in the
                                format HH:MM:SS or HH:MM:SS.nnn  [default:
                                0.6s]
  --drop-short-scenes           Drop scenes shorter than `--min-scene-len`
                                instead of combining them with neighbors
  -s, --stats CSV               Path to stats file (.csv) for writing frame
                                metrics to. If the file exists, any metrics
                                will be processed, otherwise a new file will
                                be created. Can be used to determine optimal
                                values for various scene detector options, and
                                to cache frame calculations in order to speed
                                up multiple detection runs.
  -v, --verbosity LEVEL         Level of debug/info/error information to show.
                                Setting to none will suppress all output
                                except that generated by actions (e.g.
                                timecode list output). Can be overriden by
                                `-q`/`--quiet`.
  -l, --logfile LOG             Path to log file for writing application
                                logging information, mainly for debugging.
                                Make sure to set `-v debug` as well if you are
                                submitting a bug report.
  -q, --quiet                   Suppresses all output of PySceneDetect except
                                for those from the specified commands.
                                Equivalent to setting `--verbosity none`.
                                Overrides the current verbosity level, even if
                                `-v`/`--verbosity` is set.
  -h, --help                    Show this message and exit.

Commands:
  about             Print license/copyright info.
  detect-content    Perform content detection algorithm on input video(s).
  detect-threshold  Perform threshold detection algorithm on input video(s).
  export-html       Exports scene list to a HTML file.
  help              Print help for command (help [command]).
  list-scenes       Prints scene list and outputs to a CSV file.
  save-images       Create images for each detected scene.
  split-video       Split input video(s) using ffmpeg or mkvmerge.
  time              Set start/end/duration of input video(s).
  version           Print version of PySceneDetect.

Найдите видео с переключением нескольких сцен, чтобы протестировать его и выполнить команду

scenedetect.exe -i lldq.mp4 detect-content split-video

После запуска скрипта в текущем каталоге будет сгенерировано короткое видео.

pyscenedetect

Каждое видео содержит только одну сцену

pyscenedetect

Если вы хотите начать с определенного момента видео, вы можете использовать параметрtime

scenedetect.exe -i lldq.mp4 time -s 5s detect-content split-video

Вы также можете сохранять изображения обнаруженных сцен и одновременно генерировать статистические файлы.csv

scenedetect.exe -i lldq.mp4 -o video_scenes detect-content save-images

pyscenedetect

Алгоритм нарезки сцен

pyscenedetectИспользуются 2 метода нарезки сцен, ониdetect-contentиdetect-threshold, в дополнение к этому, он также поддерживает пользовательские алгоритмы обнаружения.

  • detect-content

    Как следует из названия, этот метод основан на содержании переднего и заднего изображений, что соответствует видеопереходу в нашем здравом смысле. Алгоритм рассчитает их разные размеры области на основе видеоданных двух кадров до и после.Если эта область больше заданного значения (по умолчанию 30, вы можете передать--thresholdпараметр указать), то считается, что сцена была переключена.

  • detect-threshold

    Это более традиционный метод обнаружения, немного похожий наffmpegсерединаblackframeфильтр. Он будет использовать определенное значение для сравнения яркости кадра данных.Если оно больше заданного значения, считается, что сцена была переключена. существуетpyscenedetect, это значение определяется каждым пикселем видеокадраRGBрассчитывается из среднего.

  • Пользовательский алгоритм обнаружения

    Все алгоритмы обнаружения должны наследоваться отSceneDetectorэтот класс

    from scenedetect.scene_detector import SceneDetector
    
    class CustomDetector(SceneDetector):
        """CustomDetector class to implement a scene detection algorithm."""
        def __init__(self):
            pass
    
        def process_frame(self, frame_num, frame_img, frame_metrics, scene_list):
            """Computes/stores metrics and detects any scene changes.
    
            Prototype method, no actual detection.
            """
            return
    
        def post_process(self, scene_list):
            pass
    

    В классе в основном 2 метода,process_frameОтвечает за обработку всех кадров видео;post_processявляется необязательным, он находится вprocess_frameВыполняется после окончания, в основном используется для некоторой постобработки, например, для сохранения файлов данных переключения сцен.

    Давайте посмотрим на следующееprocess_frameметод, который имеет следующие важные параметры

    • frame_num: количество кадров, обрабатываемых в данный момент.
    • frame_img: возвращаемые данные кадра, форматnumpyмножество
    • frame_metrics: словарь, в котором хранятся результаты расчета алгоритма обнаружения.
    • scene_list: список номеров кадров, включенных во все переходы между сценами в видео.

    Дополнительные сведения о реализации см. в каталоге исходного кода.scenedetect/detectors/content_detector.pyилиscenedetect/detectors/threshold_detector.py

Использование Python API

Если вам нужно использовать его в своем собственном кодеpyscenedetect, в дополнение к использованию метода вызова из командной строки,pyscenedetectтакже предоставляется на основанииpythonизAPI.

Ниже приведен простойdemo, программа читает видеофайл, используяcontent-detectorАлгоритм определяет и, наконец, распечатывает время начала, время окончания и общее количество кадров всех сцен.

from scenedetect.video_manager import VideoManager
from scenedetect.scene_manager import SceneManager
from scenedetect.stats_manager import StatsManager
from scenedetect.detectors.content_detector import ContentDetector


def find_scenes(video_path):
    video_manager = VideoManager([video_path])
    stats_manager = StatsManager()
    scene_manager = SceneManager(stats_manager)

    # 使用contect-detector
    scene_manager.add_detector(ContentDetector())

    try:
        video_manager.set_downscale_factor()

        video_manager.start()

        scene_manager.detect_scenes(frame_source=video_manager)

        scene_list = scene_manager.get_scene_list()

        print('List of scenes obtained:')
        for i, scene in enumerate(scene_list):
            print(
                'Scene %2d: Start %s / Frame %d, End %s / Frame %d' % (
                    i + 1,
                    scene[0].get_timecode(), scene[0].get_frames(),
                    scene[1].get_timecode(), scene[1].get_frames(),))

    finally:
        video_manager.release()


if __name__ == '__main__':
    find_scenes('lldq.mp4')

Результат выполнения кода такой

pyscenedetect

использованная литература