Scattare foto con Picamera 2 e Raspberry PI usando le coroutine in Python
Usare la libreria Picamera2 e Camera Module 3 è uno dei tanti modi per scattare foto co Raspberry PI. Il modo più semplice per usarla da programma è in Python, usando la libreria Picamera2. Una volta installato il modulo si può provare il codice proposto dalla documentazione ufficiale (The Picamera 2 Manual, cap 2.3):
from picamera2 import Picamera2, Preview
import time
picam2 = Picamera2()
camera_config = picam2.create_preview_configuration()
picam2.configure(camera_config)
picam2.start_preview(Preview.QTGL)
picam2.start()
time.sleep(2)
picam2.capture_file("test.jpg")
Questo programma avvia una finestra di preview, quindi in una board Raspberry Pi 4 headless (senza monitor e tastiera) può essere semplificato:
from picamera2 import Picamera2
cam = Picamera2()
cam.start()
cam.capture_file("test_1.jpg")
Se il programma è complesso e le elaborazioni sulle foto richiedono tempo, si può trarre vantaggio dall’esecuzione concorrente sui core del processore della scheda Raspberry. Python offre la libreria asyncio (Asynchronous I/O) che permette l’uso della sintassi async/await
.
Quando il programma deve svolgere un compito gravoso, lo lancia in parallelo, aspettando la fine dell’esecuzione solo quando avrà bisogno dei risultati, come in figura:
Nell’esempio seguente, uso solo le api di avvio e sincronizzazione delle coroutines: le funzioni concorrenti vengono dichiarate come async e vengono lanciate in parallelo con asyncio.create_task()
. Questo metodo restituisce un oggetto Task
, che poi può essere usato per una sincronizzazione successiva usando il comando await
:
#!/usr/bin/python3
import asyncio
from picamera2 import Picamera2
async def shot(camera):
# … some more code …
camera.capture_file("test_2.jpg")
# … some more code …
async def main():
cam = Picamera2()
cam.start()
task1 = asyncio.create_task(shot(cam))
# … some more code …
await task1
asyncio.run(main())
Riferimenti
- The Picamera 2 Manual: datasheets.raspberrypi.com/camera/picamera2-manual.pdf
- Raspberry Pi Camera Module 3 : datasheets.raspberrypi.com/camera/camera-module-3-product-brief.pdf
- Raspberry Pi 4 Model B Datasheet: datasheets.raspberrypi.com/rpi4/raspberry-pi-4-datasheet.pdf
- Python asyncio, Asynchronous I/O: docs.python.org/3/library/asyncio.html