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))
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 é:
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.
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.