Вопрос или проблема
Я использую FFmpeg для автоматической обработки видео с камер наблюдения, и камера производит много слишком яркого или слишком темного видео (например, сразу после пробуждения или переключения инфракрасных фонарей).
Если я вручную проверяю видео, это может помочь.
ffmpeg -i in.mp4 -vf "eq=brightness=0.8:contrast=2" -vframes 1 out.jpg
Но я хочу, чтобы яркость, контраст или гамма автоматически рассчитывались по средней яркости изображения.
Хотя видео может быть очень темным или светлым в среднем, оно обычно использует полный диапазон значений цветовых пикселей от 0.0 до 1.0, поэтому расширение/масштабирование его до полного диапазона с помощью normalize не имеет эффекта:
ffmpeg -i in.mp4 -vf "normalize=independence=0" -vframes 1 out.jpg
Существует ли способ отфильтровать видео так, чтобы каждый кадр имел среднюю яркость пикселей почти 50%, не пиша пользовательский фильтр FFmpeg на C?
Ответ или решение
Чтобы автоматизировать выравнивание яркости, контраста или гаммы с помощью FFmpeg для обработки видеозаписей с камер наблюдения, вы можете использовать несколько фильтров, которые помогут адаптировать каждый кадр к желаемым параметрам. В вашем случае вы хотите, чтобы средняя яркость изображения была примерно 50%, что потребует вычисления и корректировки значений яркости и контраста для каждого кадра.
Для начала необходимо использовать фильтр tblend
, чтобы получить среднее значение яркости между текущим кадром и предшествующим. Затем можно использовать фильтр eq
для коррекции яркости и контраста. Вот пример команды, которая может помочь:
ffmpeg -i in.mp4 -vf "select='not(mod(n\,5))', blend=all_mode='average', eq=brightness=0.5:contrast=1.5" -c:v libx264 -preset fast -crf 22 out.mp4
Давайте разберем команды по частям:
-
select: Фильтр
select
позволяет выбирать кадры из видеопотока. В нашем примере командаnot(mod(n\,5))
выбирает каждые пятый кадр. Это позволяет уменьшить количество обрабатываемых кадров и ускорить процесс. -
blend: Фильтр
blend
используется для смешивания двух изображений. В данном случае мы используем режимaverage
, который усредняет значения пикселей выбранных кадров. -
eq: Фильтр
eq
корректирует яркость и контраст. Значения, указанные здесь, могут потребовать дополнительных коррекций в зависимости от специфики вашего видео. -
-c:v libx264 -preset fast -crf 22: Эти параметры обеспечивают кодирование выходного видео в формате H.264. Опция
-preset
определяет скорость кодирования, а-crf
управляет качеством сжатия (меньшие значения дают лучшее качество).
Обратите внимание, что параметры brightness
и contrast
в фильтре eq
могут быть настроены в зависимости от ваших требований. Возможно, вам потребуется несколько раз протестировать различные значения, чтобы достичь желаемого результата.
Если у вас есть доступ к встроенным скриптам на Python, можно использовать библиотеку OpenCV
для более сложного анализа видео и коррекции, но если хотите ограничиться только FFmpeg, приведенный выше метод будет достаточно эффективным.
Таким образом, FFmpeg предоставляет мощные инструменты для автоматизации процесса обработки видео, позволяя вам достичь желаемого уровня яркости и контраста без необходимости написания собственных фильтров на C.