Bemerkung

Hallo, willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Community auf Facebook! Tauchen Sie mit anderen Enthusiasten tiefer in Raspberry Pi, Arduino und ESP32 ein.

Warum beitreten?

  • Expertenunterstützung: Lösen Sie Probleme nach dem Kauf und technische Herausforderungen mit Hilfe unserer Community und unseres Teams.

  • Lernen & Teilen: Tauschen Sie Tipps und Tutorials aus, um Ihre Fähigkeiten zu verbessern.

  • Exklusive Vorschauen: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und Sneak Peeks.

  • Sonderrabatte: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte.

  • Festliche Aktionen und Gewinnspiele: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil.

👉 Bereit, mit uns zu entdecken und zu gestalten? Klicken Sie auf [here] und treten Sie noch heute bei!

3. Echtzeit-Kameraaufnahme

In den vorherigen Kapiteln haben wir gelernt, wie man lokale Videodateien liest und abspielt. In diesem Kapitel gehen wir einen Schritt weiter und verwenden die Raspberry-Pi-Kamera für die Echtzeit-Videoaufnahme sowie Farbraumkonvertierungen mit OpenCV.

1. Projektziele

  • Verwenden von Picamera2, um Kameraframes in Echtzeit aufzunehmen

  • Umwandeln der Kameraausgabe vom BGRA-Format in das BGR-Format

  • Verwenden von OpenCV für die Echtzeitvorschau

  • Verständnis der Eigenschaften und Einsatzbereiche verschiedener Farbräume

Darstellung der Echtzeit-Kameravorschau

2. Code ausführen

Wichtig

Stellen Sie vor dem Start sicher, dass:

  • das Pan-Tilt-Modul montiert ist

  • Sie Zugriff auf den Raspberry-Pi-Desktop haben

  • das Codepaket installiert ist

  • das Fusion HAT+ installiert und konfiguriert ist

  • OpenCV installiert ist

Detaillierte Anweisungen finden Sie unter 0. OpenCV einrichten.

  1. Öffnen Sie das Terminal und geben Sie den folgenden Befehl ein:

    cd ~/ai-lab-kit/opencv_python
    python3 cv_3_camera.py
    
  2. Wenn Sie das Programm ausführen, erscheinen zwei OpenCV-Fenster:

    • BGR Frame – zeigt das Live-Kamerabild in Farbe

    • GRAY Frame – zeigt die Graustufenversion desselben Bildes

    Sie können das Programm auf zwei Arten beenden:

    • Drücken Sie die q-Taste auf der Tastatur

    • Schließen Sie eines der Fenster über die Schaltfläche zum Schließen (X)

    Nach dem Beenden stoppt die Kameraübertragung und alle OpenCV-Fenster werden geschlossen.

3. Beispielcode

Unten finden Sie das vollständige Python-Beispiel für dieses Kapitel (cv_3_camera.py):

# Import Picamera2 for Raspberry Pi Camera
from picamera2 import Picamera2
import cv2
import time

# Create a Picamera2 object
picam2 = Picamera2()

# Create a camera configuration
# XRGB8888 is a 4-channel format (similar to BGRA)
# size sets the resolution of the camera frame
config = picam2.create_preview_configuration(
   main={"size": (640, 480), "format": "XRGB8888"}
)

# Apply the configuration to the camera
picam2.configure(config)

# Start the camera
picam2.start()

print("Streaming... press 'q' to quit")

# Window names
WINDOW_BGR = "BGR Frame"
WINDOW_GRAY = "GRAY Frame"

while True:
   # Capture one frame as a NumPy array (BGRA-like format)
   frame_bgra = picam2.capture_array()

   # Convert BGRA to BGR for normal color display
   frame_bgr = cv2.cvtColor(frame_bgra, cv2.COLOR_BGRA2BGR)

   # Convert BGRA directly to grayscale
   frame_gray = cv2.cvtColor(frame_bgra, cv2.COLOR_BGRA2GRAY)

   # Display the color and grayscale frames
   cv2.imshow(WINDOW_BGR, frame_bgr)
   cv2.imshow(WINDOW_GRAY, frame_gray)

   # Process GUI events and check keyboard input
   # Press 'q' to exit the loop
   key = cv2.waitKey(1) & 0xFF
   if key == ord("q"):
      break

   # Exit if the user closes any OpenCV window
   if (cv2.getWindowProperty(WINDOW_BGR, cv2.WND_PROP_VISIBLE) < 1 or
      cv2.getWindowProperty(WINDOW_GRAY, cv2.WND_PROP_VISIBLE) < 1):
      break

   # Optional: limit frame rate to reduce CPU usage (about 30 FPS)
   time.sleep(1 / 30)

# Stop the camera
picam2.stop()

# Close all OpenCV windows
cv2.destroyAllWindows()

4. Code-Erklärung

  1. Erforderliche Bibliotheken importieren:

    from picamera2 import Picamera2
    import cv2
    import time
    

    Picamera2 erfasst Frames von der Raspberry-Pi-Kamera, und OpenCV wird für Bildkonvertierung und Anzeige verwendet.

  2. Ein Picamera2-Objekt erstellen und die Kamera konfigurieren:

    picam2 = Picamera2()
    
    config = picam2.create_preview_configuration(
        main={"size": (640, 480), "format": "XRGB8888"}
    )
    
    picam2.configure(config)
    picam2.start()
    

    Dadurch wird die Kamera mit einer Auflösung von 640×480 gestartet. XRGB8888 ist ein 4-Kanal-Format, sodass jedes aufgenommene Frame BGRA-ähnlich ist.

  3. Ein Frame als NumPy-Array erfassen:

    frame_bgra = picam2.capture_array()
    

    In jeder Schleife wird ein Frame von der Kamera gelesen.

  4. Das Frame für die Anzeige konvertieren:

    frame_bgr = cv2.cvtColor(frame_bgra, cv2.COLOR_BGRA2BGR)
    frame_gray = cv2.cvtColor(frame_bgra, cv2.COLOR_BGRA2GRAY)
    
    • frame_bgr wird für die normale Farbdarstellung verwendet.

    • frame_gray ist eine Graustufenversion desselben Frames.

  5. Frames in zwei Fenstern anzeigen:

    cv2.imshow(WINDOW_BGR, frame_bgr)
    cv2.imshow(WINDOW_GRAY, frame_gray)
    

    Dadurch werden zwei OpenCV-Fenster geöffnet: eines zeigt das Farbbild, das andere die Graustufenversion.

  6. Abbruchbedingungen (q drücken oder Fenster schließen):

    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        break
    
    if (cv2.getWindowProperty(WINDOW_BGR, cv2.WND_PROP_VISIBLE) < 1 or
        cv2.getWindowProperty(WINDOW_GRAY, cv2.WND_PROP_VISIBLE) < 1):
        break
    
    • Drücken Sie q, um das Programm zu beenden.

    • Das Schließen eines der Fenster beendet das Programm ebenfalls sicher.

  7. FPS begrenzen, um die CPU-Auslastung zu reduzieren:

    time.sleep(1 / 30)
    

    Dadurch wird eine kleine Verzögerung hinzugefügt, sodass die Schleife mit etwa 30 FPS läuft, was die CPU-Belastung auf dem Raspberry Pi reduzieren kann.

  8. Kamera stoppen und OpenCV-Fenster schließen:

    picam2.stop()
    cv2.destroyAllWindows()
    

    Dadurch wird die Kamera freigegeben und alle OpenCV-Fenster werden geschlossen, bevor das Programm beendet wird.

5. Die Bedeutung der Farbraumkonvertierung

Das von der Kamera ausgegebene Rohbildformat entspricht nicht immer dem Format, das OpenCV für die Verarbeitung benötigt. In diesem Beispiel gibt Picamera2 Bilder im XRGB8888 (BGRA)-Format aus, während OpenCV hauptsächlich das BGR-Format verwendet.

Daher müssen wir das Bild wie folgt konvertieren:

frame_bgr = cv2.cvtColor(frame_bgra, cv2.COLOR_BGRA2BGR)

Dadurch wird sichergestellt, dass das Bild in der von OpenCV verwendeten Standardreihenfolge der BGR-Kanäle vorliegt und korrekt angezeigt sowie verarbeitet werden kann.

Anschließend können wir das BGR-Bild zur weiteren Verarbeitung in ein Graustufenbild umwandeln:

frame_gray = cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2GRAY)

Dadurch lassen sich kamerabasierte Bilder in ein Format umwandeln, das sich für OpenCV-Bildverarbeitungsabläufe eignet.

Gängige Farbräume und ihre Anwendungsfälle

Farbraum

Eigenschaften

Typische Anwendungsfälle

BGR

Standardformat von OpenCV

Bildanzeige, grundlegende Verarbeitung, Kantenerkennung

RGB

Für Menschen intuitiver

Visualisierung, Eingabe für Deep-Learning-Modelle

GRAY

Einkanal-Graustufenbild

Objekterkennung, Kantenerkennung, Leistungsoptimierung

HSV

Trennt Farbe und Helligkeit

Farberkennung, Objektverfolgung, Segmentierung

YCrCb

Trennt Luminanz und Chrominanz

Gesichtserkennung, Videokompression, Robustheit gegenüber Beleuchtung

Zum Beispiel eignet sich HSV häufig besser für Farberkennung und Objektverfolgung, während YCrCb robuster für Gesichtserkennung oder Szenen mit wechselnden Lichtverhältnissen ist.

6. Erweiterungen und Übungen

  • Versuchen Sie, das Bild von BGR nach GRAY oder HSV zu konvertieren und beobachten Sie die Ergebnisse.

    Verwenden Sie zum Beispiel:

    • cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2RGB)

    • cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2HSV)

    • und weitere

  • Testen Sie verschiedene Auflösungen (z. B. 1280×720) und beobachten Sie die Auswirkungen auf Latenz und Bildrate.

  • Kombinieren Sie diesen Code mit dem vorherigen Video-Wiedergabebeispiel, um zwischen einem Kamerastream und einer Videodatei umzuschalten.