Because my tomatoes are growing unexpectedly fast I had to stop capturing pictures quicker than I have planned as they do not fit in the frame.
So 2664 pictures was taken from 16.03 to 23.04 at 20 minutes interval. The video size is about 715 Mb and the video length is 3min 43 seconds (at 12 fps or 1:47 at 25 fps).
Ustaliłem empirycznie w jaki sposób podłączyć aparat do Raspberry Pi (do SheevaPlug zresztą też) żeby nic się nie zacinało. W skrócie:
Używam kompakta Nikon S3000 (Canon A620 się zacinał/odłączał--sprzedałem go na Allegro).
Podłączam aparat poprzez aktywny USB hub (kupiłem w tym celu cztero-portowy HUB firmy Vivanco).
Po każdym zdjęciu wykonuję reset stosownego portu USB za pomocą programiku pn. usb_reset
(zobacz tutaj
oraz tutaj).
Używam dwóch aparatów Nikon S3000 (kupionych na Allegro oczywiście), więc jest problem z ustaleniem który jest który:
$gphoto2 --auto-detect Model Port ---------------------------------------------------------- Nikon Coolpix S3000 (PTP mode) usb:001,022 Nikon Coolpix S3000 (PTP mode) usb:001,021
Można użyć opcji --port usb:001,022
aby wykonać coś
z ,,pierwszym'' aparatem oraz --port usb:001,021
, aby dostać się do drugiego.
Oczywiście umieszczenie numerów portów na-zicher w skryptach byłoby kiepskim pomysłem
ponieważ nie są one ustalone, ale się zmienią jeżeli urządzenie zostanie odłączone/przyłączone ponownie.
Lepszym sposobem zidentyfikowania aparatów jest wykorzystanie numeru seryjnego:
## $gphoto2 --get-config serialnumber --port PORT ## example $gphoto2 --get-config serialnumber --port usb:001,022 Label: Serial Number Type: TEXT Current: 000047514512
Mam czarnego Nikona o numerze 000041076602 oraz różowego o numerze 000047514512. Używam następującego skryptu do wykonania zdjęcia określonym aparatem:
#!/bin/bash PINK_CAM_ID='000047514512' BLACK_CAM_ID='000041076602' while test $# -gt 0; do case "$1" in -b|--black) REQ_CAM="$BLACK_CAM_ID";; -p|--pink) REQ_CAM="$PINK_CAM_ID";; esac shift done ## Nazwa pliku ze zdjęciem: FILENAME="NIK`date +"%Y%m%d%H%M"`.jpg" ## Przejrzyj wszystkie podłączone aparaty: while read PORT_ID do ##echo $PORT_ID ## -n means string is non-empty if [ -n "$PORT_ID" ] ; then CAM_ID=`gphoto2 --get-config serialnumber --port $PORT_ID | awk '/Current:/ { print $2 }' ` if [ $CAM_ID = "$REQ_CAM" ] ; then REQ_CAM_PORT="$PORT_ID" ##echo "*** Req Camera ID: #$CAM_ID." fi fi done <<< "`gphoto2 --auto-detect | grep usb | awk '{ print $6}'`" # Na wypadek błędu wyślij alarmowego SMSa if [ -z "$REQ_CAM_PORT" ] ; then echo "*** Error: Camera $REQ_CAM not found ***" ## sent a SMS cf http://pinkaccordions.homelinux.org/wblog/sms_alerts_with_google_calendar.html sms_reminder.sh exit 1 fi ## reset USB REQ_CAM_PORT_DEVNAME=`echo $REQ_CAM_PORT | sed 's/^.*://' | sed 's/,/\//'` usb_reset /dev/bus/usb/${REQ_CAM_PORT_DEVNAME} LANG=C gphoto2 --port "$REQ_CAM_PORT" --force-overwrite --set-config flashmode=1 \ --set-config d002=4 \ --capture-image-and-download --filename "$FILENAME" ## reset USB (powtórny) usb_reset /dev/bus/usb/${REQ_CAM_PORT_DEVNAME}
Właściwość d002
ustawia rozdzielczość zdjęcia (4 oznacza 2592x1944).
Wartość 1 właściwościflashmode
wyłącza flash.
Z moich eksperymentów wynika, że bez wykonania
usb_reset
bateria aparatu nie jest doładowywana (czemu?) i po
pewnym czasie z powodu braku zasilania aparat odłącza się.
Po czterech tygodniach mam wystarczająco dużo zdjęć aby spróbować zrobić pierwszy film.
Najpierw konwertuję wszystkie zdjęcia do rozdzielczości 1920x1080 za pomocą
programu convert
(z zestawu ImageMagick)
uruchamianego z ,,wewnątrz'' prostego skryptu Perla. Ponieważ nazwy plików wejściowych są
konstruowane wg schematu NIKYYYYMMDDHHMM.jpg
(gdzie YYY to rok, MM oznacza miesiąc, itd.)
sortowanie alfabetyczne oznacza ustawienie ich także we właściwym porządku chronologicznym.
Nazwy plików wynikowych są zaś konstruowane jako:
hd1920_00001.jpg
, hd1920_00002.jpg
, itd.
#!/usr/bin/perl opendir (DIR, "."); my @files = sort { $a cmp $b } readdir(DIR); while (my $file = shift @files ) { if ($file =~ /.jpg$/) { $fileNo++; $file_out = sprintf "hd1920_%05d.jpg", $fileNo; print "$file -> $file_out\n"; system ("convert", $file, "-geometry", "1920x1080", "$file_out"); } }
Okazało się, że jest dokładnie 1784 zdjęć:
$ls -l hd1920_0* | wc -l 1784
Konwersja trwała około 30 min na moim przeciętnym zupełnie PC-cie. Każdy plik wynikowy miał około 0,5Mb; wszystkie razem zajmowały około 0,85Gb:
$ls -l hd1920_0* | awk '{t+=$5}; END{print t}' 853332231
Film został wykonany za pomocą programu ffmpeg
:
ffmpeg -r 12 -qscale 2 -i hd1920_%05d.jpg Tomato_12.mp4
Gdzie -r 12
oznacza liczbę klatek na sekundę (12 fps)
a -qscale
określa jakość (1 oznacza najlepszą,
32 najgorszą jakość).
Film ma około 450 Mb. Konwersja zajmuje około 3min (on my decent PC) a długość filmu to 2min i 29 sekundy.
Film przedstawia sadzonkę pomidora (Pinkaccordion oczywiście :-). Zdjęcia były robione co 20 minut od 16 marca do 11 kwietnia.
After almost 4 weeks I have enough pictures to create my first video production. (How to capture images with a still camera attached to Raspberry Pi is described here and here.)
I started from converting all pictures to 1920x1080 resolution with convert
run from a simple Perl script. As the input file
names are constructed as NIKYYYYMMDDHHMM.jpg
(where YYY denotes year, MM denotes month etc)
alphabetic sorting is OK. The resulting files
are named as hd1920_00001.jpg
, hd1920_00002.jpg
, etc.
#!/usr/bin/perl opendir (DIR, "."); my @files = sort { $a cmp $b } readdir(DIR); while (my $file = shift @files ) { if ($file =~ /.jpg$/) { $fileNo++; $file_out = sprintf "hd1920_%05d.jpg", $fileNo; print "$file -> $file_out\n"; system ("convert", $file, "-geometry", "1920x1080", "$file_out"); } }
There are exactly 1784 pictures:
$ls -l hd1920_0* | wc -l 1784
Conversion of all images lasted circa half an hour on my decent PC. Each picture size is about 0,5Mb, while the total size is 0,85Gb:
$ls -l hd1920_0* | awk '{t+=$5}; END{print t}' 853332231
To create a video from the images I run ffmpeg
now:
ffmpeg -r 12 -qscale 2 -i hd1920_%05d.jpg Tomato_12.mp4
Where -r 12
means frames ratio (12 fps) and -qscale
determines
video quality (1 denotes best quality and 32 is the lowest one).
The video size is about 450 Mb. The conversion takes circa 3min (on my decent PC) and the video length is 2min 29 seconds.
The movie's subject is a growing tomato (Pinkaccordion variety of course:-). The photographs were taken every 20 minutes from March 16th to April 11th.
I have made some progress in accessing still camera with gphoto2
(cf. here).
The detailed description of my set-up will be disclosed within a few weeks (as I am still not sure
if it is 100% success:-). In short:
I changed camera from Canon A620 to Nikon S3000.
I connected camera with active USB hub.
On every capture USB port is reset with usb_reset
utility
(cf here
and here)
I use two Nikon S3000 compact cameras so there is a problem how to identify which is which.
$gphoto2 --auto-detect Model Port ---------------------------------------------------------- Nikon Coolpix S3000 (PTP mode) usb:001,022 Nikon Coolpix S3000 (PTP mode) usb:001,021
So one can use --port usb:001,022
option to access first attached
camera and --port usb:001,021
to access the second one. Of
course hard-coded port numbers are troublesome as they are not fixed and change
if the device is disconnected/connected again.
Better way to identify the camera is to use it's serial number:
## $gphoto2 --get-config serialnumber --port PORT ## example $gphoto2 --get-config serialnumber --port usb:001,022 Label: Serial Number Type: TEXT Current: 000047514512
I have black Nikon with 000041076602 serial number and pink one with 000047514512 serial number. I use the following bash script to access the cameras:
#!/bin/bash PINK_CAM_ID='000047514512' BLACK_CAM_ID='000041076602' while test $# -gt 0; do case "$1" in -b|--black) REQ_CAM="$BLACK_CAM_ID";; -p|--pink) REQ_CAM="$PINK_CAM_ID";; esac shift done ## Picture filename: FILENAME="NIK`date +"%Y%m%d%H%M"`.jpg" ## Scan all attached cameras: while read PORT_ID do ##echo $PORT_ID ## -n means string is non-empty if [ -n "$PORT_ID" ] ; then CAM_ID=`gphoto2 --get-config serialnumber --port $PORT_ID | awk '/Current:/ { print $2 }' ` if [ $CAM_ID = "$REQ_CAM" ] ; then REQ_CAM_PORT="$PORT_ID" ##echo "*** Req Camera ID: #$CAM_ID." fi fi done <<< "`gphoto2 --auto-detect | grep usb | awk '{ print $6}'`" if [ -z "$REQ_CAM_PORT" ] ; then echo "*** Error: Camera $REQ_CAM not found ***" ## sent a SMS cf http://pinkaccordions.homelinux.org/wblog/sms_alerts_with_google_calendar.html sms_reminder.sh exit 1 fi ## reset the USB device REQ_CAM_PORT_DEVNAME=`echo $REQ_CAM_PORT | sed 's/^.*://' | sed 's/,/\//'` usb_reset /dev/bus/usb/${REQ_CAM_PORT_DEVNAME} LANG=C gphoto2 --port "$REQ_CAM_PORT" --force-overwrite --set-config flashmode=1 \ --set-config d002=4 \ --capture-image-and-download --filename "$FILENAME" ## reset the USB device again usb_reset /dev/bus/usb/${REQ_CAM_PORT_DEVNAME}
Property d002
sets picture resolution (4 means 2592x1944).
Value 1 of flashmode
turns-off flash.
It seems that without usb_reset
there are problems with battery charging (why?)
No i kupiłem z rekomendacji kol. Wanteda nowy aparat Fuji FinePix A820. Przy okazji się dowiedziałem (ale już po zakupie), że nie każdy aparat cyfrowy da się zamontować, ot tak po prostu wsadzając kabel do portu USB. Mówimy o systemie Linux, of course. Systemu, do którego producent dostarczył sterowniki jakoś nie zamierzam używać. Okazało się też, że takie aparaty obsługuje program gphoto2. Jakoś do tej pory nie widziałem potrzeby jego używania a teraz nie mam wyjścia.
Kol. Wanted radził też spróbować gphotofs albo mtpfs. Pierwszy z wymienionych wykorzystuje bliżej mi nieznany FUSE i pozwala zamontować aparat wykorzystujący protokół PTP. Nawet się zainstalowało w moim FC5:
yum install gphoto2 yum install fuse fuse-devel gphoto2-devel libexif-devel wget http://orion.lcg.ufrj.br/RPMS/src/gphotofs-0.3-1.fc6.lcg.src.rpm rpm -ivh gphotofs-0.3-1.fc6.lcg.src.rpm rpmbuild -ba /usr/src/redhat/SPECS rpm -Uvh /usr/src/redhat/RPMS/i386/gphotofs-*
Wpisałem też do /etc/fstab
:
gphotofs /media/camera fuse users,rw,noauto,defaults 0 0
No i tyle dobrych wieści. Jak wpiszę:
gphotofs /media/camera
system wisi i nic się nie dzieje. Może za jakoś czas; póki co na
liście dostępnych aparatów (gphoto2 --list-cameras | grep -i
Fuji
) są różne Fuji, ale modelu FinePix A820 akurat nie ma.
Posługiwanie się gphoto2
z wiersza poleceń o tyle jest
niewygodne, że nie są wyświetlane daty (Albo ja nie wiem jak to
osiągnąć). W połączeniu z tym, że nie lubię kasować zdjęć od razu po
zgraniu na dysk, jest problem bo nie wiadomo, które zdjęcia są
bieżące, a które stare. Same kłopoty z tym Fuji...
Jakimś rozwiązaniem
jest gtkam, kolejna aplikacja
z projektu gphoto2. Odpowiednie
pliki .rpm
znalazłem w archiwum http://drpixel.tuxfamily.org/,
z którego wcześniej nie korzystałem, zatem najpierw:
rpm -ivh http://drpixel.tuxfamily.org/fedora/drpixel-release-1-1.noarch.rpm
a następnie:
yum install --enablerepo=drpixel gtkam gtkam-gimp-plugin
W promocji został jeszcze zainstalowany pakiet
libexif-gtk
.
Gtkam wyświetla miniaturki zdjęć, można je
zaznaczać używając prawego przycisku myszy, kopiować i/lub usuwać.
Ostatni problem do rozwiązania: dlaczego gphoto2 nie widzi portu USB, jeżeli działam jako zwykły użytkownik. Coś nie tak z dostępem, tylko co?
gphoto2 --list-files Wystąpił błąd w bibliotece io \ ('Nie udało się zawłaszczyć urządzenia USB'):
Jest trochę stron w google na temat udev, gphoto2 i wyżej wymienionego
problemu dostępu. Jest też rozdział na ten
temat w dokumentacji gphoto2.
Próbowałem różnych podpowiedzi -- guzik działa. Ostatecznie, okazało
się, że jak się włączy usługę haldaemon
to wszystko jest OK
(Uprzednio ją wyłączyłem, bo wydawała się niepotrzebna.)
Zresztą czy wszystko, to się okaże -- przynajmniej
gphoto2
działa lepiej.