Faire un système de tracking des mains (Hands Tracking) avec python et mediapipe
Table of contents
No headings in the article.
Qu'est-ce que mediapipe ? C’est une librairie de Google vous permettant de développer des systèmes de computer vision.
Le tracking d’une main avec mediapipe se fait en traquant des points localisé sur une main come sur la forme ci-dessous:
Premièrement vous devez installer la librairie mediapipe grâce à la commande suivante sous :
- Windows: pip install mediapipe
- Linux: pip install mediapipe
- Mac Os : you can use anaconda
mediapipe est une librairie développé par Google pour faire du Computer Vision avec python
Et après, on installe la libraire opencv qui nous permettra de pouvoir démarrer une vidéo stocké sur l’ordinateur (ou un support externe) ou/et de démarrer la webcam de la machine ou une webcame externe, ainsi que de pouvoir mettre des éléments sur la vidéo. La commande pour l’installer sous :
- Windows: pip install opencv
- Linux: $ sudo apt install python3-opencv
- Mac Os: pip3 install opencv-python
Pour débuter avec le code on commence par importer open cv et mediapipe
import cv2
import mediapipe as mp
Ensuite on récupère la vidéo soit de la machine comme suite :
cap = cv2.VideoCapture(r'chemin_du_fichier')
Ou de la webcam :
cap = cv2.VideoCapture(0)
Le nombre entre parenthèse représente le code de la webcam (0 est pour la première webcam détecté)
Maintenant qu'on a la vidéo, on va créer l’objet hands qui nous permettra de détecter la main droites et gauche sur la vidéo ainsi que de récupérer les différents coordonnées de ces derniers.
mpHands = mp.solutions.hands
On crée aussi l’objet drawing_utils que nous utiliserons pour pouvoir tracer des lignes représentant la forme de la main sur celles détectés sur chaque frame de la vidéo.
mpDraw = mp.solutions.drawing_utils
Une Frame est l’image composant la vidéo, car une vidéo n’est que la succession de plusieurs Frames qui passe l’une après l’autre, on peut comparer une Frame à une Image.
Ensuite nous créons l’objet Hands
Hands = mpHands.Hands()
Et pour finir on écrit le code qui tournera dans une boucle jusqu’à ce que l’utilisateur puisse appuyer sur la touche « D » du clavier.
while (True):
success, img = cap.read() #On lit une image (frame) de la vidéo
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #On convertie l’image qui est en BGR en RGB
result = Hands.process(imgRGB) #Détecte la mains et récupère ces coordonnés
if (result.multi_hand_landmarks): #Vérifie si le résultat ne pas nulle
#Traçage des lignes
for handLms in result.multi_hand_landmarks:
for id,lm in enumerate(handLms.landmark):
h, w, c = img.shape
cx, cy = int(lm.x*w), int(lm.y*h)
#Dessine un grand cercle
if (id == 0):
cv2.circle(img, (cx, cy), 25, (255, 0, 255), cv2.FILLED)
mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)
CurrentTime = time.time()
fps = 1/(CurrentTime - PreviousTime)
PreviousTime = CurrentTime
cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 2)
cv2.imshow("Frame", img)
if cv2.waitKey(20) & 0xFF==ord('d'):
break
cap.release()
cv2.destroyAllWindows()