Sistema de monitoramento manual usando OpenCV

Conteúdo

Este artigo foi publicado como parte do Data Science Blogathon

OpenCV é uma biblioteca usada para aplicativos de visão computacional. Com a ajuda do OpenCV, podemos criar um grande número de aplicativos que funcionam melhor em tempo real. É usado principalmente para processamento de imagem e vídeo.

Você pode obter mais informações sobre o OpenCV aqui (https://opencv.org/)

Junto com OpenCV, vamos usar a biblioteca MediaPipe.

MediaPipe

MediaPipe é uma estrutura que é usada principalmente para criar áudio, vídeo ou quaisquer dados de série temporal. Com a ajuda do framework MediaPipe, podemos construir canais muito impressionantes para diferentes funções de processamento de mídia.

Algumas das principais aplicações do MediaPipe.

  • Rastreamento multi-mão
  • Detecção de rosto
  • Detecção e rastreamento de objetos
  • Objectron: detecção e rastreamento de objetos 3D
  • AutoFlip: pipeline de corte automático de vídeo, etc.

Modelo de hito de mano

Basicamente, MediaPipe usa um modelo de detecção de palma de disparo único e, Uma vez feito, realiza uma localização precisa do ponto-chave de 21 Coordenadas 3D da palma na região detectada da mão.

O pipeline MediaPipe usa vários modelos, como um modelo de detecção de palma que retorna uma caixa delimitadora orientada à mão de toda a imagem. A região da imagem recortada é alimentada a um modelo de referência portátil definido pelo detector de palma e retorna os pontos-chave do portátil 3D de alta fidelidade.

Agora vamos implementar o modelo de rastreamento de mão.

Instale os módulos necessários

-> pip instalar opencv-python

-> pip instalar mediapipe

Primeiro, Vamos verificar o funcionamento da webcam.

import cv2
tempo de importação
cap = cv2.VideoCapture(0)
pTime = 0
enquanto verdadeiro:
    sucesso, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    cTime = time.time()
    fps = 1 / (cTime - pTime)
    pTime = cTime
    cv2.putText(img, f'FPS:{int(fps)}', (20, 70), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    cv2.imshow("Teste", img)
    cv2.waitKey(1))
1424745-5875185

O código acima irá mostrar um pop-up se houver uma webcam conectada ao seu PC e também mostra os quadros por segundo (fps) no canto superior esquerdo da janela de saída.

Agora vamos começar a implementação. Importe os módulos necessários e inicialize as variáveis ​​necessárias.

import cv2
importar mediapipe como mp
tempo de importação
cap = cv2.VideoCapture(0)

mpHands = mp.solutions.hands
mãos = mpHands.Hands(static_image_mode = False,
                      max_num_hands = 2,
                      min_detection_confidence = 0,5,
                      min_tracking_confidence = 0,5)
mpDraw = mp.solutions.drawing_utils

pTime = 0
cTime = 0

No trecho de código acima, declaramos um objeto chamado “mãos” a partir de mp.solutions.hand para detectar mãos, por padrão, se você olhar dentro da classe “Mãos()“, O número de mãos a detectar está definido para 2, a confiança mínima de detecção é definida como 0.5 e a confiança mínima de rastreamento é definida como 0.5. E vamos usar mpDraw para desenhar os pontos-chave.

Agora vamos escrever um loop while para executar nosso código.

enquanto verdadeiro:
    sucesso, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    resultados = hands.process(imgRGB)
    #imprimir(results.multi_hand_landmarks)
    if results.multi_hand_landmarks:
        para handLms em results.multi_hand_landmarks:
            para id, Estou em enumerar(handLms.landmark):
                #imprimir(Eu iria,lm)
                h, C, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                #if id == 0:
                cv2.circle(img, (cx,cy), 3, (255,0,255), cv2.FILLED)

            mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)

    cTime = time.time()
    fps = 1/(cTime-pTime)
    pTime = cTime

    cv2.putText(img,str(int(fps)), (10,70), cv2.FONT_HERSHEY_PLAIN, 3, (255,0,255), 3)

    cv2.imshow("Imagem", img)
    cv2.waitKey(1)

Aqui, no código acima, lemos os quadros da webcam e convertemos a imagem em RGB. Em seguida, detectamos as mãos na moldura com a ajuda de “hands.process () ” Função. Assim que as mãos forem detectadas, vamos localizar os pontos-chave e, em seguida, destacar os pontos nos pontos-chave usando cv2.circle, e conecte os pontos-chave usando mpDraw.draw_landmarks.

O código completo é fornecido abaixo

import cv2
importar mediapipe como mp
tempo de importação
cap = cv2.VideoCapture(0)

mpHands = mp.solutions.hands
mãos = mpHands.Hands(static_image_mode = False,
                      max_num_hands = 2,
                      min_detection_confidence = 0,5,
                      min_tracking_confidence = 0,5)
mpDraw = mp.solutions.drawing_utils

pTime = 0
cTime = 0

enquanto verdadeiro:
    sucesso, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    resultados = hands.process(imgRGB)
    #imprimir(results.multi_hand_landmarks)

    if results.multi_hand_landmarks:
        para handLms em results.multi_hand_landmarks:
            para id, Estou em enumerar(handLms.landmark):
                #imprimir(Eu iria,lm)
                h, C, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                #if id == 0:
                cv2.circle(img, (cx,cy), 3, (255,0,255), cv2.FILLED)

            mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)


    cTime = time.time()
    fps = 1/(cTime-pTime)
    pTime = cTime

    cv2.putText(img,str(int(fps)), (10,70), cv2.FONT_HERSHEY_PLAIN, 3, (255,0,255), 3)

    cv2.imshow("Imagem", img)
    cv2.waitKey(1)

A saída é:

6647846-4774798
Saída de modelo de rastreamento manual

Agora vamos criar um módulo de rastreamento de mão, para que possamos usá-lo em outros projetos.

Crie um novo arquivo Python. Primeiro, vamos criar uma classe chamada handDetector com duas funções de membro, chamadas findHands e findPosition.

A função findHands irá aceitar uma imagem RGB e detectar a mão na moldura e localizar os pontos chave e desenhar os pontos de referência, a função findPosition lhe dará a posição da mão junto com a identificação.

Mais tarde, a função principal onde inicializamos nosso módulo e também escrevemos um loop while para executar o modelo. Aqui você pode importar esta configuração ou o módulo para qualquer outro projeto relacionado.

O código completo é fornecido abaixo

import cv2
importar mediapipe como mp
tempo de importação
classe handDetector():
    def __init__(auto, mode = False, maxHands = 2, detecçãoCon = 0.5, trackCon = 0.5):
        self.mode = mode
        self.maxHands = maxHands
        self.detectionCon = detecçãoCon
        self.trackCon = trackCon

        self.mpHands = mp.solutions.hands
        self.hands = self.mpHands.Hands(self.mode, self.maxHands, self.detectionCon, self.trackCon)
        self.mpDraw = mp.solutions.drawing_utils
        
    def findHands(auto,img, desenhar = verdadeiro):
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        self.results = self.hands.process(imgRGB)
        # imprimir(results.multi_hand_landmarks)

        if self.results.multi_hand_landmarks:
            para handLms em self.results.multi_hand_landmarks:
                se desenhar:
                    self.mpDraw.draw_landmarks(img, handLms, self.mpHands.HAND_CONNECTIONS)
        return img

    def findPosition(auto, img, handNo = 0, desenhar = verdadeiro):

        lmlist = []
        if self.results.multi_hand_landmarks:
            myHand = self.results.multi_hand_landmarks[mão não]
            para id, Estou em enumerar(myHand.landmark):
                h, C, c = img.shape
                cx, cy = int(lm.x * C), int(lm.y * h)
                lmlist.append([Eu iria, cx, cy])
                se desenhar:
                    cv2.circle(img, (cx, cy), 3, (255, 0, 255), cv2.FILLED)
        return lmlist

def main():
    pTime = 0
    cTime = 0
    cap = cv2.VideoCapture(0)
    detector = handDetector()

    enquanto verdadeiro:
        sucesso, img = cap.read()
        img = detector.findHands(img)
        lmlist = detector.findPosition(img)
        se len(lmlist) != 0:
            imprimir(lmlist[4])

        cTime = time.time()
        fps = 1 / (cTime - pTime)
        pTime = cTime

        cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)

        cv2.imshow("Imagem", img)
        cv2.waitKey(1)


if __name__ == "__a Principal__":
    a Principal()

A saída será a mesma mostrada acima, juntamente com as posições das mãos rastreadas.

8826047-9873258

O código completo também está disponível aqui.

Referência:

https://www.youtube.com/watch?v=NZde8Xt78Iw

https://google.github.io/mediapipe/

Mim LinkedIn

Obrigado.

A mídia mostrada neste artigo não é propriedade da DataPeaker e é usada a critério do autor.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.