-
Notifications
You must be signed in to change notification settings - Fork 1
/
SeguimientoManos.py
88 lines (71 loc) · 2.95 KB
/
SeguimientoManos.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import math
import cv2
import mediapipe as mp
import time
class detectormanos():
label = ""
def __init__(self,mode=False,maxManos=2,model_complexity=1, Confdeteccion=0.5, Confsegui=0.5):
self.mode=mode
self.maxManos=maxManos
self.compl=model_complexity
self.Confdeteccion=Confdeteccion
self.Confsegui=Confsegui
self.mpmanos=mp.solutions.hands
self.manos=self.mpmanos.Hands(self.mode, self.maxManos, self.compl, self.Confdeteccion, self.Confsegui)
self.dibujo =mp.solutions.drawing_utils
self.tip=[4,8,12,16,20]
def encontrarmanos(self, frame, dibujar=True):
imgcolor=cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
self.resultados= self.manos.process(imgcolor)
if self.resultados.multi_hand_landmarks:
for mano in self.resultados.multi_hand_landmarks:
if dibujar:
self.dibujo.draw_landmarks(frame, mano, self.mpmanos.HAND_CONNECTIONS)
return frame
def encontrarposicion (self, frame, ManoNum=0, dibujarPuntos =True, dibujarBox=True, color=[] ):
xlista=[]
ylista=[]
bbox=[]
player=0
self.lista=[]
if self.resultados.multi_hand_landmarks:
miMano= self.resultados.multi_hand_landmarks[ManoNum]
prueba= self.resultados.multi_hand_landmarks
player= len(prueba)
for id, lm in enumerate (miMano.landmark):
alto,ancho,c = frame.shape
cx,cy = int(lm.x * ancho), int(lm.y * alto)
xlista.append(cx)
ylista.append(cy)
self.lista.append([id,cx,cy])
if dibujarPuntos:
cv2.circle(frame,(cx,cy),3,(0,0,0),cv2.FILLED)
xmin, xmax= min(xlista), max(xlista)
ymin, ymax= min(ylista), max(ylista)
bbox = xmin, ymin, xmax,ymax
if dibujarBox:
cv2.rectangle(frame,(xmin -20,ymin-20),(xmax +20 ,ymax +20),color,2)
return self.lista,bbox,player
def dedosarriba(self):
dedos=[]
if self.lista[self.tip[0]][1] > self.lista[self.tip[0]-1][1]:
dedos.append(1)
else:
dedos.append(0)
for id in range(1,5):
if self.lista[self.tip[id]][2] < self.lista[self.tip[id]-2][2]:
dedos.append(1)
else:
dedos.append(0)
return dedos
def distancia(self, p1, p2, frame, dibujar =True, r=15, t=3):
x1,y1 =self.lista[p1][1:]
x2,y2=self.lusta[p2][1:]
cx, cy =(x1+x2)//2,(y1 + y2)//2
if dibujar:
cv2.line(frame, (x1,y1),(x2,y2),(0,0,255),t)
cv2.circle(frame, (x1,y1),r,(0,0,255),cv2.FILLED)
cv2.circle(frame,(x2,y2),r,(0,0,255),cv2.FILLED)
cv2.circle(frame,(cx,cy),r,(0,0,255), cv2.FILLED)
length = math.hypot(x2-x1 , y2-y1)
return length,frame,[x1,y1,x2,y2,cx,cy]