SJ4000 foto’s bewerken en verzenden met Raspberry Pi

IMG_4681

Hoewel de cameramodule van de Rapsberry Pi prima foto’s maakt, is de beeldhoek van ongeveer 55 graden aan de krappe kant en laten de lichtgevoeligheid en resolutie wat te wensen over. Als je in het bezit bent van een (kloon) GoPro dan verwacht je betere beelden. Een SJ4000 bijvoorbeeld heeft een beeldhoek van ongeveer 170 graden en een resolutie van 4032×3024. Daarmee kun je aanzienlijk meer beeld tonen, hetgeen handig is in een beperkte ruimte zoals een woonkamer.

Mijn doel is om de SJ4000 te gebruiken in plaats van de Raspberry Pi cameramodule. Aan de softwarekant gebruikte ik op de Rapsberry Pi raspistill om de cameramodule te bedienen, voor een USB camera kun je hiervoor fswebcam gebruiken. Deze installeer je met sudo apt-get install fswebcam

Om de SJ4000 als USB webcam te gebruiken, volstaat het om bij het aansluiten aan de Raspberry Pi (met een USB kabel) op de SJ4000 de optie Use as PC Camera te kiezen. Als de boel gelijk lijkt te ontsporen (de rode LED van de Rapsberry Pi gaat knipperen, de camera gaat gelijk weer uit of doet rare dingen) dan is de voeding van de Raspberry Pi onvoldoende. De Raspberry Pi en SJ4000 nemen in dat geval gezamenlijk teveel stroom op.

Om te controleren of de opzet werkt, volstaat de instructie fswebcam -i 0 -r 1296x960 -d /dev/video0 afbeelding.jpg

De parameter -r laat de gewenste resolutie instellen. In het geval van de SJ4000 is dat 4032×3024 (12M),  3648×2736 (10M),  3264×2448 (8M) en 1296×960 (1.3M). Na enkele seconden is er een nieuwe afbeelding bewaard, genaamd afbeelding.jpg:

sj4000pic

De balk onder de afbeelding wordt door fswebcam toegevoegd, maar kan ook uit.

Foto’s maken met Raspberry Pi en uploaden via FTP

IMG_4102

Mijn Raspberry Pi B+ is uitgerust met een cameramodule, een Edimax WiFi dongle en een MC-RP002-CLR doorzichtige behuizing met uitsparing voor de camera. Met wat software moet het mogelijk zijn om periodiek een foto te maken en deze te uploaden naar een website. “Moet niet ingewikkeld zijn,” dacht ik nog. Zoekend op het internet kwam ik diverse oplossingen tegen, maar uiteindelijk heb ik mijn eigen koers gevaren met de volgende stappen:

  • Foto maken met raspistill
  • Optie foto bewerken met ImageMagick’s convert
  • Uploaden naar een website met ftp
  • Periodiek herhalen met cron

Vergeet niet de cameramodule aan te zetten in het raspi-config menu. Het programma raspistill maakt een foto met de cameramodule en bewaart deze foto als een JPG. Er zijn verschillende instellingen mogelijk, hieronder enkele belangrijke:

  • Resolutie, met parameter -md, van 640×480 (mode 6) tot 2592×1944 (mode 2) en 1920×1080 (mode 1)
  • JPG kwaliteit, met parameter -q, van 0 (lage kwaliteit en klein bestand) tot 100 (hoge kwaliteit en groot bestand)
  • EXIF informatie instellen, met parameter -x, zoals GPS metadata: -x GPS.GPSLatitude=53/1,9/1,0/1 -x GPS.GPSLongitude=4/1,51/1,34/1 voor N 53° 9′ 0″ en E 4° 51′ 34″. Overigens vereist de GPS-notatie enige bewerking
  • Naam van het uitvoerbestand, met parameter -o. Handig is hierbij om bestandsnamen te nummeren of uit datum-tijd te laten bestaan, met filename=$(date -u +"%Y%m%d%H%M%S").jpg

Met een basis ftp client is het eenvoudig genoeg om een bestand te uploaden naar een website, vooringenomen dat deze over een FTP-server beschikt. Het is nog wel bewerkelijk om de commando’s binnenin de ftp client in hetzelfde script op te nemen als de andere commando’s. Het geheim zit in het omleiden van de console input: ftp << EOF.

Voor een webpagina is het handig om een afbeelding met een vaste naam te hebben. De gemaakte foto wordt daarom altijd naar ‘latest.jpg’ gekopieerd, die daarmee overschreven wordt. Ik heb geen manier gevonden om via het ftp-protocol een bestandsnaam te kopiëren, anders dan de upload twee keer te doen. Da’s wel jammer, want de foto’s zijn aardig groot.

Script capload.sh:

filename=$(date -u +"%Y%m%d%H%M%S").jpg
host=ftp.myserver.nl
user=myusername
pass=mypassword
 
#Capture image
raspistill -o /tmp/$filename -md 2 -q 40
#Optional, include GPS coordinates
#raspistill -o /tmp/$filename -md 2 -q 40 -x GPS.GPSLatitude=53/1,9/1,0/1 -x GPS.GPSLongitude=4/1,51/1,34/1
#Transfer image
ftp -ivn $host << EOF user $user $pass
#Optional, uncomment when connecting succeeds, but uploading is not
#passive
put /tmp/$filename $filename
put /tmp/$filename latest.jpg
bye
EOF
#Remove transfered image file
#This is optional, as /tmp gets cleaned up after each reboot
rm /tmp/$filename

Ik gebruik de volgende cron job (crontab -e) om iedere vijftien minuten een foto te uploaden:

# Run the capload ('Capture Image and Upload') script every fifteen minutes
00 * * * * /home/pi/capload.sh
15 * * * * /home/pi/capload.sh
30 * * * * /home/pi/capload.sh
45 * * * * /home/pi/capload.sh

Hieronder een voorbeeld van een geuploade afbeelding:
Latest from Pi webcam

Soms is het handig om bestanden van een bepaalde leeftijd op te ruimen op de gebruikte ftp-server, om te voorkomen dat een schijf volloopt. Ik heb daar het volgende stukje opschooncode voor bedacht:

removefiles=$(date -d '7 days ago' +"%Y%m%d")*.jpg
mdel $removefiles