Щелевая Съемка: Реализация В Bash (Ffmpeg + Imagemagick)

Не помню, что и зачем я искал в Интернете несколько дней назад, но наткнулся на интересную вещь.

статья с необычными фотографиями .

И позже еще одна статья , где была описана реализация алгоритма создания таких фотографий на питоне.

После прочтения меня заинтересовала эта тема и я решил провести вечера майских праздников с пользой для себя, а именно реализовать алгоритм «конвертации» видео в разрезное фото.

Правда, не на Python, а подручными средствами на bash. Но обо всем по порядку.



Что такое щелевая фотография
Вид фотографии, на которой запечатлено не одно событие в один конкретный момент времени, а несколько событий.

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

Звучит немного запутанно и до сих пор сложно представить, что это такое и как выглядит. Самым вразумительным для меня объяснением стал комментарий к одной из вышеупомянутых статей пользователя Стдит :

Щелевая съемка: реализация в bash (ffmpeg + imagemagick)

После этого все становится ясно.

Пример для ясности:

Щелевая съемка: реализация в bash (ffmpeg + imagemagick)



Алгоритм построения щелевой фотографии
  1. Разделите видео на множество изображений.

  2. Обрезайте каждое полученное изображение до ширины одного пикселя при заданном смещении (щели).

  3. Соберите полученный набор изображений в одно.

Звучит безобидно и просто.



Данный
  • Камера Xiaomi Yi
  • Желание разобраться и сделать несколько необычных фотографий
  • Пара вечеров свободного времени


Решение
Первое и самое простое, что приходит в голову — написать bash-скрипт, который будет обрабатывать видео и фото в соответствии с описанными шагами алгоритма.

Для реализации своих планов мне нужно было ffmpeg И имиджмагия .

В упрощенном виде на псевдо bash скрипт выглядит так:

   

ffmpeg -i videoFile frame-%d.png for ((i = 1; i <= framesCount; i++)); do convert -crop 1xframeHeight+slitShift+0 frame-$i.png slit-$i.png done montage slit-%d.png[1-framesCount] -tile framesCountx1 -geometry +0+0 outputImage

Давайте разберемся, что здесь происходит
  • Сначала с помощью утилиты ffmpeg мы разбиваем видео на множество изображений видаframe-0.png.frame-n.png.
  • Во-вторых, используя утилиту Convert из пакета imagemagick, мы обрезаем каждое полученное изображение (ключ -crop) следующим образом: ширина == 1 пиксель, высота == высота изображения.

    Также указываем горизонтальное смещение прорези.

    Сохраняем его в файлы вида slit-0.png…slit-n.png.

  • В-третьих, с помощью утилиты монтажа из пакета imagemagick собираем полученные изображения в одну фотографию.

    Ключ -tile указывает, что все фотографии нужно собрать в одну по шаблону «framesCount по горизонтали и 1 по вертикали», то есть собрать много изображений в один ряд.



Результат
За пару вечеров был написан скрипт, которому на вход мы подаем видеофайл, а на выходе получаем фото.

Теоретически вы можете вводить видео в любом формате, который поддерживает ffmpeg. Выходной файл можно получить в форматах, поддерживаемых imagemagick. Использовать скрипт очень просто:

.

/slitcamera.sh --input=test.avi --output=test.png --slit-shift=100

где вход — видеофайл для обработки, выход — имя результирующего файла, сдвиг-слот — сдвиг щели по горизонтали.

Прежде всего, для быстрого тестирования я не стал снимать видео на камеру, а скачал первое попавшееся видео с YouTube и «скормил» его скрипту.

Вот что из этого вышло:

Щелевая съемка: реализация в bash (ffmpeg + imagemagick)

На следующий день я взял свой Xiaomi Yi на прогулку и снял несколько видеороликов.

Вот что из этого вышло:

Щелевая съемка: реализация в bash (ffmpeg + imagemagick)

Родное Азовское море (фото взято из видео с разрешением 1920х1080 пикселей и длительностью 31 секунда, 60 кадров в секунду)

Щелевая съемка: реализация в bash (ffmpeg + imagemagick)



Щелевая съемка: реализация в bash (ffmpeg + imagemagick)

И эти фотографии собраны из видео разрешением 1280х720 пикселей и длительностью 16 секунд, 120 кадров в секунду.

Обратите внимание на фон второй фотографии.

Это не статично.

На заднем плане было движущееся колесо обозрения.

Посмотреть и скачать скрипт можно у меня репозитории на GitHub .

Предложения, критика и запросы на включение приветствуются.

Теги: #щелевая фотография #щелевая фотография #пространство-время #программирование #bash #ffmpeg #ImageMagick #программирование #Обработка изображений

Вместе с данным постом часто просматривают: