PiCamera & Python – Aggiungiamo testi sulle immagini e video

meccanismo-complesso-picamera-raspberry-pir-add-text-video-image-ita

Negli articoli precedenti avevamo visto una panoramica generale sull’uso della webcam abbinata alla scheda Raspberry: la PiCamera. Inoltre, abbiamo preso confidenza con essa, scrivendo alcuni esempi di utilizzo in Python (vedi qui) e in un tutorial abbiamo visto come utilizzarla come telecamera di sicurezza (vedi qui).

[wpda_org_chart tree_id=33 theme_id=50]

In questo articolo, approfondiremo alcuni argomenti sulla libreria picamera: come configurare le impostazioni della webcam e come aggiungere del testo su delle immagini. Scriveremo una serie di esempi in Python per prendere familiarità con questi concetti fino ad arrivare all’esempio finale: Video Sorveglianza con PiCamera – come aggiungere il tempo corrente durante la ripresa di un video.

In questo articolo sono state utilizzate sia la PiCamera v2, che la scheda Raspberry Pi 3 Model B, comunque tutti codici e le argomentazioni rimangono valide anche per i modelli successivi.

Modificare le impostazioni di PiCamera

Prima di cominciare con degli esempi veri e propri, dobbiamo conoscere alcune configurazioni per quanto riguarda la picamera. Infatti quando si scatta una foto tramite la webcam, la qualità dell’immagine acquisita può dipendere da moltissimi fattori.

Il fattore più importante da regolare è quello della risoluzione. La risoluzione è un indicatore di quanto la foto è definita nei particolari, o meglio quanti pixel sono necessari per definire un’immagine. Maggiore sarà il numero di questi pixel, maggiore sarà la risoluzione, maggiore sarà il dettaglio nella foto.

Per quanto riguarda la PiCamera, è possibile definire diverse risoluzioni prima di acquisire un’immagine o un video. La Tabella seguente è stata presa dal sito ufficiale della libreria Picamera e illustra in modo chiaro le possibili risoluzioni con cui acquisire video o immagini.

#ResolutionAspect RatioFrameratesVideoImageFoVBinning
11920×108016:91-30fpsxPartialNone
22592×19444:31-15fpsxxFullNone
32592×19444:30.1666-1fpsxxFullNone
41296×9724:31-42fpsxFull2×2
51296×73016:91-49fpsxFull2×2
6640×4804:342.1-60fpsxFull4×4
7640×4804:360.1-90fpsxFull4×4

Apriamo un nuovo file con un editor di testo, e chiamiamolo, per esempio, picamera01.py.

nano picamera01.py

Per prima cosa aggiungiamo sempre la prima parte del codice, con le importazioni e la definizione della PiCamera. In questo esempio imposteremo la risoluzione 2592 x 1944 come è indicato nella tabella per l’acquisizione di immagini.

from picamera import PiCamera
import time

camera = PiCamera()
camera.resolution = (2592, 1944)

Poi scriviamo il codice seguente

camera.start_preview()
time.sleep(5)
camera.capture('image01.jpg')
camera.stop_preview()

Se abbiamo seguito i tutorial precedenti negli altri articoli, ci risulterà tutto familiare. Eseguiamo il codice e otterremo un’immagine di 2592 x 1944 pixel in un file JGP 2,4Mb di dimensione.

meccanismo-complesso-picamera-picture-01

Un altro fattore importante di cui tenere conto è la luminosità (brightness). Questo valore si può definire all’interno del codice, espresso tramite il parametro brightness dell’oggetto PiCamera. Tale valore può assumere tutti i valori compresi tra 0 e 100.  Se non specificato nel codice, il valore di default è 50 (quello della foto sopra). Proviamo ad impostare due valori diversi, specificando un’immagine più scura (brightness = 30) e una più chiara di quella precedente (brightness = 70).

Nel codice potete specificare brightness appena dopo la risoluzione.

camera = PiCamera()
camera.resolution = (2592, 1944)
camera.brightness = 30

L’immagine sottostante illustra le differenze di luminosità per i tre differenti valori.

meccanismo-complesso-picamera-picture-02

Allo stesso modo è possibile regolare il contrasto. Anche questo valore è espresso da un parametro contrast dell’oggetto PiCamera e può assumere valori compresi tra 0 e 100. Il valore di default è 50.

Ripetiamo l’esempio precedente, reimpostando brightness a 50 (non lo riporto) e variando questa volta contrast (per esaltare l’effetto scelgo 10 e 90 come valori di paragone).

meccanismo-complesso-picamera-picture-03

Aggiungere un testo ad un’immagine

Adesso che abbiamo visto come impostare le configurazioni della webcame, passiamo finalmente ad un esempio più pratico: scrivere testi sopra un’immagine o un filmato. Quindi modificheremo il codice precedente per far si che nella foto acquisita venga aggiunto un testo in alto, per esempio “I am what I am”.

Apriamo un nuovo file con un editor, e chiamiamolo, per esempio, textonimage.py.

nano textonimage.py

Per prima cosa aggiungiamo sempre la prima parte del codice, con le importazioni e la definizione della PiCamera.

from picamera import PiCamera
import time

camera = PiCamera()
camera.resolution = (2592, 1944)

camera.start_preview() 
camera.annotate_text = "I am what I am" 
time.sleep(5) 
camera.capture('image02.jpg') 
camera.stop_preview()

Eseguendo il codice precedente otterremo la seguente immagine.

meccanismo-complesso-picamera-picture-04

Devo dire che la scritta è davvero piccola rispetto all’immagine. Questo è dovuto al fatto che la risoluzione è al massimo. Se infatti abbassiamo la risoluzione la scritta avrà una dimensione diversa. Ma invece di cambiare la risoluzione, la modalità più corretta è quella di modificare la dimensione del testo attraverso il parametro annotate_text_size. Questo valore per default è 32, e può assumere valori che vanno da 6 a 160.

Visto la dimensione così minuscola, impostiamo questo valore a 120 e vediamo cosa succede.

camera.annotate_text_size = 120

Eseguendo il programma otteniamo finalmente una scritta a dimensioni leggibili.

meccanismo-complesso-picamera-picture-05

Adesso che abbiamo impostato la dimensione del carattere, è possibile impostare anche il suo colore. Se non vi piace il bianco potete impostare qualsiasi colore aggiungendo al codice, sia l’importazione della classe Color del modulo PiCamera che l’impostazione del parametro annotate_foreground, che corrisponde al colore del testo. La scritta è in trasparenza, ma se volete invece impostare lo sfondo della scritta con un colore, impostate il parametro annotate_background.

from picamera import PiCamera
from picamera import Color
import time

camera = PiCamera()
camera.resolution = (2592, 1944)

camera.start_preview()
camera.annotate_size = 120 
camera.annotate_foreground = Color('black')
camera.annotate_background = Color('white')
camera.annotate_text = " I am what I am " 
time.sleep(5) 
camera.capture('image02.jpg') 
camera.stop_preview()

Eseguendo il codice otterrete un’immagine simile alla seguente.

meccanismo-complesso-picamera-picture-06

Se in questo momento vi starete chiedendo…e adesso come posso spostare la scritta? Bene, purtroppo con picamera non è possibile. La speranza è riposta nelle release successive, oppure la soluzione è quella di utilizzare un’altra libreria Python che lavori sulle immagini già acquisite (non al momento dell’acquisizione). Ma questo non è quello che ci siamo prefissi in questo articolo. Quello che vogliamo è uno strumento di scrittura durante l’acquisizione video.

Aggiungere un testo al video

Adesso che sappiamo come acquisire una foto con un testo, il passo successivo sarà quello di farlo con un video.

Apriamo un file con un editor di testo e salviamolo come textonvideo.py.

from picamera import PiCamera 
import time 

camera = PiCamera()
camera.resolution = (1280, 720)

camera.start_preview()
camera.annotate_text = "I am what I am"
camera.start_recording('video.h264')
time.sleep(10)
camera.stop_recording()
camera.stop_preview()

Eseguendo il programma troverete un file video.h264 sul directory corrente.  Se volete convertirlo in un formato MP4, lanciate il comando.

MP4Box -fps 30 -add video.h264 video.mp4

Se non doveste avere MP4Box installato su Raspbian, potete installarlo:

$ sudo apt-get install -y gpac

Il video avrà in alto la scritta “I am what I am” per tutta la sua durata.

Esempio di Video Sorveglianza: Aggiungere il tempo corrente ad un video

Eccoci arrivati finalmente all’obiettivo che ci eravamo preposti, cioè quello di aggiungere il tempo corrente ad un video. Le telecamere di videosorveglianza hanno sempre una indicazione del tempo corrente durante la ripresa.

Quindi partendo dal codice dell’esempio precedente faremo alcune aggiunte in modo da poter riportare durante il filmato un testo con la data e l’ora.

from picamera import PiCamera 
import datetime as dt
import time 

camera = PiCamera()
camera.resolution = (1280, 720)

camera.start_preview()
camera.annotate_text = dt.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
camera.start_recording('video.h264')

start = dt.datetime.now()
while (dt.datetime.now() - start).seconds < 30:
    camera.annotate_text = dt.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    camera.wait_recording(0.2)
camera.stop_recording() camera.stop_preview()

Per prima cosa, per gestire i tempi e le date abbiamo bisogno di importare il modulo datetime. Poi in annotate_text assegnamo una stringa del tempo corrente con il formato %Y-%m-%d %H:%M:%S, che riporta sia la data che il tempo.

Poi per modificare il tempo durante la ripresa, all’interno di un loop viene aggiornato il valore di annotate_text, via via che viene acquisito il video. Questo  permette di riportare sempre il tempo corrente.

meccanismo-complesso-picamera-picture-07

Conclusioni

In questo articolo abbiamo visto come regolare alcuni impostazioni della webcam e come poter aggiungere del testo durante la ripresa. Abbiamo visto che con un semplice programma in Python è possibile aggiungere del testo dinamico durante un filmato. Nei prossimi articoli vedremo casi più complessi.

Lascia un commento