As I mentioned at the end of my last post I have been playing around with gphoto2 to create some time lapse videos of the assembly of one of my Christmas gifts.
I have played with making time lapse video before, when I set up my MMS CCTV system with motion I enabled a feature that creates a video from a sample image every 30 seconds. Motion uses the web cam (or other Video4Linux src) and all the web cams I had access to up at my folks are pretty low resolution so this wasn’t what I was looking for.
I did have my Canon 350D and the little point and shoot Canon A520 that lives on the end of my work bag so I thought I’d see what I could do with them. The 350D is 8 Megapixel and the A520 is 4 Megapixel so both will take a frame way bigger than 720p that I can crop down.
I had a bit of a look round and found an app called gphoto2 that claimed to be able to drive both cameras via the USB port to take images at a set interval. I plugged the 350D in and tried to get it to work but I kept getting the following error*:
*** Error *** Sorry, your camera does not support generic capture ERROR: Could not capture. *** Error (-6: 'Unsupported operation') ***
So I swapped over to the A520 and things seamed to work fine. So I set it up on the tripod and fired off the following command:
[hardillb@bagend ~]$ gphoto2 --capture-image -I 120
This triggers the camera every 2 mins which I thought should be enough time to see some progress in each frame.
Apart from having to swap the batteries twice it all went rather well, I soon started to ignore the little beep from the camera as it took each shot. At the end I copied all the images off the SD card for processing. Each image started out at 2272×1704 so they would have been big enough to use in 1080p video but I decided to shrink them down to 720p.
The following little ImageMagik script resizes the images down and adds 2 black bars down the sides to pad it out to a full 16:9 720p frame size.
#!/bin/sh for x in `ls *.JPG` do convert $x -resize 1280x720 -bordercolor black -border 160x0 resized/$x done
The first bit -resize 1280×720 resized the original image down to 720 pixels high and the second bit -bordercolor black -border 160×0 adds on the 2 x 160 pixel wide black bars to pad the image up to the required 1280 pixels wide before writing a copy out to the resized directory.
And this mencoder line to stitch them together as a video with 2 frame per second so each second of video is equivalent to about 4 minutes of real time.
mencoder "mf://*.JPG" -mf fps=2 -o day1.avi -ovc lavc -lavcopts \ vcodec=msmpeg4v2:vbitrate=800
Here is a sample of the output
*I have since found this gphoto bug report that mentioned changing the camera’s USB mode from PTP mode to normal mode. After finding this setting on the camera I managed to get the 350D to work with gphoto2 as well.
I wonder if `ls *` made it to beanz and sxa’s top 10 bash crimes? Once for the backtick and again for the unnecessary subshell call. “for x in *.JPG”.
Shhh, neither of them will notice! In my defence it was never actually a script just a random command line that I reformed into a script later and it only really had to deal with about 300 files…..