mirror of
https://github.com/hastagAB/Awesome-Python-Scripts.git
synced 2025-03-21 04:59:47 +00:00
62 lines
2.2 KiB
Python
62 lines
2.2 KiB
Python
"""
|
|
This file uses mediapipe - a framework by google to detect the landmarks of hand (21)
|
|
in the image captured from webcam using openCV
|
|
The functionality wrapped as handDetector class containing methods drawHands() and getPositions()
|
|
drawHands() --> To draw land marks of detected hands
|
|
getPositions() --> To return the found landmarks as a list
|
|
"""
|
|
import cv2
|
|
import mediapipe as mp
|
|
import time
|
|
|
|
class handDetector():
|
|
def __init__(self, mode=False, maxHands=2, detectionCon=0.5, trackCon=0.5):
|
|
self.mode = mode
|
|
self.maxHands = maxHands
|
|
self.detectionCon = detectionCon
|
|
self.trackCon = trackCon
|
|
self.mpDraw = mp.solutions.drawing_utils
|
|
self.hands = mp.solutions.hands.Hands(static_image_mode=self.mode,max_num_hands= self.maxHands,min_detection_confidence=self.detectionCon,min_tracking_confidence= self.trackCon)
|
|
def drawHands(self, img, draw=True):
|
|
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
|
|
self.res = self.hands.process(imgRGB)
|
|
if self.res.multi_hand_landmarks:
|
|
for handLms in self.res.multi_hand_landmarks:
|
|
if draw:
|
|
self.mpDraw.draw_landmarks(img, handLms,mp.solutions.hands.HAND_CONNECTIONS)
|
|
return img
|
|
|
|
def getPositions(self, img, handId=0):
|
|
self.xList=[]
|
|
self.yList=[]
|
|
self.lmList = []
|
|
if self.res.multi_hand_landmarks:
|
|
decHand = self.res.multi_hand_landmarks[handId]
|
|
for index, lmark in enumerate(decHand.landmark):
|
|
h, w, c = img.shape
|
|
cx, cy = int(lmark.x * w), int(lmark.y * h)
|
|
self.xList.append(cx)
|
|
self.yList.append(cy)
|
|
self.lmList.append([index, cx, cy])
|
|
return self.lmList
|
|
|
|
def main():
|
|
prevTime = 0
|
|
currTime = 0
|
|
cap = cv2.VideoCapture(0)
|
|
detector = handDetector()
|
|
while True:
|
|
_, img = cap.read()
|
|
img = detector.drawHands(img)
|
|
lms= detector.getPositions(img)
|
|
print(lms)
|
|
currTime = time.time()
|
|
fps = 1 / (cTime - pTime)
|
|
prevTime = cTime
|
|
cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3,(51, 0, 255), 3)
|
|
cv2.imshow("Image", img)
|
|
cv2.waitKey(1)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|