Håndsporing er prosessen med å bruke datasyn for å oppdage og følge bevegelsene til en persons hånd i sanntid. Den mest dominerende bruken av håndsporing er i virtual reality-headset. Headsettene lar deg bruke hendene som input i stedet for berøringskontrollere. Dette gjør igjen opplevelsen mer oppslukende.
Finn ut hvordan du sporer en persons hender ved å bruke Python, OpenCV for datasyn og MediaPipe.
Google utviklet MediaPipe-rammeverket, som inneholder mange maskinlæringsløsninger. En av løsningene er hånd- og fingersporingsløsningen som kalles MediaPipe-hender. For å spore hender, utfører MediaPipe Hands to prosesser: håndflatedeteksjon og landemerkedeteksjon.
Hand Palm Detection
MediaPipe begynner med å identifisere hvor håndflatene er i inndatabildet. Siden estimering av avgrensningsbokser for stive gjenstander er enklere enn å identifisere hender med leddfingre.
Deteksjon av hånd landemerker
Etter håndflatedeteksjon, utfører MediaPipe deteksjon av hånd landemerker. Hånd-landemerkemodellen kan forutsi 21 nøyaktige koordinater for plasseringen av hvert hånd-landemerke.
Tallene representerer en unik identifikator for hvert landemerke.
Sette opp miljøet ditt
For å følge med på dette prosjektet, bør du være kjent med grunnleggende om Python. Installer følgende biblioteker i miljøet ditt:
- OpenCV: Du vil bruke dette biblioteket for datasyn og for å utføre bildebehandlingsteknikker på inndatabildet.
- MediaPipe: Du vil bruke dette biblioteket til å utføre hånddeteksjon og sporing på inndatabildet.
- imutils: Du vil endre størrelsen på videorammen til inngangen i dette biblioteket.
Kjør følgende kommando på terminalen for å installere OpenCV-, MediaPipe- og imutils-bibliotekene. Installer pip – Python-pakkebehandleren– hvis du trenger det. Sørg for at du sender bibliotekene som en mellomromsdelt liste.
pip installer OpenCV-Python MediaPipe imutils
Når oppdateringen er fullført, er miljøet klart for deg å begynne å kode.
Den fullstendige kildekoden for dette prosjektet er tilgjengelig i sin GitHub-depot.
Importere de nødvendige bibliotekene
Du må importere bibliotekene du installerte slik at du kan bruke dem. Åpne hvilken som helst Python IDE, opprett en Python-fil og legg til følgende importer:
import cv2
import mediapipe som smp
import imutils
Pass på at du importerer OpenCV som cv2 og MediaPipe med små bokstaver. Unnlatelse av å gjøre det vil gi en feil.
Du vil bruke mpHands til å kalle opp MediaPipe-håndløsningen, og hendene objekter for å oppdage og spore håndinndata. Du vil bruke mpDraw-objektet til å tegne forbindelsene mellom landemerkene til de identifiserte hendene.
mpHands = mp.solutions.hends
hender = mpHender. hender()
mpDraw = mp.solutions.drawing_utils
Du kan finjustere MediaPipe hands-modellen ved å sende forskjellige parametere til Hands()-konstruktøren. Standardverdiene er gode nok for dette prosjektet, men du kan eksperimentere med dem for å se hvordan de påvirker modellen:
Du bør forlate statisk_bildemodus som False for å sikre at modellen oppdager hendene én gang før den begynner å spore dem. Den gjentar bare sporingsprosessen hvis deteksjonssikkerheten faller lavere enn den deklarerte parameteren, noe som gjør den generelle inndatabehandlingen raskere.
Utfører håndsporing
Du trenger tre funksjoner for å utføre håndsporing: én for å behandle inndata, én for å tegne landemerkeforbindelsene, og en hovedfunksjon for å kontrollere programflyten.
Inndatabehandlingsfunksjon
Denne funksjonen tar inngangen, konverterer den til gråtoner og sender den til MediaPipe-håndmodellen for å oppdage og spore hendene i inngangen.
# Behandler inndatabildet
defprosessbilde(img):
# Konvertering av input til gråtoner
grå_bilde = cv2.cvtColor (img, cv2.COLOR_BGR2RGB)
resultater = hands.process (grå_bilde)
# Tilbakeføring av oppdagede hender til ringefunksjon
komme tilbake resultater
Funksjonen returnerer resultatene på om det var noen oppdagede hender på inngangen.
Tegnefunksjonen for hånd landemerkeforbindelser
Denne funksjonen sjekker om inndatabehandlingsfunksjonen oppdaget noen hender. Hvis det oppdages noen hender, går den i løkke over hvert landemerke og tegner en sirkel rundt det, og holder styr på landemerket med Pythons oppregningsfunksjon. Den tegner deretter forbindelsene mellom landemerkene på den originale videoinngangen.
# Tegning av landemerkeforbindelser
deftegne_håndsforbindelser(img, resultater):
hvis results.multi_hand_landmarks:
til håndLms i results.multi_hand_landmarks:
til id, lm i enumerate (handLms.landmark):
h, w, c = img.form# Finne koordinatene til hvert landemerke
cx, cy = int (lm.x * w), int (lm.y * h)# Skriver ut hver landemerke-ID og koordinater
# på terminalen
print (id, cx, cy)# Lage en sirkel rundt hvert landemerke
cv2.circle (img, (cx, cy), 10, (0, 255, 0),
cv2.FILLED)
# Tegning av landemerkeforbindelsene
mpDraw.draw_landmarks (img, handLms,
mpHands. HAND_CONNECTIONS)
komme tilbake img
Funksjonen starter med å sirkle rundt hvert landemerke:
Den tegner deretter håndforbindelsene:
Den returnerer til slutt utdataene til den anropende funksjonen.
Hovedfunksjonen
Lag en hovedfunksjon som vil kontrollere flyten av programmet ditt. Det vil ta innspillet og endre størrelsen på videorammen for å sikre konsistensen til utgangen. Send inndataene til prosesseringsfunksjonen som deretter vil oppdage og spore hendene. Ta de returnerte resultatene til tegnefunksjonen for hånd landemerker, som vil tegne forbindelsen på den originale videoinngangen. Den vil til slutt vise utdataene til brukeren.
defhoved-():
# Erstatt 0 med videobanen for å bruke a
# forhåndsinnspilt video
cap = cv2.VideoCapture(0)samtidig somekte:
# Tar innspillene
suksess, bilde = cap.read()
image = imutils.resize (bilde, bredde=500, høyde=500)
resultater = prosessbilde (bilde)
draw_hand_connections (bilde, resultater)# Viser utdata
cv2.imshow("Håndsporing", bilde)
# Programmet avsluttes når q-tasten trykkes
hvis cv2.waitKey(1) == ord('q'):
cap.release()
cv2.destroyAllWindows()
Det siste trinnet er å kjøre programmet. Koden nedenfor sikrer at når du kjører programmet, kjører hovedfunksjonen først.
hvis __navn__ == "__hoved__":
hoved()
Når programmet kjører, produserer det utdata slik:
Programmet sporer hendene i sanntid.
Håndsporing for oppslukende virtuell virkelighet
Håndsporing i virtuell virkelighet gjør teknologien mer fristende. Virtual reality-headset har begynt å introdusere håndsporing, noe som gir en følelse av økt virkelighet til den virtuelle verdenen. Hodesettene lar brukeren legge inn kommandoer ved hjelp av en virtuell hånd.
Håndsporing i virtuelle hodesett er bare én anvendelse av denne teknologien. Du kan inkorporere håndsporing i et hvilket som helst område du liker.