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!
7. Menschliche Posenschätzung
1. Überblick
Nach der Implementierung von Hand- und Gestenerkennung stellt dieses Kapitel MediaPipe Pose vor — ein leichtgewichtiges, aber leistungsstarkes Modul zur Echtzeit-Schätzung menschlicher Körperposen.
Mit MediaPipe Pose können wir 33 Körper-Landmarks in Echtzeit erkennen und ein vollständiges Körperskelett im Videostream darstellen.
Dieses Modul kann verwendet werden für:
Aktionserkennung
Haltungskorrektur
Fitnessüberwachung
Bewegungsanalyse
2. Funktionsweise
Das Programm führt die folgenden Schritte aus:
Initialisierung des MediaPipe-Pose-Modells (Konfiguration der Modellkomplexität und optionaler Segmentierung).
Erfassen von Videoframes mit
Picamera2.Konvertieren der Frames in das RGB-Format (erforderlich für MediaPipe).
Ausführen des Pose-Modells, um 33 Körper-Schlüsselpunkte zu erhalten.
Zeichnen der Schlüsselpunkte und Skelettverbindungen mit OpenCV.
Anzeige des annotierten Videostreams in Echtzeit.
Dieses Kapitel bildet die Grundlage für fortgeschrittene Mensch–Computer-Interaktion und Analyse von Körperbewegungen.
3. 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:
sudo python3 ~/ai-lab-kit/mediapipe/mp_pose.py
Wenn Sie MediaPipe Pose mit einem aufgezeichneten Video verwenden möchten, können Sie folgenden Befehl ausführen:
sudo python3 ~/ai-lab-kit/mediapipe/mp_pose_video.py
Nach dem Start des Programms öffnet sich ein Fenster mit dem Titel „Show Video“ und zeigt den Live-Kamerastream an.
Wenn eine Person vor der Kamera erscheint:
MediaPipe Pose erkennt in Echtzeit 33 Körper-Landmarks.
Ein vollständiges Körperskelett wird im Videobild dargestellt.
Wichtige Gelenke wie Schultern, Ellbogen, Handgelenke, Hüften, Knie und Knöchel werden durch Linien verbunden.
Während sich die Person bewegt:
folgen die Skelett-Schlüsselpunkte den Körperbewegungen flüssig.
aktualisiert sich das Skelett kontinuierlich in Echtzeit.
Wenn Hintergrundsegmentierung aktiviert ist (
enable_segmentation=True), berechnet das Modell intern eine Segmentierungsmaske, obwohl in diesem Beispiel nur das Skelett angezeigt wird.Wenn keine Person erkannt wird, zeigt das Programm lediglich den normalen Kamerastream ohne Markierungen an.
Drücken Sie
q, um das Programm zu beenden. Die Kamera stoppt und das OpenCV-Fenster wird automatisch geschlossen.
4. Vollständiger Code
Hier ist ein einfaches Programm zur Erkennung menschlicher Körperposen:
from picamera2 import Picamera2, Preview
import cv2
import mediapipe.python.solutions.pose as mp_pose
import mediapipe.python.solutions.drawing_utils as drawing
import mediapipe.python.solutions.drawing_styles as drawing_styles
# Initialize the Pose model
pose = mp_pose.Pose(
static_image_mode=False, # False for processing video streams
model_complexity=2, # 0~2, higher is more accurate
enable_segmentation=True, # Enable background segmentation (optional)
)
# Open the camera
picam2 = Picamera2()
config = picam2.create_preview_configuration(
main={"size": (640, 480), "format": "XRGB8888"} ,
)
picam2.configure(config)
picam2.start()
print("Streaming... press 'q' to quit")
while True:
frame_bgra = picam2.capture_array()
frame_bgr = cv2.cvtColor(frame_bgra, cv2.COLOR_BGRA2BGR)
# Convert BGR to RGB (required by MediaPipe)
frame_rgb = cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2RGB)
# Pose detection
results = pose.process(frame_rgb)
# Convert RGB back to BGR (required by OpenCV)
frame = cv2.cvtColor(frame_rgb, cv2.COLOR_RGB2BGR)
# If human body is detected, draw skeleton
if results.pose_landmarks:
drawing.draw_landmarks(
frame,
results.pose_landmarks,
mp_pose.POSE_CONNECTIONS,
landmark_drawing_spec=drawing_styles.get_default_pose_landmarks_style(),
)
cv2.imshow("Show Video", frame)
if cv2.waitKey(1) & 0xff == ord('q'):
break
picam2.stop_preview()
picam2.stop()
cv2.destroyAllWindows()
Nach dem Ausführen des Programms zeigt der Kamerastream ein Echtzeit-Skelett des menschlichen Körpers an, einschließlich:
33 Schlüsselpunkte
Skelett-Verbindungslinien
Das Skelett folgt den Bewegungen, wenn sich die Person bewegt
5. Code-Erklärung
1. Bibliotheken importieren
from picamera2 import Picamera2, Preview
import cv2
import mediapipe.python.solutions.pose as mp_pose
import mediapipe.python.solutions.drawing_utils as drawing
import mediapipe.python.solutions.drawing_styles as drawing_styles
Picamera2 Steuert die Raspberry-Pi-Kamera und basiert auf libcamera.
cv2 (OpenCV) Wird für Farbkonvertierung (BGR↔RGB), Anzeige von Fenstern und Zeichnen von Grafiken verwendet.
mediapipe.python.solutions.pose Das Pose-Modell von MediaPipe, das 33 Ganzkörper-Schlüsselpunkte erkennen kann (Kopf, Schultern, Ellbogen, Knie usw.) und außerdem Segmentierungsmasken (Person vs. Hintergrund) zurückgeben kann.
drawing_utils / drawing_styles Integrierte Zeichenwerkzeuge und Stildefinitionen von MediaPipe, die zum Zeichnen von Schlüsselpunkten und Skelettlinien verwendet werden.
2. Pose-Modell initialisieren
pose = mp_pose.Pose(
static_image_mode=False, # Continuous video mode
model_complexity=1,
enable_segmentation=True,
)
static_image_mode=False: Gibt an, dass die Eingabe ein kontinuierlicher Videostream und kein Einzelbild ist. Nach der ersten Erkennung wird Tracking verwendet, was schneller ist. In der Regel auf False gesetzt.model_complexity=1: Modellkomplexität, 0=leicht, 1=mittel, 2=hohe Genauigkeit (langsamer). Setzen Sie 1 oder 2, wenn die Leistung des Raspberry Pi ausreichend ist.enable_segmentation=True: Gibt eine Segmentierungsmaske für die Person aus und kann Vordergrund (Person) vom Hintergrund unterscheiden. Wenn True, können Effekte wie Hintergrundersetzung oder Chroma-Key umgesetzt werden. Diese Verwendung wird in der folgenden Dokumentation erklärt: 9. Green-Screen
MediaPipe Pose gibt eine Ergebnisstruktur zurück, die Folgendes enthält:
pose_landmarks: 33 Schlüsselpunkte;pose_world_landmarks: 3D-Weltkoordinaten;segmentation_mask: Segmentierungskarte der Person.
3. Kamera öffnen
picam2 = Picamera2()
config = picam2.create_preview_configuration(
main={"size": (640, 480), "format": "XRGB8888"} ,
)
picam2.configure(config)
#picam2.start_preview(Preview.QTGL)
picam2.start()
Kameraobjekt
Picamera2()erstellenAuflösung auf 640x480 setzen, Pixelformat
"XRGB8888"(4-Kanal BGRA). Dieses Format hat die beste Kompatibilität mit OpenCV und vermeidet zusätzliche Dekodierungsschritte.Kamera starten.
Optional:
picam2.start_preview(Preview.QTGL) kann den Videostream direkt über die GPU anzeigen; hier auskommentiert und stattdessen wird OpenCVs imshow() verwendet.
4. Hauptschleife: Verarbeitung jedes Frames
while True:
frame_bgra = picam2.capture_array() # Capture a frame from the camera (BGRA format)
frame_bgr = cv2.cvtColor(frame_bgra, cv2.COLOR_BGRA2BGR)
Das aktuelle Frame erfassen. Picamera2 gibt Bilder standardmäßig im BGRA-Format (Blue, Green, Red + Alpha) zurück.
In BGR konvertieren für die weitere Verarbeitung mit OpenCV.
# Convert to RGB for MediaPipe
frame = cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2RGB)
results = pose.process(frame)
MediaPipe-Modelle müssen RGB verwenden.
Aufruf von
pose.process()zur Erkennung der Schlüsselpunkte.resultsist ein komplexes Objekt, das enthalten kann:results.pose_landmarks: Schlüsselpunkte (33 Punkte)results.pose_world_landmarks: 3D-Koordinatenresults.segmentation_mask: Segmentierungsmaske
# Convert back to BGR for OpenCV display
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
Zurückkonvertieren, da OpenCVs imshow() das BGR-Format benötigt.
5. Pose-Schlüsselpunkte zeichnen
if results.pose_landmarks:
drawing.draw_landmarks(
frame,
results.pose_landmarks,
mp_pose.POSE_CONNECTIONS,
landmark_drawing_spec=drawing_styles.get_default_pose_landmarks_style(),
)
Wenn ein menschlicher Körper erkannt wird:
results.pose_landmarksenthält(x, y, z, visibility)für jeden Schlüsselpunkt.x, y: Normalisierte Koordinaten (0~1)z: Relative Tiefevisibility: Sichtbarkeitskonfidenz des Schlüsselpunktes (0~1)
Erklärung der
draw_landmarks-Parameter:frame: Bild, auf dem gezeichnet wird (BGR-Format)results.pose_landmarks: Menschliche Schlüsselpunkte des aktuellen Framesmp_pose.POSE_CONNECTIONS: Verbindungsregeln (welche Punkte mit Linien verbunden werden)landmark_drawing_spec: Zeichenstil für Punkteconnection_drawing_spec: Zeichenstil für Linien (optional, verwendet standardmäßig den Systemstil)
Effekt: Zeichnet das Körperskelett (Verbindungen für Kopf, Arme und Beine) sowie die Schlüsselpunkte (Gelenkpositionen) auf das Bild.
6. Frame anzeigen & Exit-Logik
cv2.imshow("Show Video", frame)
if cv2.waitKey(1) & 0xff == ord('q'):
break
Jedes Frame wird im Fenster "Show Video" angezeigt.
Die Schleife wird beendet, wenn die Taste q gedrückt wird.
7. Ressourcen freigeben
picam2.stop_preview()
picam2.stop()
cv2.destroyAllWindows()
Vorschau stoppen, Kamera freigeben und alle OpenCV-Fenster schließen.
6. Einführung in das Pose-Modell
Das MediaPipe-Pose-Modul liefert 33 Schlüsselpunkte, die Bereiche wie Kopf, Rumpf, Arme und Beine abdecken:
Körperteil |
Index |
|---|---|
Nose |
0 |
Left/Right Shoulder |
11 / 12 |
Left/Right Elbow |
13 / 14 |
Left/Right Wrist |
15 / 16 |
Left/Right Hip |
23 / 24 |
Left/Right Knee |
25 / 26 |
Left/Right Ankle |
27 / 28 |
Left/Right Foot Index |
31 / 32 |
Diese Punkte können für Haltungsbewertung, Bewegungszählung (z. B. Kniebeugen, Liegestütze, Yoga-Posenerkennung) usw. verwendet werden.
7. Leistung und Optimierung
Element |
Auswirkung |
Optimierungsvorschlag |
|---|---|---|
Auflösung |
Höhere Auflösung erhöht die Genauigkeit, aber auch die Latenz |
Verwenden Sie 640x480, um Leistung und Geschwindigkeit auszubalancieren |
model_complexity |
Verbessert die Erkennungsgenauigkeit, verlangsamt jedoch die Berechnung |
Für Raspberry Pi wird 1~2 empfohlen |
segmentation |
Erhöht die GPU/CPU-Last |
Empfohlen zu deaktivieren, wenn kein Hintergrundersatz benötigt wird |
8. Fehlerbehebung
Keine Person erkannt
Wenn das Programm läuft, aber keine Person erkannt wird, stellen Sie sicher, dass sich der gesamte Körper im Kamerabild befindet. Vermeiden Sie starkes Gegenlicht und verbessern Sie die Beleuchtung. Halten Sie einen Abstand von etwa 1–2 Metern zur Kamera ein, um optimale Ergebnisse zu erzielen.
Video ist langsam oder ruckelt
Wenn die Bildrate niedrig ist, reduzieren Sie die Auflösung auf 640×480 oder niedriger. Setzen Sie
model_complexity = 1für eine bessere Leistung. Deaktivieren Sie die Segmentierung, wenn sie nicht benötigt wird, und schließen Sie andere Hintergrundprogramme, um Systemressourcen freizugeben.Segmentation Fault tritt auf
Die meisten Segmentation Faults werden durch eine Nichtübereinstimmung zwischen der Systemarchitektur und dem installierten MediaPipe-Wheel verursacht.
Überprüfen Sie Ihre Systemarchitektur:
uname -mDie Ausgabe sollte
aarch64sein.Wenn
armv7loderarmhfangezeigt wird, verwenden Sie ein 32-Bit-Raspberry-Pi-OS, das nicht mit dem offiziellen MediaPipe-Wheel kompatibel ist.Sie können dies auch in Python überprüfen:
import platform print(platform.machine())
Das Ergebnis muss ebenfalls
aarch64sein.aarch64 wird verwendet, aber trotzdem tritt ein Segmentation Fault auf
Dies kann passieren, wenn einige TensorFlow-Lite-XNNPACK-Kernel nicht vollständig mit Ihrer MediaPipe-Build kompatibel sind.
Mögliche Lösungen:
Verwenden Sie
model_complexity = 1(empfohlen in diesem Tutorial).Stellen Sie sicher, dass MediaPipe in der richtigen virtuellen Umgebung installiert ist.
Installieren Sie ein für Raspberry Pi optimiertes Wheel wie
mediapipe-bin(PINTO0309-Version).
model_complexity = 2stürzt ab, aber1funktioniertKomplexität 2 lädt ein größeres Modell, das möglicherweise erweiterte CPU-Optimierungen auslöst. Auf dem Raspberry Pi werden einige optimierte TensorFlow-Lite-Kernel möglicherweise nicht vollständig unterstützt. Komplexität 1 vermeidet diese Kernel und ist auf dem Raspberry Pi in der Regel stabiler und schneller.
9. Zusammenfassung
In diesem Kapitel wurde Echtzeit-Erkennung menschlicher Körperskelette auf Basis von MediaPipe Pose implementiert;
Pose liefert 33 Schlüsselpunkte, die in Bereichen wie Fitness, Haltungsanalyse und Aktionserkennung verwendet werden können;
Durch Anpassung von Auflösung und Modellkomplexität kann ein flüssiger Betrieb auf dem Raspberry Pi erreicht werden;
Auf Basis dieser Schlüsselpunkte können anschließend folgende Anwendungen entwickelt werden:
Aktionserkennung (z. B. „Hand heben“, „Kniebeugen“)
Haltungsbewertung (z. B. „Ist die Sitzhaltung korrekt?“)
Menschliche Interaktionssteuerung.