Як усім дітям, мені в дитинстві подобались мультфільми. Іноді навіть хотілося створити власну анімацію. Часом задумувався - а чи не назнімати кадриків фотоапаратом, потім склеїти фотоплівки щоб вийшов суцільний фільм. Але перші приблизні розрахунки кількості кадриків і відповідно фотоплівки розвіювали усі сподівання :-)
Ролики зустрічаються там такі вражаючі та цікаві, що вгамувати бажання відзняти щось подібне самому важко. Хоча бути митцем дано не кожному, то вже інший бік питання. Мова піде про технічну сторону.
Очевидно, що для реалізації задуманого необхідними є три речі: комп'ютер, фотоапарат і програма. Якщо по комп'ютеру особливих питань немає, то програма із фотоапаратом повинні вміти спілкуватися між собою. Фотоапарат, який я мав, на жаль, був всього лише старенькою цифромильницею, для якої розробник не передбачив програмного інтерфейсу: вона просто підключалась USB-шнурком і комп'ютер бачив її як флеш-носій. Тому для мене було два можливі сценарії.
Цей шлях був би істинно хакерським, бо довелося б вирішувати чимало електронно-механічних проблем. Та на жаль, я не мав достатньо часу і впевненості, що моя реалізація буде красивою. Тому пішов іншим шляхом - швидшим, простішим, хоча й коштовнішим.
Всезнаючий гугль підказав, що найкращою програмою для керування цифровими фотокамерами в Linux є
gPhoto2. В моїй Slackware вона вже була. Залишалася дрібничка - знайти цифрову камеру. Важливо щоб це не просто була підтримувана програмою камера, таких багато:
http://www.gphoto.org/proj/libgphoto2/support.php. В межах поставленого завдання набагато важливіше здатність до того, що називається
Remote Capture - керувати з комп'ютера налаштуваннями камери та власне фотографуванням. Список таких камер вже значно менший:
http://www.gphoto.org/doc/remote/. Наклавши цей список на місцевий сайт оголошень
http://nayarmarku.pl.ua/, на їх перетині отримав непоганий варіант -
Canon PowerShot SX100 IS, який і придбав, не те щоб задарма, але суттєво дешевше нового, і в гарному стані.
Ніяких налаштувань мені робити не довелося - Slackware була готова до роботи з gPhoto2. Програма працює в командному режимі. Отримати перелік опцій фотоапарата:
gphoto2 --list-config
Перелік цей залежатиме від конкретної моделі. Побачити значення тії чи іншої опції дозволить команда
gphoto2 --get-config option
змінити:
gphoto2 --set-config option=value
Є опція, властива лише камерам Canon - capture. Коли задати її значення on, лінзи об'єктива приводяться в робоче положення ("виїжджають"). Значення off відповідно ховає об'єктив. Також Canon-камерам, та деяким Nikon властива опція capturetarget, яка може приймати значення sdram або card, відповідно визначаючи місце для збереження фотографій - внутрішня пам'ять чи флеш-картка.
Трохи поекспериментувавши, визначився з переліком підходящих опцій. Ось сценарій, з допомогою якого в даний момент робиться серія фотографій:
#!/bin/bash
STOREDIR=~/timelapse
[ ! -d ${STOREDIR} ] && mkdir -p ${STOREDIR}
cd ${STOREDIR}
gphoto2 --set-config capturetarget=0 \
--set-config shootingmode=3 \
--set-config zoom=7 \
--set-config shutterspeed="1/60" \
--set-config aperture="8" \
--set-config flashmode=1 \
--set-config assistlight=1 \
--set-config iso="100" \
--filename "%Y-%m-%d_%H%M%S.jpg" \
--capture-image-and-download
Тут послідовно задані опції:
- зберігати фотографії у внутрішній пам'яті фотоапарата - все рівно ми їх одразу ж завантажуватимем у комп'ютер
- режим зйомки - із ручним заданням параметрів
- експериментально підібране значення zoom для вдалого кадру
- швидкість затвору
- величина діафрагми
- спалах увімкнутий
- еквівалентна чутливість
Параметром --filename визначений формат імені файлу, в який зберігатиметься фотографія. Для зручності подальшої роботи в назві файлу відображена дата та час зйомки. А останній параметр, --capture-image-and-download, змушує фотоапарат сфотографувати і одразу ж завантажити фотографію, після чого звільнити від неї пам'ять.
Сценарій запускається періодично через cron. Існує альтернатива - спеціальні ключі gPhoto2, -F та -I, які задають відповідно необхідну кількість знімків (0 - необмежено) та інтервал в секундах між знімками. Але тоді існуватиме небезпека, що у випадку форс-мажору процес буде безповоротно обірваний. Тому, хоча cron і обмежує мінімальний інтервал однією хвилиною, але по-перше, мені цього достатньо, а по-друге, так надійніше. Висмикне хтось USB-шнурок з комп'ютера, зойкне, вставить назад - і зйомка продовжиться. Зникне електронапруга, з'явиться знову - комп'ютер стартує і cron так само справно колекціонуватиме фотографії, такі як ця:

Такими простими інструментами здійснюється накопичення фотографій. До завершення запланованої кількості залишається ще близько тижня, тому про те, як перетворити фото на відео, говорити не можу - ще не маю практики. Про це згодом. Поки що зверну увагу на бонус: якщо у нас є процес, який постачає актуальні фотографії, то чому б не використати ці фотографії для моніторингу? Треба лише доповнити сценарій кількома рядками, які визначатимуть найсвіжіше фото у каталозі, генеруватимуть з нього дещо менше зображення для публікування та мініатюру, приблизно так:
FFILE="`ls -1 -t 2*.jpg | head -n 1`"
DATETIME=`basename ${FFILE} .jpg | \
awk -F "_" '{print $1 " " substr($2,1,2) ":" substr($2,3,2) ":" substr($2,5) }'`
convert ${FFILE} -resize 320 -quality 50 \
-pointsize 20 -fill yellow -draw "text 10,30 \"${DATETIME}\"" 0.jpg
convert ${FFILE} -resize 1024 -pointsize 20 \
-fill yellow -draw "text 10,30 \"${DATETIME}\"" 1.jpg
... і опублікувати підготовані таким чином фотофайли для загального (або за бажанням - обмеженого) доступу. Отак:
Дизайн в стилі "швидкість & функціонал"
:-)
Отак і за двома зайцями можна погнатися - і time-lapse-відео підготувати, і організувати нагляд за домашніми улюбленцями будь-коли і будь-де.
Лише не забувайте про безпеку - читайте інструкцію до свого фотоапарата та дотримуйтесь безпечної відстані, використовуючи фотоспалах при зйомці дітей та тварин.