Urmărirea mâinilor este procesul de utilizare a vederii computerizate pentru a detecta și urmări mișcările mâinii unei persoane în timp real. Cea mai dominantă aplicație a urmăririi mâinilor este în căștile de realitate virtuală. Căștile vă permit să vă folosiți mâinile ca intrare în locul controlerelor tactile. Acest lucru, la rândul său, face experiența mai captivantă.
Aflați cum să urmăriți mâinile unei persoane folosind Python, OpenCV pentru viziune computerizată și MediaPipe.
Google a dezvoltat cadrul MediaPipe, care conține multe soluții de învățare automată. Una dintre soluții este soluția de urmărire a mâinilor și a degetelor numită Mâinile MediaPipe. Pentru a urmări mâinile, MediaPipe Hands efectuează două procese: detectarea palmelor și detectarea reperelor.
Detectare palma mâinii
MediaPipe începe prin a identifica unde sunt palmele în imaginea de intrare. Deoarece estimarea casetelor de delimitare pentru obiecte rigide este mai simplă decât identificarea mâinilor cu degetele articulate.
Detectarea reperelor de mână
După detectarea palmelor, MediaPipe efectuează detectarea reperelor de mână. Modelul de reper de mână poate prezice 21 de coordonate precise ale locației fiecărui reper de mână.
Numerele reprezintă un identificator unic pentru fiecare reper.
Configurarea mediului
Pentru a urma acest proiect, ar trebui să fii familiarizat cu elementele de bază ale Python. Instalați următoarele biblioteci în mediul dvs.:
- OpenCV: Veți folosi această bibliotecă pentru viziunea computerizată și pentru a efectua tehnici de procesare a imaginii pe imaginea de intrare.
- MediaPipe: Veți folosi această bibliotecă pentru a efectua detectarea și urmărirea mâinii pe imaginea de intrare.
- imutils: Veți avea această bibliotecă pentru a redimensiona cadrul video al intrării.
Rulați următoarea comandă pe terminalul dvs. pentru a instala bibliotecile OpenCV, MediaPipe și imutils. Instalați pip - managerul de pachete Python-dacă ai nevoie să. Asigurați-vă că treceți bibliotecile ca o listă delimitată de spațiu.
pip install OpenCV-Python MediaPipe imutils
Când actualizarea este completă, mediul este pregătit pentru a începe codarea.
Codul sursă complet al acestui proiect este disponibil în documentul său Depozitul GitHub.
Importarea bibliotecilor necesare
Va trebui să importați bibliotecile pe care le-ați instalat pentru a le putea folosi. Deschide orice Python IDE, creați un fișier Python și adăugați următoarele importuri:
import cv2
import mediapipe la fel de mp
import imutils
Asigurați-vă că importați OpenCV ca cv2 și MediaPipe cu litere mici. Nerespectarea acestui lucru va genera o eroare.
Veți folosi mpHands pentru a apela soluția de mâini MediaPipe, iar obiectul mâini pentru a detecta și urmări introducerea mâinii. Veți folosi obiectul mpDraw pentru a desena conexiunile dintre reperele mâinilor identificate.
mpHands = mp.solutions.hands
mâini = mpHands. Mâinile()
mpDraw = mp.solutions.drawing_utils
Puteți regla fin modelul de mâini MediaPipe trecând diferiți parametri constructorului Hands(). Valorile implicite sunt suficient de bune pentru acest proiect, dar puteți experimenta cu ele pentru a vedea cum afectează modelul:
Ar trebui să părăsiți static_image_mode ca fals pentru a se asigura că modelul detectează mâinile o dată înainte de a începe să le urmărească. Acesta repetă procesul de urmărire doar dacă încrederea de detecție scade mai mică decât parametrul declarat, ceea ce face procesarea generală a intrării mai rapidă.
Efectuarea urmăririi mâinilor
Aveți nevoie de trei funcții pentru a efectua urmărirea mâinilor: una pentru a procesa intrarea, una pentru a desena conexiunile reperului manual și o funcție principală pentru a controla fluxul programului.
Funcția de procesare a intrărilor
Această funcție preia intrarea, o convertește în tonuri de gri și o transmite modelului de mâini MediaPipe pentru a detecta și urmări mâinile în intrare.
# Procesarea imaginii de intrare
defimagine_proces(img):
# Convertirea intrării în tonuri de gri
imagine_gri = cv2.cvtColor (img, cv2.COLOR_BGR2RGB)
rezultate = hands.process (imagine_gri)
# Revenirea mâinilor detectate la funcția de apelare
întoarcere rezultate
Funcția returnează rezultatele dacă au fost detectate mâini pe intrare.
Funcția de desenare a conexiunilor de reper manual
Această funcție verifică dacă funcția de procesare a intrării a detectat vreo mână. Dacă există mâini detectate, trece peste fiecare reper și desenează un cerc în jurul lui, ținând evidența reperului folosind Funcția de enumerare a lui Python. Apoi desenează conexiunile dintre reperele de pe intrarea video originală.
# Desenarea conexiunilor repere
defdraw_hand_connections(img, rezultate):
dacă results.multi_hand_landmarks:
pentru handLms în results.multi_hand_landmarks:
pentru id, lm în enumera (handLms.landmark):
h, w, c = img.forma# Găsirea coordonatelor fiecărui reper
cx, cy = int (lm.x * w), int (lm.y * h)# Imprimarea fiecărui ID de reper și coordonatele
# pe terminal
imprimare (id, cx, cy)# Crearea unui cerc în jurul fiecărui reper
cv2.cerc (img, (cx, cy), 10, (0, 255, 0),
cv2.FILLED)
# Desenarea conexiunilor repere
mpDraw.draw_landmarks (img, handLms,
mpHands. HAND_CONNECTIONS)
întoarcere img
Funcția începe prin încercuirea fiecărui reper:
Apoi desenează conexiunile de mână:
În cele din urmă, își întoarce rezultatul la funcția de apelare.
Funcția principală
Creați o funcție principală care va controla fluxul programului dvs. Va lua intrarea și va redimensiona cadrul video pentru a asigura consistența ieșirii. Treceți intrarea la funcția de procesare care va detecta și urmări mâinile. Duți rezultatele returnate la funcția de desenare a conexiunii reperelor de mână, care va atrage conexiunea pe intrarea video originală. În cele din urmă, va afișa rezultatul utilizatorului.
defprincipal():
# Înlocuiți 0 cu calea video pentru a utiliza a
# videoclip preînregistrat
capac = cv2.VideoCapture(0)in timp ceAdevărat:
# Preluarea intrării
succes, imagine = cap.read()
imagine = imutils.resize (imagine, width=500, inaltime=500)
rezultate = proces_imagine (imagine)
draw_hand_connections (imagine, rezultate)# Afișarea rezultatului
cv2.imshow(„Urmăritor de mână”, imagine)
# Programul se termină când este apăsată tasta q
dacă cv2.waitKey(1) == ord('q'):
cap.release()
cv2.destroyAllWindows()
Ultimul pas este rularea programului. Codul de mai jos asigură că atunci când rulați programul, funcția principală rulează prima.
dacă __nume__ == "__principal__":
principal()
Când programul rulează, acesta produce rezultate astfel:
Programul urmărește mâinile în timp real.
Urmărirea mâinilor pentru realitate virtuală imersivă
Urmărirea mâinilor în realitatea virtuală face tehnologia mai atrăgătoare. Căștile de realitate virtuală au început să introducă urmărirea mâinilor, aducând un sentiment de realitate sporită lumii virtuale. Căștile permit utilizatorului să introducă comenzi folosind o mână virtuală.
Urmărirea mâinilor în căștile virtuale este doar o aplicație a acestei tehnologii. Puteți încorpora urmărirea mâinilor în orice zonă aplicabilă pe placul dvs.