L’utilisation de Picamera2 et du Camera Module 3 est l’une des nombreuses façons de prendre des photos avec Raspberry PI. Une fois installé le module hardware, vous pouvez essayer le code proposé par la documentation officielle (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")

Ce programme lance une fenêtre de prévisualisation, donc dans une carte Raspberry Pi 4 headless (sans écran ni clavier) cela peut être simplifié :

from picamera2 import Picamera2
cam = Picamera2()
cam.start()
cam.capture_file("test_1.jpg")

Si le programme est complexe et que le traitement des photos prend du temps, vous pouvez profiter d’une exécution simultanée sur les cores du processeur de la carte Raspberry. Python propose asyncio (Asynchronous I/O) qui permet l’utilisation de la syntaxe async/await.

Lorsque le programme doit effectuer une tâche lourde, il la lance en parallèle, n’attendant la fin de l’exécution que lorsqu’il a besoin des résultats, comme dans la figure suivante :

picam2.start()picam2.capture_file()... app code ...... app code ...... image elaboration ...... app code ...

Dans l’exemple suivant, j’utilise uniquement les functions de démarrage et de synchronisation des coroutines : les fonctions concurrentes sont déclarées comme async et sont lancées en parallèle avec asyncio.create_task(). Cette méthode renvoie un objet Task qui peut ensuite être utilisé pour une synchronisation ultérieure à l’aide de la commande 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())

Références