окрестности
- 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.Контракты…и добавьте его путь в переменную системной среды
Наконец, войдите в настоящую стадию установки, на самом деле всего одно предложение
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
После запуска скрипта в текущем каталоге будет сгенерировано короткое видео.
Каждое видео содержит только одну сцену
Если вы хотите начать с определенного момента видео, вы можете использовать параметр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
Используются 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')
Результат выполнения кода такой