-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHandTrackingModule.py
More file actions
139 lines (70 loc) · 3.49 KB
/
HandTrackingModule.py
File metadata and controls
139 lines (70 loc) · 3.49 KB
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import cv2
import mediapipe as mp
import time
class handDetector():
def __init__(self,mode=False,maxHands=2,detectionCon=0.5,trackCon=0.5): #these prameters are the basic ones
self.mode=mode
self.maxHands=maxHands
self.detectionCon=detectionCon
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
self.tipIds = [4,8,12,16,20] #for the last function
def findHands(self,img,draw=True): #draw is used as an flag
imageRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
self.results = self.hands.process(imageRGB)
if self.results.multi_hand_landmarks:
for handLms in self.results.multi_hand_landmarks:
if draw:
self.mpDraw.draw_landmarks(img,handLms,self.mpHands.HAND_CONNECTIONS)
return img #returning the image after drawing on it
def findPosition(self,img,handNo=0,draw=True):
self.lmList=[] #an object which will create the position calues
if self.results.multi_hand_landmarks:
myHand = self.results.multi_hand_landmarks[handNo] #to get the landmark for the particular landmark
for id,lm in enumerate(myHand.landmark):
h ,w ,c =img.shape
cx , cy = int(lm.x*w ),int(lm.y*h)
#print(id,cx,cy)
self.lmList.append([id,cx,cy])
if draw:
cv2.circle(img, (cx,cy), 10, (70,80,50), cv2.FILLED) #the landmarks are coloured according to this
return self.lmList #returning the positions of the landmark
def fingersUp(self):
#this method is added for the hand drawing project
#the functionality of this method was also used in the hand finger number project
######## also lmlist upr wale function mai define hua hai still we are able to use it in diffrent function ############
fingers = []
#for right hand thumb
if self.lmList[self.tipIds[0]][1] < self.lmList[self.tipIds[0]-1][1]:
fingers.append(1)
else:
fingers.append(0)
#for other fingers
for id in range(1,5):
if self.lmList[self.tipIds[id]][2] < self.lmList[self.tipIds[id]-2][2]:
fingers.append(1)
else:
fingers.append(0)
return fingers
def main():
pTime = 0
cTime = 0
cap = cv2.VideoCapture(0)
detector = handDetector() #making an object of our class
while True:
success , img = cap.read()
img = detector.findHands(img) #using a function of our class by passing in a parameter ,,,,, img is the processed image after drawing lines on it
lmList=detector.findPosition(img) #for getting position of the landmark
if len(lmList) != 0: #to see if it is not empty
print(lmList[8]) #for now it will print for landmark 8
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime =cTime
cv2.putText(img,str(int(fps)),(120,70),cv2.FONT_HERSHEY_COMPLEX,1,(255,0,255),2)
cv2.putText(img,"fps is: ",(10,70),cv2.FONT_ITALIC,1,(150,10,10),2)
cv2.imshow("Image",img)
cv2.waitKey(1)
if __name__ == '__main__':
main() # whatever will be in the main function will showcase what can this module do