.. include:: /index.rst :start-after: start_hello_message :end-before: end_hello_message .. _py_photograph: 3.1 Fotomodul ========================== **Einführung** Dieses Projekt führt Sie in die Verwendung des Raspberry-Pi-Kameramoduls zum Aufnehmen eines Fotos ein. Das Kameramodul kann hochauflösende Standbilder und Videos aufnehmen und ist damit ein vielseitiges Werkzeug für Projekte – von Fotografie bis hin zu Computer-Vision-Anwendungen. ---------------------------------------------- **Was Sie benötigen** Nachfolgend sind die für dieses Projekt erforderlichen Komponenten aufgeführt: .. list-table:: :widths: 30 20 :header-rows: 1 * - KOMPONENTENBESCHREIBUNG - KAUFLINK * - :ref:`cpn_camera_module` - |link_camera_buy| * - :ref:`cpn_fusion_hat` - \- * - Raspberry Pi - \- ---------------------------------------------- **Versuchsablauf** #. Um das Kameramodul bequem zu verwenden, wird :ref:`assemble_fusion_hat_pan_tilt` empfohlen. .. note:: Das Zusammenbauen der Pan-Tilt-Halterung kann einige Pins verdecken. Daher wird empfohlen, sie nur bei Verwendung der Kamera zu montieren oder sie nach der Montage außen zu platzieren. .. image:: ../quick_start/img/gimbal_assemble.png #. Greifen Sie auf den Raspberry-Pi-Desktop zu: * :ref:`remote_desktop`: Verwenden Sie **VNC** für eine vollständige Desktop-Umgebung. * |link_rpi_connect|: Verwenden Sie **Raspberry Pi Connect**, um sicher über einen Browser auf Ihren Pi zuzugreifen. #. Öffnen Sie ein Terminal und wechseln Sie in den Code-Ordner: .. raw:: html .. code-block:: shell cd ~/ai-lab-kit/python #. Starten Sie das Skript, um die Kamera zu aktivieren: .. raw:: html .. code-block:: shell sudo python3 3.1_Photograph.py #. Nachdem das Skript gestartet wurde, drücken Sie die **Fusion HAT+ USR-Taste**, um Fotos aufzunehmen. .. image:: img/3.1_user_button.png :width: 50% * Jeder Tastendruck nimmt ein Bild auf. * Die Fotos werden unter ``~/user/Pictures`` als ``my_photo.jpg`` gespeichert. * Drücken Sie ``Ctrl+C``, um das Skript zu beenden. .. image:: img/3.1_take_photo.jpg :width: 70% .. note:: Die QT-Vorschau erfordert eine Desktop-Umgebung. Wenn die Vorschau nicht gestartet werden kann (z. B. bei Zugriff über SSH), kann die Kamera dennoch Fotos aufnehmen und diese normal speichern. ---------------------------------------------- **Code** Nachfolgend ist der in diesem Projekt verwendete Python-Code aufgeführt: .. raw:: html .. code-block:: python #!/usr/bin/env python3 import os, time, pwd from picamera2 import Picamera2, Preview from fusion_hat.user_button import UserButton u = os.getenv("SUDO_USER") home = pwd.getpwnam(u).pw_dir if u else os.path.expanduser("~") os.makedirs(f"{home}/Pictures", exist_ok=True) photo = f"{home}/Pictures/my_photo.jpg" camera = Picamera2() camera.configure(camera.create_preview_configuration()) def shot(): camera.capture_file(photo) print(f"Saved: {photo}") UserButton().set_on_click(shot) # Start preview only when a GUI display is available preview_started = False if os.getenv("DISPLAY"): try: camera.start_preview(Preview.QT) preview_started = True except Exception as e: print(f"Preview disabled: {e}") camera.start() print("Press USR to take photo. Ctrl+C to exit.") try: while True: time.sleep(0.1) except KeyboardInterrupt: pass finally: try: camera.stop() except: pass if preview_started: try: camera.stop_preview() except: pass try: camera.close() except: pass ---------------------------------------------- **Code verstehen** 1. **Importe und Zweck** .. code-block:: python import os, time, pwd from picamera2 import Picamera2, Preview from fusion_hat.user_button import UserButton Diese Module stellen Folgendes bereit: - ``os`` und ``pwd``: werden verwendet, um das tatsächliche Home-Verzeichnis des Benutzers korrekt zu ermitteln, selbst wenn das Programm mit ``sudo`` ausgeführt wird. - ``time``: sorgt dafür, dass das Programm in einer Schleife weiterläuft. - ``Picamera2`` und ``Preview``: steuern die Raspberry-Pi-Kamera sowie die Vorschau-Modi. - ``UserButton``: liest den USR-Button des Fusion HAT+. 2. **Bestimmen des Speicherpfads** .. code-block:: python u = os.getenv("SUDO_USER") home = pwd.getpwnam(u).pw_dir if u else os.path.expanduser("~") os.makedirs(f"{home}/Pictures", exist_ok=True) photo = f"{home}/Pictures/my_photo.jpg" Dieser Abschnitt bestimmt, wo die Fotos gespeichert werden: - Wenn das Skript mit ``sudo`` ausgeführt wird, wird ``SUDO_USER`` verwendet, um das ursprüngliche Home-Verzeichnis des Benutzers zu ermitteln. - Andernfalls wird das Home-Verzeichnis des aktuellen Benutzers verwendet. - Ein Ordner ``Pictures`` wird erstellt, falls er noch nicht existiert. - Alle Fotos werden als ``my_photo.jpg`` gespeichert (jedes neue Foto überschreibt das vorherige). 3. **Initialisierung der Kamera** .. code-block:: python camera = Picamera2() camera.configure(camera.create_preview_configuration()) Das Kameraobjekt wird erstellt und mit einer Standard-Vorschaukonfiguration eingerichtet. Diese Konfiguration funktioniert sowohl mit als auch ohne sichtbares Vorschaufenster. 4. **Funktion zum Aufnehmen eines Fotos** .. code-block:: python def shot(): camera.capture_file(photo) print(f"Saved: {photo}") Diese Funktion wird aufgerufen, wenn der USR-Button gedrückt wird. Sie nimmt ein Foto auf, speichert es im festgelegten Pfad und gibt anschließend den Speicherort aus. 5. **Verknüpfung mit dem USR-Button** .. code-block:: python UserButton().set_on_click(shot) Der USR-Button des Fusion HAT+ wird mit der Funktion ``shot`` verknüpft. Jeder Tastendruck löst eine Fotoaufnahme aus. 6. **Bedingtes Starten der Vorschau** .. code-block:: python preview_started = False if os.getenv("DISPLAY"): try: camera.start_preview(Preview.QT) preview_started = True except Exception as e: print(f"Preview disabled: {e}") - Das Programm prüft, ob eine grafische Anzeige verfügbar ist. - Wenn eine Anzeige vorhanden ist, wird versucht, ein QT-Vorschaufenster zu starten. - Wenn keine Anzeige verfügbar ist (z. B. bei Ausführung über SSH), wird die Vorschau übersprungen, ohne das Programm zu beenden. 7. **Start der Kamera und Hauptschleife** .. code-block:: python camera.start() print("Press USR to take photo. Ctrl+C to exit.") try: while True: time.sleep(0.1) Die Kamera wird gestartet, und das Programm tritt in eine Endlosschleife ein, um weiterzulaufen und auf Tastendrücke zu reagieren. 8. **Sauberes Beenden und Freigeben von Ressourcen** .. code-block:: python except KeyboardInterrupt: pass finally: try: camera.stop() except: pass if preview_started: try: camera.stop_preview() except: pass try: camera.close() except: pass Wenn ``Ctrl+C`` gedrückt wird: - Die Kamera wird gestoppt. - Die Vorschau wird nur gestoppt, wenn sie zuvor erfolgreich gestartet wurde. - Die Kameraressourcen werden sauber freigegeben. Dadurch wird sichergestellt, dass das Programm ohne Fehlermeldungen beendet wird, unabhängig davon, ob ein Vorschaufenster verwendet wurde. ------------------------- **Fehlerbehebung** 1. **Kein Vorschaufenster** - **Ursache:** Kamera nicht aktiviert, keine Anzeige verfügbar oder Picamera2 nicht installiert. - **Lösung:** Führen Sie das Skript auf einem System mit grafischer Oberfläche aus (nicht nur über SSH) und testen Sie Picamera2 mit einem einfachen Beispielskript. 2. **USR-Button funktioniert nicht** - **Ursache:** Fusion HAT+ nicht korrekt aufgesteckt, Button wird nicht erkannt oder falscher Fotoordner überprüft. - **Lösung:** Stecken Sie das HAT erneut auf, führen Sie das Skript mit ``sudo`` aus und prüfen Sie die Fotos im Ordner ``~/Pictures``. 3. **Fotos werden am falschen Ort gespeichert** - **Ursache:** Die Ausführung mit ``sudo`` kann zu Verwechslungen der Home-Verzeichnisse führen. - **Lösung:** Das Skript berücksichtigt dies bereits; geben Sie bei Unsicherheit ``REAL_USER`` oder ``PICTURES_DIR`` aus, um den tatsächlichen Speicherort zu prüfen. 4. **Vorschau friert ein** - **Ursache:** Die Kamera wird bereits von einer anderen Anwendung verwendet oder die Systemressourcen sind zu gering. - **Lösung:** Schließen Sie andere Anwendungen, aktualisieren Sie das System oder starten Sie den Raspberry Pi neu. -------------- **Fazit** Mit diesem Skript können Sie Fotos über den USR-Button des Fusion HAT+ aufnehmen und automatisch im Ordner ``~/Pictures`` speichern. Diese Einrichtung eignet sich ideal für einfache Kameraprojekte und kann beispielsweise für Zeitrafferaufnahmen, DIY-Kameraprojekte oder Demonstrationen im Unterricht erweitert werden.