| import cv2 |
| import numpy as np |
| import mediapipe as mp |
| from mediapipe.tasks import python |
| from mediapipe.tasks.python import vision |
| import os |
|
|
| class HandTracker: |
| def __init__(self, max_hands=1, detection_con=0.5, track_con=0.5, model_path=None): |
| if model_path is None: |
| base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) |
| model_path = os.path.join(base_dir, "models", "hand_landmarker.task") |
| |
| base_options = python.BaseOptions(model_asset_path=model_path) |
| options = vision.HandLandmarkerOptions( |
| base_options=base_options, |
| num_hands=max_hands, |
| min_hand_detection_confidence=detection_con, |
| min_hand_presence_confidence=track_con |
| ) |
| self.detector = vision.HandLandmarker.create_from_options(options) |
| self.results = None |
|
|
| def find_hands(self, img): |
| img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) |
| mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=img_rgb) |
| self.results = self.detector.detect(mp_image) |
| return self.results |
|
|
| def get_landmark_data(self): |
| if self.results and self.results.hand_landmarks: |
| my_hand = self.results.hand_landmarks[0] |
| lm_list = [] |
| for lm in my_hand: |
| lm_list.extend([lm.x, lm.y, lm.z]) |
| return lm_list |
| return None |
|
|
| def close(self): |
| self.detector.close() |
|
|