Не помню, что и зачем я искал в Интернете несколько дней назад, но наткнулся на интересную вещь.
статья с необычными фотографиями .
И позже еще одна статья , где была описана реализация алгоритма создания таких фотографий на питоне.
После прочтения меня заинтересовала эта тема и я решил провести вечера майских праздников с пользой для себя, а именно реализовать алгоритм «конвертации» видео в разрезное фото.
Правда, не на Python, а подручными средствами на bash. Но обо всем по порядку.
Что такое щелевая фотография
Вид фотографии, на которой запечатлено не одно событие в один конкретный момент времени, а несколько событий.Это достигается за счет того, что щелевая камера снимает кадры шириной в один пиксель (это и есть «щель») и «склеивает» их в одну фотографию.
Звучит немного запутанно и до сих пор сложно представить, что это такое и как выглядит. Самым вразумительным для меня объяснением стал комментарий к одной из вышеупомянутых статей пользователя Стдит :
После этого все становится ясно.
Пример для ясности:
Алгоритм построения щелевой фотографии
- Разделите видео на множество изображений.
- Обрезайте каждое полученное изображение до ширины одного пикселя при заданном смещении (щели).
- Соберите полученный набор изображений в одно.
Данный
- Камера 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 и «скормил» его скрипту.
Вот что из этого вышло:
На следующий день я взял свой Xiaomi Yi на прогулку и снял несколько видеороликов.
Вот что из этого вышло:
Родное Азовское море (фото взято из видео с разрешением 1920х1080 пикселей и длительностью 31 секунда, 60 кадров в секунду)
И эти фотографии собраны из видео разрешением 1280х720 пикселей и длительностью 16 секунд, 120 кадров в секунду.
Обратите внимание на фон второй фотографии.
Это не статично.
На заднем плане было движущееся колесо обозрения.
Посмотреть и скачать скрипт можно у меня репозитории на GitHub .
Предложения, критика и запросы на включение приветствуются.
Теги: #щелевая фотография #щелевая фотография #пространство-время #программирование #bash #ffmpeg #ImageMagick #программирование #Обработка изображений
-
Всемирная Торговая Организация (Вто)
19 Oct, 24 -
Новый Ip Телефон Fanvil X3S
19 Oct, 24 -
Луркмор Заблокировали По 149-Фз
19 Oct, 24 -
Победим Elms Delivery Client
19 Oct, 24