Faire un système de tracking des mains (Hands Tracking) avec python et mediapipe

Faire un système de tracking des mains (Hands Tracking) avec python et mediapipe

·

3 min read

Table of contents

No heading

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:

image.png

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()