Изготовление split-фотографий

Здесь Вы можете найти или обсудить множество различных алгоритмов, их описаний, реализаций на VB и других языках.
alibek
Большой Человек
Большой Человек
 
Сообщения: 14125
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Изготовление split-фотографий

Сообщение alibek » 29.01.2019 (Вт) 20:03

Не знаю, как такие фотографии называются правильно, я условно называю их split-фотографиями.
Это когда с одной точки делается серия фотографий (либо в течение дня с определенной периодичностью, либо каждый день в одно и то же время), а затем все эти фотографии объединяются в одной, с каждой берется небольшая узкая вертикальная полоска.
В моем случае это IP-камера, с которой каждые 5 минут снимается скриншот. Я хочу склеить из этих скриншотов цельную фотографию, на которой будет фиксироваться минувший суточный интервал.

На сервере каждые 5 минут запускается скрипт, который получает скриншот с камеры.
Затем он делает следующее (скрипт bash):
Код: Выделить всё
DIR=/data/sites/.../www/img/live
SRC="$DIR/live_c01.jpg"
DST="$DIR/mix_c01.jpg"

let MIX=60
let NOW=`date +"%s"`-`date --date="00:00" +"%s"`
let NOW/="(86400/$MIX)"
read PRV < /tmp/lastrun.tmp
if [ "$NOW" = "$PRV" ]; then exit ; fi
echo $NOW > /tmp/lastrun.tmp

let MW=`identify -format "%w" "$SRC"`
let MH=`identify -format "%h" "$DST"`
let MS="($MW/$MIX)"
let ML="$MS*($NOW-1)"
let MR="($MS*$NOW)-1"
if [ $NOW -eq $MIX ]; then let MR="$MW-1" ; fi
composite <options> "$SRC" "$DST" "$DST"

Логика здесь следующая.
1. Определяется количество секунд с начала суток.
2. Сутки делятся на 60 интервалов, определяется текущий интервал.
3. Если скрипт уже запускался в текущем интервале, его работа завершается, иначе во временном файле фиксируется текущий интервал.
4. $SRC исходный файл (текущий скриншот с камеры), $DST результирующий файл (split-фотография). Определяем размеры файла (разрешение).
5. Для текущего интервала определяются координаты фрагмента, который нужно вырезать из скриншота.
6. Выполняется наложение с помощью ImageMagick.

Мне не нравится реализация пункта 5.
Если ширина фрагмента получается дробной (то есть ширина файла не делится нацело на количество интервалов), то тут будет накапливаться ошибка округления. Частично она у меня компенсирована (последний интервал занимает весь остаток), но это как-то кривовато.
Для таких случаев обычно используют алгоритм Брезенхэма, но на bash неудобно работать с математикой.

И вопрос с пунктом 6.
Не подскажите ключи для ImageMagick, чтобы выполнить необходимое (то есть наложить на одно изображение фрагмент другого)?
Сейчас я делаю это в два захода (convert -crop, а затем composite), но хотелось бы в один заход и без временных файлов.
Код: Выделить всё
    convert "$SRC" -crop ${MS}x${MH}+${ML}+0 "$TMP/crop.jpg"
    composite -geometry +${ML}+0 "$TMP/crop.jpg" "$DST" "$DST"
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14125
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Изготовление split-фотографий

Сообщение alibek » 30.01.2019 (Ср) 9:59

Скрипт отработал примерно половину суток и что-то мне не нравится его результат.
mix.jpg
mix.jpg (23.34 Кб) Просмотров: 111

Сейчас сутки поделены на 60 интервалов, то есть ширина каждой полоски 24 минуты.
Это все-таки многовато, слишком резкие переходы, особенно на рассвете.
Видимо буду рисовать фрагменты при каждом запуске скрипта, тогда полоски будут 6-7 пикселов.
Пока не решил два вопроса:
1. Рисовать полоску между прошлым запуском и текущим или с текущим на +5 минут?
2. Если скриншот отсутствует (нет связи), продолжать предыдущий или рисовать черную полоску?
Lasciate ogni speranza, voi ch'entrate.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1918
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Изготовление split-фотографий

Сообщение ger_kar » 30.01.2019 (Ср) 18:48

alibek писал(а):Скрипт отработал примерно половину суток и что-то мне не нравится его результат.
А что вообще в результате должно получиться (в идеале)? Никак не могу понять общий смысл всей затеи. Для чего это вообще нужно и где такой подход применяется?
Бороться и искать, найти и перепрятать

alibek
Большой Человек
Большой Человек
 
Сообщения: 14125
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Изготовление split-фотографий

Сообщение alibek » 30.01.2019 (Ср) 23:07

Что-то типа такого: http://www.priroda.su/item/2136
Lasciate ogni speranza, voi ch'entrate.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1918
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Изготовление split-фотографий

Сообщение ger_kar » 31.01.2019 (Чт) 18:30

alibek писал(а):Что-то типа такого: http://www.priroda.su/item/2136
Классно получилось у автора.
У нас есть рядом горнолыжная база, где зимой мы гоняем на лыжах, а летом на велосипедах. Там есть объездная дорога, при проезде по которой у меня родилась идея, что неплохо бы сделать ролик, в котором спуск начинается зимой на лыжах, а заканчивается летом на велике. Но дальше идеи это никуда так и не сдвинулось, так как на реализацию такой идеи пришлось бы потратить очень много времени и усилий. А так бы тоже прикольно получилось :)
Бороться и искать, найти и перепрятать

alibek
Большой Человек
Большой Человек
 
Сообщения: 14125
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Изготовление split-фотографий

Сообщение alibek » 01.02.2019 (Пт) 14:54

С более «узкими» интервалами смотрится в целом получше.
mix.jpg
mix.jpg (34.45 Кб) Просмотров: 66

Но все равно есть два не очень приятных момента.
Во-первых, фотография выглядит грязноватой из-за того, что освещенность постоянно меняется и полосы получаются разной яркости.
А во-вторых, на фотографиях иногда в виде артефактов проявляются кратковременные явления. Например тонкая темная вертикальная полоса на дороге это проехавший автомобиль. Ну и двигающиеся в течение дня тени тоже выглядят необычно (более широкая темная синяя полоса).
Наверное нужно эмулировать долгую выдержку фотоаппарата. Например делать 10 скриншотов в течение 10-20 секунд, а затем их объединять, используя от каждого скриншота по 10% интенсивности. Тогда постоянные элементы будут выглядеть как есть, а двигающиеся будут малозаметны и полупрозрачны. И кроме того нужно яркость выравнивать. Тогда должно получиться более симпатичное и правдоподобное изображение.

Скрипт используется примерно такой:
Код: Выделить всё
#!/bin/bash

let INT=120
let NOW=`date +"%s"`-`date --date="00:00" +"%s"`
URL="http://1.2.3.4//cgi-bin/snapshot.cgi"
DIR=/data/sites/mysite/www/img/live
IMG="live"
MIX="mix"

let MW=`identify -format "%w" "$DIR/$MIX.png"`
let MH=`identify -format "%h" "$DIR/$MIX.png"`
let MX0=`calc "int(${MW}*${NOW}/86400)"`
let MX1=`calc "int(${MW}*(${NOW}+${INT})/86400)-1"`
if [ $MX1 -ge $MW ]; then let MX1=$MW-1; fi
let MW1=$MX1-$MX0+1
let MX2=`calc "int(${MW}*(${NOW}+2*${INT})/86400)-1"`
if [ $MX2 -ge $MW ]; then let MX2=$MW-1; fi
let MW2=$MX2-$MX0+1

calc() { awk "BEGIN{print $*}"; }

convert "$DIR/$MIX.png" -fill black -draw "rectangle ${MX0},0 ${MX2},${MH}" "$DIR/$MIX.png"
wget -4q --tries=2 --timeout=10 -O "/tmp/snapshot.jpg" $URL
if [ $? -eq 0 ]; then
  mv -f -T "/tmp/snapshot.jpg" "${DIR}/$IMG.jpg"
  convert -geometry +${MX0}+0 "$DIR/$MIX.png" \( "$DIR/$IMG.jpg" -crop ${MW1}x${MH}+${MX0} \) -composite "$DIR/$MIX.png"
fi
convert "$DIR/$MIX.png" "$DIR/$MIX.jpg"

Теперь он вначале выполняет выводит черную полосу двойной ширины, а затем накладывает текущий фрагмент, если скриншот получен успешно.
Во-первых, в этом случае не нужно хранить состояние (момент предыдущего запуска).
Во-вторых, видно текущее "положение" часов (черная вертикальная полоска).
На PNG пришлось перейти, потому что на пиксельных манипуляциях качество JPG падает просто катастрофически.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Алгоритмы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList