Annotatie – Foto met logo-/tekstoverlay

Een van de allermooiste toepassingen met camera vind ik de annotatie. Geautomatiseerd een foto maken en de actuele omgevingsinformatie erin plaatsen, eventueel met logo, locatienaam, tijdsweergave, weer- of milieugegevens. 

In deze tutorial leg ik in 4 stappen uit hoe je een foto die met de Picam gemaakt is automatisch kunt voorzien van een afbeelding en/of tekst, zoals een logo en de waarden van (weer)sensoren. Je kunt het annotatie principe gebruiken als weerstation waarin de sensorwaarden aan een foto zijn toegevoegd waar het weer betrekking op heeft. Zo nodig zou je de afbeelding ieder uur met FTP naar een website kunnen versturen, maar dat wordt in deze tutorial niet behandeld.

Het idee van dit project is ontstaan doordat binnen mijn tennisvereniging behoefte was om thuis te kunnen zien wat de actuele status van de tennisbanen is in combinatie met de weersomstandigheden. Hierdoor zouden de groundsman en de leden die ’s morgens al vroeg aanwezig zijn, thuis al kunnen zien of de banen bespeelbaar zijn. Het project is nooit geïmplementeerd, maar ik hield er een mooi project aan over.

1 – ImageMagick installeren
Om tekst of een afbeeldingen over een foto heen te kunnen leggen maken we gebruiken van het programma ImageMagick. Wil je meer van ImageMagick weten, op www.imagemagick.org vind je alle informatie over het pakket.

ImageMagick is (gratis) software dat geleverd wordt als een kant-en-klare distributie. Om ermee te kunnen werken moet het pakket eerst geïnstalleerd worden. Daarom wordt eerst een update van Raspbian geadviseerd.

sudo apt-get update 

Vervolgens installeren we Imagemagic:

sudo apt-get install imagemagick

Als ImageMagick eenmaal geïnstalleerd is kunnen we testen of het werkt.

Overlay tekst
Vanaf de opdrachtregel werkt het als volgt; de foto die je wilt gebruiken (jouw_foto.jpg) wordt voorzien van de tekst ‘jouw overlap tekst‘, dit mag een willekeurige tekst zijn. Zorg ervoor dat je in de map staat waarin jouw foto (.jpg) staat. Geeft vervolgens het onderstaande commando. Het resultaat is een nieuwe afbeelding geheten ‘jouw_output_foto.jpg‘.

Voorbeeld: De originele foto (jouw_foto.jpg)
convert jouw_foto.jpg -pointsize 36 -fill white -annotate +40+728 ‘jouw overlap tekst' jouw_output_foto.jpg

Om problemen met padverwijzigen te voorkomen is het beter om het volledige pad naar bestanden en programma’s op te geven. Dan wordt bovenstaande regel:

/usr/bin/convert /pad/naar/jouw_foto.jpg -pointsize 36 -fill white -annotate +40+728 'jouw overlap tekst' /pad/naar/jouw_output_foto.jpg

De commandoregel hierboven neemt de afbeelding jouw_foto.jpg en overlapt de tekst van jouw overlap-tekst 40 pixels vanaf de linker rand en 728 pixels vanaf de boven rand. De tekst zal 36 punten hoog en wit zijn. Het resultaat wordt opgeslagen als jouw_output_foto.jpg. De genoemde waarden kan je naar eigen keus zelf bepalen. Probeer maar eens andere waarden en kijk naar het resultaat.

De foto met de annotatie tekst

Foto aanvullen met meerdere tekstregels
Je kunt voor het outputbestand dezelfde bestandsnaam en hetzelfde pad gebruiken als het invoerbestand om het origineel te overschrijven. Dit is handig als je een bestand meerdere malen door de opdrachtregel met tekst wilt aanvullen. Je zult merken dat het bestand er ook kwetsbaar door kan worden als je bijvoorbeeld een fout maakt in de positionering van de annotatie. De tekst staat immers ‘hard’ in de nieuwe afbeelding. De fout even wegpoetsen is er niet bij. Je zult dan overnieuw moeten beginnen.

Deze overlapfunctie is ongelooflijk krachtig en niet moeilijk om te doen. Het programma doet deze stap iedere keer opnieuw, voor elk stuk tekst of afbeelding waarmee het de (dezelfde) afbeelding wil overlappen.

Het principe van meerdere overlays

Overlay afbeeldingen
Om een (kleine) afbeelding of logo in de overlapping te zetten maken we gebruik van hetzelfde programma als dat we voor de tekst gebruikt hebben, maar nu met andere opdrachtargumenten en parameters.

Ga in de map staan waarin alle benodigde bestanden (jouw_foto en de afbeeling logo.png) staan. Neem voor logo.png een kleine afbeelding, anders is de kans groot dat ‘ie niet zichtbaar wordt in jouw_output_foto.jpg. Geef het commando:

convert jouw_foto.jpg logo.png -geometry +50+50 -composite jouw_output_foto.jpg

Wil je problemen met padverwijzing voorkomen, vul dan de volledige padnamen in.

/usr/bin/convert /pad/naar/jouw_foto.jpg pad/naar/logo.png -geometry +50+50 -composite pad/naar/jouw_output_foto.jpg

De opdracht maakt gebruik van het ImageMagick commando ‘convert‘ om jouw_foto.jpg te laden en dit met het bestand logo.png te overlappen op 50 pixels vanaf de linker rand en 50 pixels naar beneden vanaf de boven rand. Het plaatst het resultaat in het bestand jouw_output_foto.jpg.

In plaats van jouw_output_foto.jpg kan dit dus ook jouw_foto.jpg zijn waarbij het origineel overschreven wordt om vervolgens opnieuw als input te gebruikt te worden, etc.

Foto met annotatie afbeelding

Gebruik je de output van de tekstannotatie ook als input voor de afbeeldingsannotatie, dan krijg je een gecombineerd resultaat.

Foto met dubbele annotatie

Bovenstaande kan je meerdere malen herhalen om verschillende teksten, afbeeldingen (logo’s) en/of sensorwaarden in één afbeelding te plaatsen.

Klaar of verder?
Ten aanzien van de overlappingstutorial ben je nu klaar, maar als je actuele waarden van sensoren in een foto/afbeelding wilt zetten, ga dan hieronder verder.

Het script (capture.py) dat we straks gebruiken heeft het logo in een specifieke directorie nodig. Maak de volgende directories aan en zet het gedownloade- of eigen logo (logo.png) al vast in de directorie ‘convert‘:

mkdir /home/pi/test/

mkdir /home/pi/test/convert/


2 – DHT11 sensorwaarden in afbeelding
Zoals ik de tutorial begon ging het er onder andere om sensorwaarden in een foto te plaatsen als ware een weerstation. Het mooie hiervan is dat je daarmee niet alleen ziet dat het regent, sneeuwt, bewolkt is of dat de zon schijnt, maar tevens leest wat de actuele klimaatwaarden zoals de temperatuur, de luchtvochtigheid en luchtdruk zijn.

Om die eerste twee waarden in de afbeelding te zetten gebruiken we de DHT11 sensor. Je kunt natuurlijk ook andere sensoren gebruiken, maar dan zal je het python script moeten aanpassen.

Wil je meer over de DHT11-sensor weten en hoe je ‘m aansluit, klik dan hier. De wijze waarop de sensor in die tutorial aangesloten wordt, komt overeen met het python script (capture.py) hieronder.

De DHT11 sensor (temperatuur en vochtigheid)

Om met onderstaande python script de temperatuur en luchtvochtigheid van de DHT-sensor uit te kunnen lezen en om het ImageMagick commando ‘convert’ te kunnen gebruiken moeten de benodigde bibliotheken geladen worden. De bibliotheek van ImageMagick hebben we hierboven al geïnstalleerd. Heb je de DHT11 sensor ook al geïnstalleerd doordat je de tutorial van de DHT11 gevolgd hebt, ga dan naar het hoofdstuk: 3 – Camera installeren, zo niet? Ga dan hieronder verder.

Download nu de bibliotheek van de DHT-sensor:

git clone https://github.com/adafruit/Adafruit_Python_DHT.git

Ga vervolgens naar de nieuwe map:

cd Adafruit_Python_DHT

Update het systeem en de afhankelijkheden:

sudo apt-get update

sudo apt-get install build-essential python-dev python-openssl

Mocht je een melding krijgen dat deze onderdelen reeds geïnstalleerd zijn, dan kun je deze negeren.

Ga in de nieuwe map Adafruit_Python_DHT staan en installeer de gekloonde software:

sudo python setup.py install

De bibliotheek om de DHT-sensor uit te lezen is nu geïnstalleerd en kan gebruikt worden. Je kunt de DHT-sensor testen door het dht.py script te gebruiken van de DHT-tutorial.

Plaats het script dht.py in de volgende directorie:

/home/pi/Adafruit_Python_DHT/dht11

Start het script met:

python dht.py

Het resultaat zou er als volgt uit moeten zien:

Het installeren van de sensor is nu klaar.


3 – Camera installeren

Raspberry Pi Camera Board v2 - Coolblue - Voor 23.59u, morgen in huis

Kijk hier hoe de camera fysiek op de Raspberry Pi aangesloten wordt. Je hoeft hiervan niet de PiCamera bibliotheek te laden omdat we in deze tutorial de bibliotheek RaspiStill gebruiken die standaard in Raspbian beschikbaar is. Wil je meer weten over RaspiStill, kijk dan hier. RaspiStill kun je testen door het volgende commando in te geven:

raspistill -v -o jouw_foto.jpg

In de directorie waarin je staat is nu een afbeelding beschikbaar genaamd jouw_foto.jpg. Dit is de foto die met het commando door de camera gemaakt is.

Het is de bedoeling dat jouw_foto.jpg later door het script in een specifieke map beland. Met de volgende commando’s maak je deze mappen aan.

mkdir /home/pi/camera/

mkdir /home/pi/camera/images/

Het installeren van de camera is nu klaar.


4 – De code
Ga in de map camera staan en kopieer het python script ‘capture.py‘ dat je hieronder download naar de map camera.

In het script wordt hetzelfde pad en dezelfde bestandsnaam (image.jpg) voor de invoer en uitvoer van alle overlay fasen gebruikt, wat betekent dat de originele foto bij elke overlay stap overschreven wordt.

Start het programma met:

sudo python capture.py 11 4

De ‘11’ achter het commando betreft het type DHT-sensor en de ‘4’ de gebruikte GPIO-poort (= pin 7).

Als alles goed staat zie je op het scherm de volgorde van afhandeling binnen het script. Het output bestand, inclusief de annotaties staat in de directorie /home/pi/camera/images, genaamd image.jpg.

Stapsgewijze afhandeling binnen script

Have A Nice Day!