Cet article a été publié dans le cadre du Blogathon sur la science des données
OpenCV est une bibliothèque utilisée pour les applications de vision par ordinateur. Avec l'aide d'OpenCV, nous pouvons créer un grand nombre d'applications qui fonctionnent mieux en temps réel. Il est principalement utilisé pour le traitement d'images et de vidéos.
Vous pouvez obtenir plus d'informations sur OpenCV ici (https://opencv.org/)
Avec OpenCV, nous utiliserons la bibliothèque MediaPipe.
MediaPipe
MediaPipe est un framework qui est principalement utilisé pour créer de l'audio, vidéo ou toute donnée de série temporelle. Avec l'aide du framework MediaPipe, nous pouvons construire des pipelines très impressionnants pour différentes fonctions de traitement multimédia.
Certaines des principales applications de MediaPipe.
- Suivi multi-mains
- Détection facial
- Détection et suivi d'objets
- Objectron: détection et suivi d'objets 3D
- Retournement automatique: pipeline de rognage vidéo automatique, etc.
Modèle de hito de mano
Essentiellement, MediaPipe utilise un modèle de détection de paume à un coup et, une fois fait, effectue une localisation précise du point clé de 21 Coordonnées 3D de la paume dans la région de la main détectée.
Le pipeline MediaPipe utilise plusieurs modèles, en tant que modèle de détection de paume qui renvoie une boîte englobante orientée main à partir de l'image complète. La zone d'image recadrée est transmise à un modèle de référence portable défini par le détecteur de paume et renvoie des points clés 3D portables haute fidélité.
Implémentons maintenant le modèle de suivi des mains.
Installer les modules nécessaires
-> pip instalar opencv-python
-> pip installer mediapipe
Premier, Vérifions le fonctionnement de la webcam.
importer cv2 heure d'importation cap = cv2.Capture vidéo(0) pHeure = 0 tandis que vrai: Succès, img = cap.lire() imgRGB = cv2.cvtCouleur(img, cv2.COLOR_BGR2RGB) cHeure = heure.heure() fps = 1 / (cHeure - pTime) pHeure = cHeure cv2.putText(img, f'FPS:{entier(fps)}', (20, 70), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.imshow("Test", img)
cv2.waitKey(1))
Le code ci-dessus affichera une fenêtre contextuelle s'il y a une webcam connectée à votre PC et il affichera également les images par seconde (fps) dans le coin supérieur gauche de la fenêtre de sortie.
Commençons maintenant la mise en œuvre. Importez les modules requis et initialisez les variables requises.
importer cv2 importer mediapipe en tant que mp heure d'importation
cap = cv2.Capture vidéo(0) mpHands = mp.solutions.hands mains = mpHands.Hands(static_image_mode=Faux, max_num_hands=2, min_detection_confidence=0.5, min_tracking_confidence=0.5) mpDraw = mp.solutions.drawing_utils pHeure = 0 cHeure = 0
Dans l'extrait de code ci-dessus, nous déclarons un objet appelé “mains” de mp.solutions.hand détecter les mains, par défaut, si tu regardes dans la classe “Mains()", Le nombre d'aiguilles à détecter est réglé sur 2, la confiance de détection minimale est définie sur 0.5 et la confiance de suivi minimale est définie sur 0.5. Et nous utiliserons mpDraw pour dessiner les points clés.
Écrivons maintenant une boucle while pour exécuter notre code.
tandis que vrai: Succès, img = cap.lire() imgRGB = cv2.cvtCouleur(img, cv2.COLOR_BGR2RGB) résultats = mains.processus(imgRVB) #imprimer(résultats.multi_hand_landmarks) si résultats.multi_hand_landmarks: pour handLms dans results.multi_hand_landmarks: pour identifiant, lm dans énumérer(handLms.landmark): #imprimer(identifiant,lm) h, w, c = img.forme cx, cy = entier(lm.x *w), entier(lm.a*h) #si identifiant ==0: cv2.cercle(img, (cx,cy), 3, (255,0,255), cv2.REMPLI) mpDraw.draw_landmarks(img, mainLms, mpHands.HAND_CONNECTIONS) cHeure = heure.heure() fps = 1/(cHeure-pHeure) pHeure = cHeure cv2.putText(img,str(entier(fps)), (10,70), cv2.FONT_HERSHEY_PLAIN, 3, (255,0,255), 3) cv2.imshow("Image", img) cv2.waitKey(1)
Ici, dans le code ci-dessus, nous lisons les images de la webcam et convertissons l'image en RVB. Ensuite, nous détectons les mains dans le cadre à l'aide de “mains.processus () " une fonction. Une fois les mains détectées, nous allons localiser les points clés puis mettre en évidence les points aux points clés en utilisant cv2.cercle, et reliez les points clés à l'aide mpDraw.draw_landmarks.
Le code complet est donné ci-dessous
importer cv2 importer mediapipe en tant que mp heure d'importation
cap = cv2.Capture vidéo(0) mpHands = mp.solutions.hands mains = mpHands.Hands(static_image_mode=Faux, max_num_hands=2, min_detection_confidence=0.5, min_tracking_confidence=0.5) mpDraw = mp.solutions.drawing_utils pHeure = 0 cHeure = 0 tandis que vrai: Succès, img = cap.lire() imgRGB = cv2.cvtCouleur(img, cv2.COLOR_BGR2RGB) résultats = mains.processus(imgRVB) #imprimer(résultats.multi_hand_landmarks) si résultats.multi_hand_landmarks: pour handLms dans results.multi_hand_landmarks: pour identifiant, lm dans énumérer(handLms.landmark): #imprimer(identifiant,lm) h, w, c = img.forme cx, cy = entier(lm.x *w), entier(lm.a*h) #si identifiant ==0: cv2.cercle(img, (cx,cy), 3, (255,0,255), cv2.REMPLI) mpDraw.draw_landmarks(img, mainLms, mpHands.HAND_CONNECTIONS) cHeure = heure.heure() fps = 1/(cHeure-pHeure) pHeure = cHeure cv2.putText(img,str(entier(fps)), (10,70), cv2.FONT_HERSHEY_PLAIN, 3, (255,0,255), 3) cv2.imshow("Image", img) cv2.waitKey(1)
La sortie est:
Créons maintenant un module de suivi des mains, afin que nous puissions l'utiliser dans d'autres projets.
Créer un nouveau fichier Python. Premier, créons une classe appelée détecteur de main avec deux fonctions membres dessus, appels trouverMains Oui trouverPosition.
La fonction trouverMains acceptera une image RVB et détectera la main dans le cadre et localisera les points clés et dessinera les points de référence, la fonction trouverPosition vous donnera la position de la main ainsi que l'identification.
Alors, la fonction principale où nous initialisons notre module et écrivons également une boucle while pour exécuter le modèle. Ici, vous pouvez importer cette configuration ou le module dans tout autre projet connexe.
Le code complet est donné ci-dessous
importer cv2 importer mediapipe en tant que mp heure d'importation
Détecteur de main de classe(): def __init__(soi, mode = Faux, maxHands = 2, détectionCon = 0.5, trackCon = 0.5): self.mode = mode self.maxHands = maxHands self.detectionCon = détectionCon self.trackCon = trackCon self.mpHands = mp.solutions.hands self.hands = self.mpHands.Hands(auto.mode, self.maxHands, self.detectionCon, self.trackCon) self.mpDraw = mp.solutions.drawing_utils def findHands(soi,img, dessiner = vrai): imgRGB = cv2.cvtCouleur(img, cv2.COLOR_BGR2RGB) self.results = self.hands.process(imgRVB) # imprimer(résultats.multi_hand_landmarks) si self.results.multi_hand_landmarks: pour handLms dans self.results.multi_hand_landmarks: si dessiner: self.mpDraw.draw_landmarks(img, mainLms, self.mpHands.HAND_CONNECTIONS) retour img def findPosition(soi, img, mainNon = 0, dessiner = vrai): lmlist = [] si self.results.multi_hand_landmarks: myHand = self.results.multi_hand_landmarks[mainNon] pour identifiant, lm dans énumérer(myHand.landmark): h, w, c = img.forme cx, cy = entier(lm.x * w), entier(lm.y * h) lmlist.append([identifiant, cx, cy]) si dessiner: cv2.cercle(img, (cx, cy), 3, (255, 0, 255), cv2.REMPLI) retour lmlist def principal(): pHeure = 0 cHeure = 0 cap = cv2.Capture vidéo(0) détecteur = handDetector() tandis que vrai: Succès, img = cap.lire() img = detecteur.findHands(img) lmlist = detecteur.findPosition(img) si len(lmlist) != 0: imprimer(lmlist[4]) cHeure = heure.heure() fps = 1 / (cHeure - pTime) pHeure = cHeure cv2.putText(img, str(entier(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3) cv2.imshow("Image", img) cv2.waitKey(1) si __nom__ == "__principale__": principale()
La sortie sera la même que celle illustrée ci-dessus avec les positions des mains suivies.
Le code complet est également disponible ici.
Référence:
https://www.youtube.com/watch?v=NZde8Xt78Iw
https://google.github.io/mediapipe/
Moi LinkedIn
Merci.
Les médias présentés dans cet article ne sont pas la propriété de DataPeaker et sont utilisés à la discrétion de l'auteur.
En rapport
Articles Similaires:
- Détecter les anomalies de séries temporelles à l'aide du package Anomalize dans R
- Mathématiques en science des données | Concepts mathématiques à connaître
- Architectures avancées | Architectures d'apprentissage en profondeur
- Distributions de probabilités discrètes | Types de distributions de probabilité