Camera-aansturing

Heb jij ooit de usb-aansluiting op je camera gebruikt om foto's te downloaden? Waarschijnlijk niet, want het SD-kaartje in je PC pluggen is gewoon veel handiger! Maar wist je dat die usb-poort op je camera nog veel meer in petto heeft? In deze workshop versturen we commando's naar onze camera vanaf een Raspberry Pi.

 De meeste midrange- en high-end camera's (en dan vooral spiegelreflexcamera's) bevatten uitgebreide ondersteuning voor aansturing via de usb-poort. De fabrikanten stellen daarvoor eigen software beschikbaar, zoals Nikons Camera Control Pro of Canons Eos Utility. Helaas is die software alleen voor Windows en Mac OS X beschikbaar en bovendien is het niet altijd gratis. Maar niet getreurd: als Linux-gebruikers beschikken we over het uitstekende gphoto2. Dat is een gratis tool die heel wat camera's van verschillende fabrikanten kan ondersteunen. Je kent gphoto2 misschien vooral als backend voor camera-ondersteuning in verschillende andere applicaties. Die backend vind je in het pakket libgphoto2. Installeer ook het pakket gphoto2, dat de gelijknamige commandline tool bevat. Dan ben je klaar om aan de slag te gaan!

 

Even verkennen

 Controleer eerst voor alle zekerheid of gphoto2 wel usb-aansturing ondersteunt voor jouw camera. Op http://www.gphoto.org/doc/remote vind je een uitgebreide lijst van ondersteunde modellen. Staat jouw camera in de lijst? Koppel hem dan via de usb-kabel aan je PC, schakel de camera in en voer het volgende commando uit:

  ghoto2 -a

 

Dat commando toont een lijst van alle aangesloten camera's. Na de naam van elke camera volgt een lijst van ondersteunde opties voor die camera. Voor dit artikel zijn met name volgende opties belangrijk:

 

  • USB support: uiteraard is dit aanwezig, want zonder usb-support zou je de camera-informatie zelfs niet kunnen opvragen;

  • Capture choices: bij oudere spiegelreflexcamera's wellicht enkel "Image", nieuwe modellen ondersteunen mogelijk ook "Preview", "Audio" en "Video" (al wordt die laatste momenteel nog door geen enkele driver ondersteund). Voor deze workshop volstaat het als jouw camera "Image" ondersteunt;

  • Configuration support: dit is nodig om ook de instellingen van de camera aan te passen via gphoto2. Het zou niet erg handig zijn als je steeds je camera manueel moet instellen en gphoto2 enkel kon gebruiken om foto's te nemen met die instellingen!

     

    Het correct instellen van je camera is erg belangrijk, maar we zullen eerst proberen of we al foto's kunnen nemen.

     

    Een eerste test

    Stel je camera in op de "Auto"-stand en gebruik het volgende commando om een foto te nemen:

     

    gphoto2 --capture-image

      

    Standaard bewaart gphoto2 de foto op je camera, maar let op! Zonder verdere configuratie gebruikt gphoto2 het RAM-geheugen van jouw camera en niét de SD-kaart. In feite wordt de foto dus weggeschreven naar een onbereikbare locatie! Daarom moet je gphoto2 vertellen om de SD-kaart te gebruiken als opslagmedium. Dat doe je met het volgende commando:

     

    gphoto2 --config

     

    Je komt nu terecht in een interactief menu waarin je alle (ondersteunde) opties van je camera kan wijzigen. Ga nu naar 'Camera Settings' > 'Capture Target' en gebruik de pijltjestoetsen om 'Internal RAM' te wijzigen in 'Memory card'. Verlaat dit menu en probeer opnieuw om een foto te nemen. Gphoto2 vertelt je meteen de bestandsnaam van de foto, bijvoorbeeld: '/store_00010001/DCIM/101NCD60/DSC_0823.JPG'.

     

    Een andere oplossing is om de foto's meteen naar je PC te downloaden en niet te bewaren op je camera. Gebruik daarvoor het commando:

     

    gphoto2 --capture-image-and-download

     

     

    Let wel op dat in dit geval de foto nu ook eerst wordt weggeschreven naar de SD-kaart en pas daarna naar je computer wordt gedownload. De SD-kaart is wellicht trager dan het RAM-geheugen van je camera. In combinatie met --capture-image-and-download wijzig je het Capture Target dus het beste terug in 'Internal RAM'. Dat doe je via het configuratiemenu (zoals hierboven uitgelegd) of met het volgende commando:

     

    gphoto2 --set-config /main/settings/capturetarget=0

     

    Instellingen aanpassen

    Gphoto2's --config-optie is erg handig om de verschillende configuratie-opties van je camera te verkennen. In een script is dat echter onbruikbaar: daar moet je de --set-config-optie gebruiken, zoals we hierboven deden. Maar hoe werkt dat precies? Zoals je in het configuratiemenu kon zien, zijn de opties onderverdeeld in verschillende categorieën, bijvoorbeeld 'Camera Settings', 'Image Settings' en 'Capture Settings'. De 'Capture Target'-optie bevindt zich onder 'Camera Settings' en wordt door gphoto2 geïdentificeerd als '/main/settings/capturetarget'. De gphoto2's --get-config-optie toont je zowel de huidige waarde als de mogelijke andere waarden:

     

    gphoto2 --get-config /main/settings/capturetarget

     

    In afbeelding 1 zie je dat de waarde 0 voor 'Internal RAM' staat en de waarde 1 voor 'Memory card'. Willen we dit terug aanpassen naar 'Memory card', dan gebruiken we het volgende commando:

     

    gphoto2 --set-config /main/settings/capturetarget=1

     

     

    Wil je weten welke opties er beschikbaar zijn? Met het volgende commando krijg je een beknopt overzicht:

     gphoto2 --list-config

     

    Meer informatie over één specifieke optie krijg je met het reeds vermelde --get-config-commando. Wil je meteen alle mogelijke waardes van elke optie zien? Gebruik dan:

     

    gphoto2 --list-all-config

     

    Dat resulteert wel in een ellenlange output, dus je pipet dit beter even naar less! Tot slot willen we nog even benadrukken dat voor opties die je niet via gphoto2 instelt de huidige waarden genomen worden. Dat lijkt misschien vanzelfsprekend, maar houdt dit toch in het achterhoofd als je je camera in erg uiteenlopende omstandigheden gebruikt. Pas je vaak heel wat instellingen aan op je camera, dan zet je die het beste allemaal terug op de standaardwaarden via gphoto2. Alleen zo ben je zeker dat je steeds de correcte instellingen gebruikt!

     

    Foto's nemen

    Intussen zijn we klaar voor het echte werk! Afhankelijk van het type foto's dat je wilt nemen vanaf je Pi, pas je de camera-instellingen aan. Welke instellingen je precies nodig hebt, laten we aan jou over. Bedenk even welke instellingen je meestal op je camera zelf aanpast en zoek daarvoor de geschikte gphoto2-commando's. Staat je camera op een statief en wil je foto's nemen van een landschap, dan zou dit er als volgt kunnen uitzien:

     

    1. Exposure Program: A

    2. F-Number: f/8

    3. Exposure Metering Mode: Multi spot

    4. Focus Mode: AF-S

    5. Focus Metering Mode: Single Area

     

    Het bijpassende gphoto2-commando zie je in afbeelding 2. Merk op dat we slechts 3 van de 5 opties op die manier instellen. Sommige opties zijn immers read-only: je kan met gphoto2 wel de huidige waarde ervan opvragen, maar aanpassen is niet mogelijk. Dat bleek het geval te zijn voor opties 1 en 4 in ons voorbeeld. Probeer je zulke opties aan te passen, dan geeft gphoto2 gelukkig wel een waarschuwing. Zo weet je meteen welke opties je nog manueel moet instellen op je camera.

     

    Voer je het commando uit afbeelding 2 meermaals uit om meerdere foto's te nemen, dan stoot je tegen een ander probleem. Gphoto2 probeert elke foto met dezelfde bestandsnaam op te slaan. Je krijgt dus een prompt met de vraag of het bestaande bestand capt0000.jpg mag overschreven worden. Niet erg handig in een script! Er zijn verschillende manieren om dat op te lossen:

 

  • gebruik de --force-overwrite-optie om bestaande bestanden zonder pardon te overschrijven;

  • hernoem het bestand capt0000.jpg voordat je gphoto2 opnieuw start (dit neem je op in het script waarin gphoto gestart wordt);

  • gebruik de --filename-optie om een andere bestandsnaam te specificeren. Hierbij kan je een aantal variabelen van het date-commando gebruiken (zie de manpages van gphoto2 en date voor meer uitleg). Bijvoorbeeld: --filename=%d%m%y_%H%M%S_%n.%C voor het formaat DDMMYY_HHMMSS (dag/maand/jaar/uur/minuten/seconden), gevolgd door een volgnummer en de bestandsextensie.

     

    Burst mode

    Je hebt misschien al gemerkt dat het even duurt voordat je camera reageert wanneer je een gphoto2-commando verstuurt. De eerste keer na het inschakelen duurt dat ongeveer 30 seconden en de keren daarna duurt dat nog steeds een vijftal seconden. Ook het downloaden van de foto kan wel enkele seconden duren. Maar wat als je een reeks foto's snel na elkaar wilt nemen? De meeste camera's beschikken over een zogenaamde 'burst mode' om meerdere foto's snel na elkaar te maken. Gebruik volgende opties om bijvoorbeeld 4 foto's in burst mode te nemen:

     

    --set-config /main/capturesettings/capturemode=1

    --set-config /main/capturesettings/burstnumber=4

     

    (Controleer wel eerst of die opties voor jouw camera hetzelfde zijn.) Helaas bleek het niet mogelijk te zijn om via --capture-image-and-download die vier foto's ook effectief te downloaden. Gphoto2 hing vast na het downloaden van de eerste foto. De drie laatste foto's waren we dus effectief kwijt. Bij een tweede poging gebruikten we dan maar --capture-image en lieten we de foto's wegschrijven naar de SD-kaart. Dit bleek wél correct te werken: in afbeelding 3 zie je een voorbeeld. Op die manier waren we in staat om foto's te nemen tegen de maximaal ondersteunde snelheid (Bij de Nikon D60 is dat iets meer dan 2 foto's per seconde in JPEG-formaat). Je moet de foto's dan wel achteraf nog downloaden naar je PC als je ze verder in een script wilt gebruiken.

     

     

    Wil je verschillende foto's na elkaar nemen met een langer interval? Gebruik dan opnieuw capturemode=0 en voeg volgende opties toe aan gphoto2:

     

    --frames: bepaalt hoeveel foto's er genomen moeten worden;

    --interval: bepaalt het interval (in seconden) tussen de verschillende foto's.

     

    In afbeelding 4 zie je bijvoorbeeld hoe je om de 10 seconden een foto neemt tot je er 10 hebt. Met deze methode kunnen we weer wél --capture-image-and-download gebruiken in plaats van --capture-image. Laat de --interval-optie gewoon weg als je wilt blijven fotograferen tot je gphoto2 afsluit met Ctrl-C.

     

     

    Time-lapse

    Intussen heb je een vrij goed beeld van gphoto2's mogelijkheden om je camera aan te sturen. Maar waarvoor zou je dit nu precies gebruiken? We geven twee korte voorbeelden, al laten we de precieze uitwerking hiervan natuurlijk aan jouzelf over. Een Pi en een camera zijn ideaal om ergens verdekt op te stellen en op gezette tijden een foto te nemen. Achteraf voeg je al die foto's samen tot één vloeiende time-lapse video. Experimenteer vooral zelf met het interval tussen de verschillende foto's. Time-lapse video's zijn ideaal om bijvoorbeeld de beweging van wolken, het groeiproces van planten of de vooruitgang van bouwwerken te volgen. Aangezien het interval meestal vrij lang is (gaande van enkele minuten tot pakweg éénmaal per dag), hoef je niet persé gphoto2's time-lapse modus te gebruiken. Je kan ook een script schrijven dat gewoon één foto neemt. Dat script start je dan op de gewenste tijdstippen vanuit cron.

     

    Een heikel punt bij time-lapse video's is de belichting. In principe wil je dat de belichting zo egaal mogelijk blijft, anders wordt het eindresultaat een geflikker van jewelste. Zaken zoals iso-waarde, diafragma en sluitertijd stel je dus het beste manueel in. Ook scherpstellen doe je beter manueel. Het nadeel is echter dat bij sterk wisselende omstandigheden (bijvoorbeeld een zonsondergang of zonsopgang) een deel van je foto's erg onderbelicht of overbelicht worden. In dergelijke gevallen laat je de sluitertijd beter automatisch bepalen door je camera, terwijl je het diafragma niet verandert.

     

    HDR

    Ook voor High Dynamic Range ofwel HDR-foto's is gphoto2 een handige tool. Moderne camera's beschikken vaak zelf over een functie om de benodigde foto's te nemen voor een HDR-foto. Bij oudere modellen is meestal niet het geval. Voor een HDR-foto heb je minstens drie verschillende foto's nodig die enkel verschillen in belichting. Maar het is niet zo eenvoudig om meerdere identieke foto's te nemen waarbij slechts één instelling gewijzigd is. De kans bestaat dat je de camera ietwat beweegt door de belichting aan te passen of de ontspanner af te drukken. Ook verlopen er al gauw 5 à 10 seconden tussen de verschillende foto's. Voor een HDR-foto op basis van 7 foto's is er zo bijna een minuut verschil tussen de eerste en de laatste foto. Maar geen paniek: gphoto2 is ideaal om dat soort klusjes te automatiseren!

     

    Het is immers mogelijk om meerdere foto's te nemen via één gphoto2-commando en voor elke foto bepaalde instellingen te wijzigen. Voor HDR-fotografie is met name de belichtingscorrectie van belang. Controleer eerst de mogelijke waardes voor jouw camera:\

     

    gphoto2 --get-config /main/capturesettings/exposurecompensation

     

    Voor de Nikon D60 zijn er 30 verschillende waardes, gaande van -5000 tot 5000, met tussenstappen van 333 (Op de camera zelf wordt dit weergeven als -5 tot +5, met tussenstappen van 0.3.). In afbeelding 5 zie je hoe we 5 foto's nemen met belichtingscorrectie -4, -2, 0, 2 en 4. De overige instellingen wijzig je uiteraard niet tussen de verschillende foto's. Ook hier gebruik je het beste de SD-kaart als opslagruimte. Zo treden er geen vertragingen op tussen het nemen van de foto's.

     

    Integratie

    Een belangrijk nadeel van gphoto2 is dat het even duurt voordat de camera klaar is om commando's te ontvangen. In sommige situaties is dat erg vervelend. Wat als je een bewegingsdetector koppelt aan je Pi en een foto wilt nemen bij een beweging? Een foto van 5 seconden later is waarschijnlijk niet erg informatief! Gelukkig is gphoto2 ook op een andere manier aan te sturen. Je start het gphoto2-commando in de achtergrond met de gewenste opties en voegt de optie --interval=-1 toe. Gphoto2 initialiseert nu de camera (wat tot 30 seconden kan duren), neemt een eerste foto en wacht op verdere instructies. Een foto nemen is eenvoudig: stuur het SIGUSR1-signaal (signaal 10) vanaf een andere terminal (of vanuit een script) naar het gphoto2-proces. Het juiste process ID vind je uiteraard met ps of pgrep. In afbeelding 6 zie je hoe we gphoto2 opgestart hebben in één terminal. In een tweede terminal gebruikten we dan volgend commando om foto's te nemen:

     

    pkill -10 -x gphoto2

     

    Uiteraard is dit slechts een eenvoudig voorbeeld. In de praktijk schrijf je beter een script dat gphoto2 opstart bij het booten van je Pi en de output wegschrijft in een logfile. Dat is handiger om achteraf te troubleshooten als het toch niet naar behoren werkt.

     

     

    Je eigen project

    We hopen dat bovenstaande ideeën je genoeg prikkelen om zelf aan de slag te gaan met je camera en je Pi. Je weet inmiddels hoe je met gphoto2 je camera het beste aanstuurt en wat je er allemaal mee kan doen. Maar een concreet project uitwerken, dat moet je vooral zélf doen. Je zal misschien een script moeten schrijven om verschillende gphoto2-commando's uit te voeren, de foto's te downloaden naar je Pi en eventueel verder te verwerken. Je kan ze dan beschikbaar stellen via een webserver of een Samba-share. Bevind je Pi zich op een afgelegen plaats zonder WiFi-ontvangst? Gebruik dan een UTMS-kaart om de foto's alsnog te uploaden naar een andere locatie. Is er geen netstroom aanwezig, koppel dan een battery pack aan je Pi. Of omgekeerd, is er wel netstroom en wil je dat je camera het niet begeeft? Koop dan een netstroomadapter voor je camera om onbeperkt foto's te nemen met je Pi.

 

NEDLINUX FORUM

Het nederlandse linuxforum
Voor beginners en pro’s

 

 

 

 

E-mailadres



 

 

Nieuwste editie:

Linuxmag op Facebook

@linuxmagnl op Twitter

linuxmagNL Linux Nieuws: @SUSE bestaat 25 jaar en trakteert! Maak kans op entreeticket voor #SUSECON in Praag, zie link!… https://t.co/ENJKDvyZQ8
linuxmagNL De nieuwe editie van Linux Magazine is weer uit! Thema: bescherm jezelf tegen hackers met Linux. Veel leesplezier a… https://t.co/Zcy3Zdjb90
linuxmagNL Ook de Red Hat Forum BeNeLux 2017 mag je dit jaar niet missen. 10 oktober 2017, zet het in je agenda! https://t.co/niY9UdK3Ov