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).
This post describes in detail how to add GPS data to video file using `visual correlation' (see also: Video geocoding with gpsbabel).
There is an easy way to augment video files with GPS data using GPSbabel. Since version 1.4 of GPSBabel is able to create a subtitle file from a GPS tracklog. The subtitle contains latitude/longitude/altitude as well as the time. With a simple Perl scripts I have added current speed (not particularly accurate however).
To convert GPX file to subtitles one have to execute:
gpsbabel -i gpx -f FILE.gpx -o subrip,video_time=hhmmss,gps_time=hhmmss,gps_date=YYYYMMDD -F FILE.srt
Where: video_time
--
video position (relative to beginning of video) for which exact corresponding GPS timestamp
is known. gps_time
-- the time part
of the GPS timestamp which corresponds to a known position in the video.
gps_date
-- the date part of
the GPS timestamp which corresponds to a known position in the video.
On a video (see below) you can see that in 34 second I passed the zebra crossing. The zebra's crossing coordinates can be easily identified at Google Maps (cf. picture Crossing at Osowa). Now one have to search the GPX track for the point which is nearest to 54.429591/18.477973. I developed a simple Perl script for that purpose:
$ perl My_GPX_nearest_timestamp.pl -c 54.429591:18.477973 20130420.gpx *** USAGE: My_GPX_nearest_timestamp.pl -c latitude:longitude GPX-file *** Looking for 20 points near: 54.429591:18.477973 (lat/lon) *** > 15.3758195746663 2013-04-20T10:27:09Z 54.429509640:18.477780819 > 22.0617273294607 2013-04-20T09:05:15Z 54.429701502:18.478256240 > 32.6458959467509 2013-04-20T10:27:15Z 54.429787332:18.478348190 > 43.3771684316959 2013-04-20T09:05:24Z 54.429531014:18.477310427 > 47.7727043140018 2013-04-20T09:05:11Z 54.429905936:18.478475260 > 63.903936892351 2013-04-20T10:27:00Z 54.429627573:18.476987137 > 70.171200323179 2013-04-20T09:05:28Z 54.429655485:18.476893930
One can stipulate from the above output that I passed a point 15,4 meters away
from 54.429591/18.477973 at 10:27:09 GMT as well as I passed onother point which is 22 meters away from 54.429591/18.477973
at 09:05:15. As I cycled back and forth along the same route the second point is valid, the first
is accidentally closer but as the
time is almost one and half hours later it is clear that I was there on returning home.
So gpsbabel should be executed as follows (20130420.gpx
contains GPX track):
gpsbabel -i gpx -f 20130420.gpx -o subrip,video_time=000034,gps_time=090515,gps_date=20130420 -F 20130420_1.srt
Speed is added with another very simple Perl script:
perl add_speed_2_srt.pl 20130420_1.srt > 20130420_1_S.srt
Just to remind: internally all GPS units record time/date using Coordinated Universal Time aka Greenwich Mean Time vel Zulu time (for army enthusiasts). What the unit displays is another matter (usually it displays local time).
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?)