Получить четкие, четкие миниатюры из MP4 с FFmpeg / ImageMagick

моя конечная цель состоит в том, чтобы получить значимые снимки из видео, которые либо 30 мин или 1 час. "Содержательный" немного амбициозен, поэтому я упростил свои требования.

изображение должно быть четким, не размытым.

изначально я думал, что это означает получение "ключевого кадра". Поскольку ключевых кадров много, я решил выбрать кадр, наиболее близкий к третьей минуте видео, который был для меня в целом "значимым". Я последовал совету на: команда FFmpeg, чтобы найти ключевой кадр ближе всего к 3-й минуте

но проблема в том, что эти кадры часто (не всегда) размыто. Пример:

enter image description here

затем я попробовал, значимые эскизы для видео с помощью FFmpeg , который помог получить более значимые снимки, но я все еще часто (не всегда) получал размытые кадры, как показано выше.

вы заметите, что этот вид изображения по существу является перекрытием 2 различных сцен. Иногда, однако, я получаю изображения, которые работают для меня-как это:

enter image description here

изображения не очень значимым, но он хрустящ.

В идеале я бы хотел, чтобы FFmpeg не возвращал размытые кадры. В качестве альтернативы, я хотел бы использовать скрипт для обнаружения размытых кадров и выбрать наименее размытый из 5 кадров. Кто-нибудь знает, как это сделать?

21
задан Community
22.05.2023 10:13 Количество просмотров материала 3566
Распечатать страницу

1 ответ

"значимое" является весьма субъективным, но "размыто" является достаточно объективным и просто обнаружить.

у меня была похожая проблема, и после небольшого исследования в конечном итоге со следующим алгоритмом:

  • определить длину видеофайла в секундах.
  • генерировать 10 png миниатюр с помощью ffmpeg и сцены изменения detecion с чем-то вроде:

    ffmpeg -ss {$skip} -i {$input} -vf "select=gt(scene\,0.3)" -r 1 -frames:v 1 {$output}
    

на каждой итерации $skip увеличивается на 10% на видео длина в секундах. Параметр 0.3 может быть не самым подходящим для вас, но вы можете играть с ним. Это решило проблему с перекрывающимися сценами и / или полностью размытыми изображениями.

  • обнаружить края этих 10 эскизов и уменьшить их для лучшей производительности с ImageMagick:

    convert {$input} -thumbnail {$w}x{$h} -colorspace Gray -edge 1 {$path_to_downscaled_image}
    

Я использую -thumbnail для масштабирования изображения. Затем я добавляю черно-белый фильтр. Наконец, я делаю обнаружение края с помощью радиус 1. Это создает черно-белое изображение только с краями, помеченными как белые. Это означает, что чем больше белого цвета у изображения, тем больше в нем краев. Вы получите что-то вроде этого:

enter image description here

  • Идентифицируйте полученные черно-белые изображения с помощью ImageMagick:

    identify -format '{$format}' {$path_to_downscaled_image}
    

что вас должно заинтересовать, так это %[среднее] и %[стандартное отклонение]. Играть вокруг с этим и посмотреть, что подходит вам лучший. Просто отсортируйте все полученные изображения, например, по " %[среднее] + %[стандартное отклонение]". Найдите то же изображение, прежде чем мы начали изменять его размер и фильтровать.

  • наконец выбрать самый "острый" один, найти его оригинал и, возможно, преобразовать его снова:

    convert {$input} -thumbnail {$w}x{$h} -adaptive-sharpen 1.25x0.75 {$final_output}
    

я узнал, что -adaptive-sharpen действительно помогает с конечным результатом, потому что он обостряет изображений только вокруг тех же краев. Я попробовал разные геометрии и обнаружил, что 1.25x0.75 лучше всего работает для меня, когда я уменьшаю разрешение до четверти от исходного.

Я сделал это в PHP, и это занимает около 25 секунд на 12 минуте фильма, чтобы казнить меня.

Я надеюсь, что это было полезный.

6
отвечен matthewd 2023-05-23 18:01

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх