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!

4. Handerkennung

1. Überblick

Im vorherigen Abschnitt haben wir mit MediaPipe Gesichtserkennung und Landmark-Tracking implementiert.

Dieser Abschnitt stellt MediaPipe Hands vor — ein leichtgewichtiges und stabiles Modul zur Echtzeit-Erkennung von Hand-Landmarks.

Mit diesem Modul können wir:

  • Bis zu zwei Hände gleichzeitig erkennen

  • 21 Landmark-Punkte pro Hand identifizieren

  • Hand-Skelettverbindungen in Echtzeit visualisieren

MediaPipe Hands

2. Funktionsweise

Das Programm führt die folgenden Schritte aus:

  1. Initialisierung des MediaPipe-Hands-Modells.

  2. Erfassung von Frames mit der Raspberry-Pi-Kamera.

  3. Konvertierung des Bildes in das RGB-Format (erforderlich für MediaPipe).

  4. Erkennung von Hand-Landmarks mit dem Hands-Modul.

  5. Zeichnen der 21 Landmark-Punkte und ihrer Verbindungslinien.

  6. Anzeige des annotierten Videostreams in Echtzeit.

Dieses Modul bildet die Grundlage für:

  • Gestenerkennung

  • Fingerzählen

  • Interaktive Steuerungssysteme

  • Berührungslose Mensch–Computer-Interaktion

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.

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

    sudo python3 ~/ai-lab-kit/mediapipe/mp_hand.py
    
  2. Nach dem Start des Programms öffnet sich ein Fenster mit dem Titel „Show Video“ und zeigt den Live-Kamerastream an.

    Wenn eine oder zwei Hände vor der Kamera erscheinen:

    • MediaPipe erkennt jede Hand in Echtzeit.

    • Auf jeder Hand werden 21 Landmark-Punkte identifiziert.

    • Die Landmark-Punkte werden durch Linien verbunden und bilden ein Hand-Skelett.

    Wenn zwei Hände sichtbar sind, werden beide Hände gleichzeitig verfolgt und annotiert.

    Wenn der Benutzer seine Hände oder Finger bewegt:

    • folgen die Landmark-Punkte der Bewegung flüssig.

    • aktualisiert sich das Hand-Skelett in Echtzeit.

    Wenn keine Hand 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

Der vollständige Beispielcode lautet wie folgt:

from picamera2 import Picamera2, Preview
import cv2
import mediapipe.python.solutions.hands as mp_hands
import mediapipe.python.solutions.drawing_utils as drawing
import mediapipe.python.solutions.drawing_styles as drawing_styles

# Initialize Hands model
hands = mp_hands.Hands(
    static_image_mode=False,    # Process real-time video frames
    max_num_hands=2,            # Maximum number of hands to detect
    min_detection_confidence=0.5
)

# Open camera
picam2 = Picamera2()
config = picam2.create_preview_configuration(
   main={"size": (640, 480), "format": "XRGB8888"} ,
)
picam2.configure(config)
# picam2.start_preview(Preview.QTGL) # Optional hardware preview
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
   frame_rgb = cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2RGB)

   # Detect hands
   hands_detected = hands.process(frame_rgb)

   # Convert RGB back to BGR for display
   frame = cv2.cvtColor(frame_rgb, cv2.COLOR_RGB2BGR)

   # If hands are detected, draw landmarks and connections
   if hands_detected.multi_hand_landmarks:
      for hand_landmarks in hands_detected.multi_hand_landmarks:
         drawing.draw_landmarks(
               frame,
               hand_landmarks,
               mp_hands.HAND_CONNECTIONS,
               drawing_styles.get_default_hand_landmarks_style(),
               drawing_styles.get_default_hand_connections_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 Codes sehen Sie im Kamerastream:

  • Wenn eine oder zwei Hände erkannt werden, werden angezeigt:

    • 21 Hand-Landmarks

    • Ein blaues Verbindungsskelett

  • Wenn sich die Hand bewegt, verfolgt die Erkennung die Bewegung in Echtzeit.

5. Beschreibung der MediaPipe-Hands-Landmarks

MediaPipe Hands liefert 21 Landmarks für jede Hand, darunter Positionen wie Handgelenk, Handfläche und Fingerspitzen.

Häufig verwendete Landmarks sind:

Index

Name

Position

0

WRIST

Handgelenk

4 / 8 / 12 / 16 / 20

THUMB_TIP / INDEX_FINGER_TIP / MIDDLE_FINGER_TIP / RING_FINGER_TIP / PINKY_TIP

Spitzen der jeweiligen Finger

5~17

Joints

Mittlere Gelenke der jeweiligen Finger

9

PALM_CENTER (ungefähr)

Bereich der Handfläche

MediaPipe Hands Landmarks Illustration

Bemerkung

Diese Koordinaten sind normalisierte Koordinaten und können anhand der Bildauflösung in tatsächliche Pixelpositionen umgerechnet werden. Sie können zur Berechnung von Winkeln und Abständen verwendet werden und ermöglichen dadurch Gestenerkennung.

6. Fehlerbehebung

  • Instabile Handerkennung

    Die Handerkennung kann instabil werden, wenn die Beleuchtung zu schwach ist, der Hintergrund unruhig ist oder sich die Hand zu schnell bewegt.

    Versuchen Sie, die Beleuchtung zu verbessern, einen einfachen Hintergrund zu verwenden und Ihre Hände langsamer und gleichmäßiger zu bewegen.

  • Keine Hand erkannt

    Wenn keine Hand erkannt wird, ist möglicherweise der Kamerawinkel ungeeignet, die Hand befindet sich zu weit von der Kamera entfernt oder die Auflösung ist zu niedrig.

    Passen Sie die Kameraposition an, bewegen Sie sich näher zur Kamera und stellen Sie sicher, dass die Auflösung mindestens 640×480 beträgt.

  • Hohe Latenz

    Wenn die Videoreaktion langsam wirkt, könnte der Raspberry Pi stark ausgelastet sein oder die Auflösung zu hoch eingestellt sein.

    Reduzieren Sie die Auflösung (z. B. 320×240) und schließen Sie unnötige Hintergrundprozesse.

7. Zusammenfassung

  • MediaPipe Hands ermöglicht eine stabile Echtzeit-Handerkennung auf dem Raspberry Pi.

  • Stellt 21 Landmarks pro Hand bereit, geeignet für:

    • Gestenerkennung

    • Virtuelle Steuerung

    • Interaktive UI-Steuerung

  • Anschließend werden wir benutzerdefinierte Gestenerkennung auf Basis dieser Landmarks implementieren.