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
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.
Öffnen Sie das Terminal und geben Sie den folgenden Befehl ein:
cd ~/ai-lab-kit/opencv_python python3 cv_3_camera.py
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
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.
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.
XRGB8888ist ein 4-Kanal-Format, sodass jedes aufgenommene Frame BGRA-ähnlich ist.Ein Frame als NumPy-Array erfassen:
frame_bgra = picam2.capture_array()
In jeder Schleife wird ein Frame von der Kamera gelesen.
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_bgrwird für die normale Farbdarstellung verwendet.frame_grayist eine Graustufenversion desselben Frames.
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.
Abbruchbedingungen (
qdrü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.
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.
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.