Système de surveillance manuel utilisant OpenCV

Contenu

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))
1424745-5875185

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:

6647846-4774798
Sortie du modèle de suivi manuel

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.

8826047-9873258

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.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.