Вопрос или проблема
Оптимизация пакетного ключирования по зеленому экрану с помощью FFmpeg
Привет всем!
Я написал скрипт, который обрабатывает MP4 видео с переменным кодом цвета зеленого экрана, заменяя фон на видео. В целом он работает неплохо, но я еще не совсем удовлетворен результатами.
Проблемы, с которыми я сталкиваюсь:
Небольшой зеленый ореол все еще присутствует вокруг объекта.
Размытые края, особенно между руками. Это результат использования boxblur, который мне нужно было отрегулировать, чтобы избавиться от избыточной зеленой окраски.
Вот команда FFmpeg, которую я использую:
ffmpeg -y -i "%background%" -i "%input_file%" -filter_complex "[1:v]chromakey=%color_code%:similarity=0.28:blend=0.01[ckout];[ckout]split[ck1][ck2];[ck1]alphaextract[alph];[alph]boxblur=2:1[alph_processed];[ck2][alph_processed]alphamerge[ck_blurred];[0:v][ck_blurred]overlay[out]" -map "[out]" -map 1:a -c:v !video_codec! !video_encoding_options! -c:a !audio_codec! "!output_file!"
Я немного поэкспериментировал, чтобы найти «подходящие» настройки для Similarity, blend и boxblur.
Ищу предложения по оптимизации этого кода FFmpeg или применению альтернативных фильтров для улучшения указанных проблем. Я прикрепил образец видео для справки.
Изображения для справки:
с фоном
[С зеленым экраном2
Видео для загрузки для справки:
https://drive.google.com/drive/folders/1-9uHErLAo2aniv0N7uvMDreweuoz-RSQ?usp=sharing
Ответ или решение
Оптимизация пакетной замены фона с помощью хромакея в FFmpeg
Здравствуйте!
Я понимаю, что вы столкнулись с рядом проблем в процессе пакетной обработки видео с использованием хромакейного ключа в FFmpeg. Давайте разберемся, как можно улучшить ваш скрипт и избавиться от зеленого ореола и размытости краев.
Проблемы, с которыми вы столкнулись
- Слегка зеленый ореол вокруг объекта — это распространенная проблема при работе с хромакеем, особенно если фон не является однородным или слабо освещен.
- Размытость краев — чаще всего возникает из-за применения фильтра
boxblur
, который может слишком сильно размазывать контуры.
Оптимизация скрипта
Ваш текущий код выглядит следующим образом:
ffmpeg -y -i "%background%" -i "%input_file%" -filter_complex "[1:v]chromakey=%color_code%:similarity=0.28:blend=0.01[ckout];[ckout]split[ck1][ck2];[ck1]alphaextract[alph];[alph]boxblur=2:1[alph_processed];[ck2][alph_processed]alphamerge[ck_blurred];[0:v][ck_blurred]overlay[out]" -map "[out]" -map 1:a -c:v !video_codec! !video_encoding_options! -c:a !audio_codec! "!output_file!"
Предложения по оптимизации:
-
Использование
format
иcolorchannelmixer
для улучшения обработки цвета
Вместо коррекции цветов с помощьюboxblur
, попробуйте использовать фильтрыcolorchannelmixer
иcurves
. Это позволит более точно управлять цветами и минимизировать зеленую окраску.[1:v]chromakey=%color_code%:similarity=0.28:blend=0.01[ckout];[ckout]split[ck1][ck2];[ck1]alphaextract[alph];[alph]curves=blue='0.0/0.0 0.5/0.7 1.0/1.0'[alph_processed];[ck2][alph_processed]alphamerge[ck_blurred]
-
Настройка параметров фильтра
boxblur
или использованиеgblur
Попробуйте другие варианты размытия, такие какgblur
, который более эффективно обрабатывает края изображения и может привести к более четким контурам.[alph]gblur=sigma=1.0[alph_processed]
-
Коррекция значений
similarity
иblend
Поэкспериментируйте с этими параметрами. Уменьшениеsimilarity
может помочь убрать зеленый ореол, но в то же время может снова вернуть нежелательные артефакты. -
Добавление эффекта
edgedetect
для повышения четкости
Для увеличения четкости можно применить фильтрedgedetect
, который поможет выделить края.[ck_blurred]edgedetect[edges];[ck_blurred][edges]overlay=shortest=1
Итоговый код
Ниже приведен код с применением вышеуказанных улучшений и оптимизаций:
ffmpeg -y -i "%background%" -i "%input_file%" -filter_complex "
[1:v]chromakey=%color_code%:similarity=0.28:blend=0.01[ckout];
[ckout]split[ck1][ck2];
[ck1]alphaextract[alph];
[alph]curves=blue='0.0/0.0 0.5/0.7 1.0/1.0'[alph_processed];
[ck2][alph_processed]alphamerge[ck_blurred];
[0:v][ck_blurred]overlay[out]"
-map "[out]" -map 1:a -c:v !video_codec! !video_encoding_options! -c:a !audio_codec! "!output_file!"
Заключение
Проблемы, с которыми вы сталкиваетесь, довольно распространены в обработке видео с использованием хромакея. С помощью вышеприведенных фильтров и оптимизаций вы сможете улучшить качество обработки и уменьшить количество зеленого ореола и размытости краев. Не забывайте тестировать различные параметры для достижения наилучших результатов и сохранять разные версии для сопоставления.
Если у вас есть еще вопросы или вам нужно другое направление, не стесняйтесь задавать их.