Lezers zoals jij steunen MUO. Wanneer u een aankoop doet via links op onze site, kunnen we een aangesloten commissie verdienen. Lees verder.

Hand volgen is het proces waarbij computervisie wordt gebruikt om de bewegingen van iemands hand in realtime te detecteren en te volgen. De meest dominante toepassing van hand-tracking is in virtual reality-headsets. Met de headsets kunt u uw handen gebruiken als invoer in plaats van aanraakcontrollers. Dit maakt de ervaring op zijn beurt meeslepender.

Ontdek hoe je iemands handen kunt volgen met behulp van Python, OpenCV voor computervisie en MediaPipe.

Google heeft het MediaPipe-framework ontwikkeld, dat veel machine-learning-oplossingen bevat. Een van de oplossingen is de zogenaamde hand- en vingertracking-oplossing MediaPipe-handen. Om handen te volgen, voert MediaPipe Hands twee processen uit: handpalmdetectie en oriëntatiepuntdetectie.

Handpalmdetectie

MediaPipe begint met het identificeren van waar de handpalmen zich bevinden in het invoerbeeld. Aangezien het schatten van begrenzingskaders voor stijve objecten eenvoudiger is dan het identificeren van handen met beweegbare vingers.

instagram viewer

Detectie van handoriëntatiepunten

Na palmdetectie voert MediaPipe detectie van handoriëntatiepunten uit. Het handoriëntatiepuntmodel kan 21 precieze coördinaten voorspellen van de locatie van elk handoriëntatiepunt.

De nummers vertegenwoordigen een unieke identificatie voor elk oriëntatiepunt.

Uw omgeving instellen

Om dit project te volgen, moet u bekend zijn met de basisprincipes van Python. Installeer de volgende bibliotheken in uw omgeving:

  • OpenCV: u gebruikt deze bibliotheek voor computervisie en om beeldverwerkingstechnieken uit te voeren op het invoerbeeld.
  • MediaPipe: u gebruikt deze bibliotheek om handdetectie en tracking uit te voeren op het invoerbeeld.
  • imutils: U zult deze bibliotheek gebruiken om het formaat van het videoframe van de invoer te wijzigen.

Voer de volgende opdracht uit op uw terminal om de OpenCV-, MediaPipe- en imutils-bibliotheken te installeren. Installeer pip, de Python-pakketbeheerder-als je moet. Zorg ervoor dat u de bibliotheken doorgeeft als een door spaties gescheiden lijst.

pip installeer OpenCV-Python MediaPipe imutils

Wanneer de update is voltooid, is de omgeving klaar om te beginnen met coderen.

De volledige broncode voor dit project is beschikbaar in haar GitHub-opslagplaats.

De vereiste bibliotheken importeren

U moet de bibliotheken die u hebt geïnstalleerd importeren, zodat u ze kunt gebruiken. Elke openen Python-IDE, maak een Python-bestand en voeg de volgende import toe:

importeren cv2
importeren mediapijp als mp
importeren imutilaties

Zorg ervoor dat u OpenCV importeert als cv2 en MediaPipe in kleine letters. Als u dit niet doet, wordt er een fout gegenereerd.

U gebruikt mpHands om de MediaPipe hands-oplossing aan te roepen en het hands-object om de handinvoer te detecteren en te volgen. U gebruikt het mpDraw-object om de verbindingen tussen de oriëntatiepunten van de geïdentificeerde handen te tekenen.

mpHands = mp.solutions.hands
handen = mpHands. Handen()
mpDraw = mp.solutions.drawing_utils

U kunt het handenmodel van MediaPipe verfijnen door verschillende parameters door te geven aan de Hands()-constructor. De standaardwaarden zijn goed genoeg voor dit project, maar u kunt ermee experimenteren om te zien hoe ze het model beïnvloeden:

Je moet de statische_image_mode als False om ervoor te zorgen dat het model de wijzers één keer detecteert voordat het ze begint te volgen. Het herhaalt het volgproces alleen als het detectievertrouwen lager is dan de opgegeven parameter, waardoor de algehele invoerverwerking sneller wordt.

Handtracking uitvoeren

U hebt drie functies nodig om handtracking uit te voeren: één om de invoer te verwerken, één om de oriëntatiepuntverbindingen van de hand te tekenen en een hoofdfunctie om de programmastroom te regelen.

Invoerverwerkingsfunctie

Deze functie neemt de invoer, converteert deze naar grijstinten en geeft deze door aan het MediaPipe-handmodel om de handen in de invoer te detecteren en te volgen.

# Het invoerbeeld verwerken
defproces_afbeelding(img):
# De invoer converteren naar grijstinten
grijze afbeelding = cv2.cvtColor (img, cv2.COLOR_BGR2RGB)
resultaten = hands.proces (grijze_afbeelding)

# De gedetecteerde handen terugzetten naar de oproepfunctie
opbrengst resultaten

De functie retourneert de resultaten of er gedetecteerde handen op de invoer waren.

De tekenfunctie voor handoriëntatiepuntverbindingen

Deze functie controleert of de invoerverwerkingsfunctie handen heeft gedetecteerd. Als er gedetecteerde handen zijn, loopt het over elk oriëntatiepunt en tekent er een cirkel omheen, waarbij het oriëntatiepunt wordt bijgehouden met behulp van De opsommingsfunctie van Python. Het tekent vervolgens de verbindingen tussen de oriëntatiepunten op de originele video-invoer.

# Oriëntatiepuntverbindingen tekenen
defteken_hand_verbindingen(img, resultaten):
als resultaten.multi_hand_landmarks:
voor handLms in resultaten.multi_hand_landmarks:
voor idd, lm in opsommen (handLms.landmark):
h, b, c = img.vorm

# De coördinaten van elk oriëntatiepunt vinden
cx, cy = int (lm.x * w), int (lm.y * h)

# Elk oriëntatiepunt-ID en coördinaten afdrukken
# op de terminal
afdrukken (id, cx, cy)

# Een cirkel maken rond elk oriëntatiepunt
cv2.cirkel (img, (cx, cy), 10, (0, 255, 0),
cv2.GEVULD)
# Het tekenen van de oriëntatiepuntverbindingen
mpDraw.draw_landmarks (img, handLms,
mpHands. HAND_VERBINDINGEN)

opbrengst img

De functie begint met het omcirkelen van elk oriëntatiepunt:

Vervolgens worden de handverbindingen getekend:

Het retourneert uiteindelijk zijn uitvoer naar de aanroepende functie.

De hoofdfunctie

Maak een hoofdfunctie die de stroom van uw programma regelt. Het neemt de invoer en past het formaat van het videoframe aan om de consistentie van de uitvoer te garanderen. Geef de invoer door aan de verwerkingsfunctie die vervolgens de handen zal detecteren en volgen. Breng de geretourneerde resultaten naar de functie voor het tekenen van verbindingen met handoriëntatiepunten, die de verbinding op de originele video-ingang zal tekenen. Het zal uiteindelijk de uitvoer aan de gebruiker weergeven.

defvoornaamst():
# Vervang 0 door het videopad om a te gebruiken
# vooraf opgenomen video
cap = cv2.VideoCapture(0)

terwijlWAAR:
# De invoer nemen
succes, afbeelding = cap.read()
afbeelding = imutils.formaat wijzigen (afbeelding, breedte=500, hoogte=500)
resultaten = proces_afbeelding (afbeelding)
draw_hand_connections (afbeelding, resultaten)

# De uitvoer weergeven
cv2.imshow("Handtracker", afbeelding)

# Het programma wordt beëindigd wanneer de toets q wordt ingedrukt
als cv2.waitKey(1) == volgorde('Q'):
cap.release()
cv2.destroyAllWindows()

De laatste stap is het uitvoeren van uw programma. De onderstaande code zorgt ervoor dat wanneer u het programma uitvoert, de hoofdfunctie als eerste wordt uitgevoerd.

als __naam__ == "__voornaamst__":
voornaamst()

Wanneer het programma wordt uitgevoerd, produceert het de volgende uitvoer:

Het programma volgt de handen in realtime.

Hand volgen voor meeslepende virtual reality

Hand volgen in virtual reality maakt de technologie aantrekkelijker. Virtual reality-headsets zijn begonnen met het introduceren van handtracking, waardoor de virtuele wereld een gevoel van verhoogde realiteit krijgt. Met de headsets kan de gebruiker commando's invoeren met behulp van een virtuele hand.

Hand volgen in virtuele headsets is slechts één toepassing van deze technologie. U kunt handtracking opnemen in elk toepasselijk gebied van uw keuze.