# #!/usr/bin/env python # # -*- coding: utf-8 -*- # #from pygame import mixer # import json # import pyaudio # import wave # import sys # import csv # import copy # import argparse # import itertools # import time # import winsound # from collections import Counter # from collections import deque # import cv2 as cv # import numpy as np # import mediapipe as mp # from utils import CvFpsCalc # from model import KeyPointClassifier # print("imported all the libraries") # from model import PointHistoryClassifier # import cv2 as cv # import numpy as np # import mediapipe as mp # from model import KeyPointClassifier # from utils import CvFpsCalc # # Load your KeyPointClassifier and other necessary modules here # mp_hands = mp.solutions.hands # hands = mp_hands.Hands( # static_image_mode=False, # max_num_hands=2, # min_detection_confidence=0.5, # min_tracking_confidence=0.5, # ) # keypoint_classifier = KeyPointClassifier() # cvFpsCalc = CvFpsCalc(buffer_len=10) # point_history = [] # keypoint_classifier_labels = { # 0: "Fist", # 1: "One", # 2: "Two", # 3: "Three", # 4: "Four", # 5: "Five", # 6: "Rock", # 7: "Spock", # 8: "Live long and prosper" # } # def calc_bounding_rect(frame, landmarks): # # Calculate bounding box # brect = cv.boundingRect(np.array([landmark for landmark in landmarks])) # cv.rectangle(frame, (brect[0], brect[1]), (brect[0] + brect[2], brect[1] + brect[3]), (0, 255, 0), 2) # return brect # def calc_landmark_list(frame, landmarks): # # Calculate landmark list # landmark_list = [] # for i, landmark in enumerate(landmarks.landmark): # x = int(landmark.x * frame.shape[1]) # y = int(landmark.y * frame.shape[0]) # landmark_list.append([x, y]) # cv.circle(frame, (x, y), 3, (0, 0, 255), thickness=5) # return landmark_list # def pre_process_landmark(landmark_list): # # Convert to relative coordinates / normalized coordinates # pre_processed_landmark_list = [] # base_x, base_y = landmark_list[0] # for landmark in landmark_list[1:]: # pre_processed_landmark_list.append([(landmark[0] - base_x), (landmark[1] - base_y)]) # return pre_processed_landmark_list # def draw_bounding_rect(use_brect, frame, brect): # # Draw bounding box # if use_brect: # cv.rectangle(frame, (brect[0], brect[1]), (brect[0] + brect[2], brect[1] + brect[3]), (255, 0, 0), 2) # return frame # def draw_landmarks(frame, landmark_list): # # Draw landmarks # for landmark in landmark_list: # cv.circle(frame, (landmark[0], landmark[1]), 5, (0, 255, 0), thickness=-1) # return frame # def draw_info_text(frame, brect, handedness, hand_sign): # # Draw information text # info_text = f"Handedness: {handedness.classification[0].label}" # cv.putText(frame, info_text, (brect[0], brect[1] - 10), cv.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 1, cv.LINE_AA) # cv.putText(frame, hand_sign, (brect[0], brect[1] - 30), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1, cv.LINE_AA) # return frame # def draw_point(frame, point): # # Draw point # cv.circle(frame, (point[0], point[1]), 5, (0, 255, 0), thickness=-1) # return frame # def draw_line(frame, point1, point2): # # Draw line # cv.line(frame, (point1[0], point1[1]), (point2[0], point2[1]), (0, 0, 255), thickness=3) # return frame # def draw_info(frame, fps, mode_text, keypoint_classifier_labels): # # Draw additional information # inf = [ # ("Mode", mode_text), # ("FPS", f"{fps:.2f}"), # ] # for i, (key, value) in enumerate(inf): # y = 20 + i * 20 # x = 20 # cv.putText(frame, f"{key}: {value}", (x, y), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1, cv.LINE_AA) # y = 50 # for i, (key, value) in enumerate(keypoint_classifier_labels.items()): # y = 80 + i * 20 # x = 20 # cv.putText(frame, f"{key}: {value}", (x, y), cv.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1, cv.LINE_AA) # return frame # def HAND(frame): # global point_history # global keypoint_classifier # debug_image = frame # frame = cv.cvtColor(frame, cv.COLOR_BGR2RGB) # frame.flags.writeable = False # results = hands.process(frame) # frame.flags.writeable = True # if results.multi_hand_landmarks is not None: # for hand_landmarks, handedness in zip(results.multi_hand_landmarks, results.multi_handedness): # # Bounding box calculation # brect = calc_bounding_rect(debug_image, hand_landmarks) # # Landmark calculation # landmark_list = calc_landmark_list(debug_image, hand_landmarks) # # Conversion to relative coordinates / normalized coordinates # pre_processed_landmark_list = pre_process_landmark(landmark_list) # # Hand sign classification # hand_sign_id = keypoint_classifier(pre_processed_landmark_list) # if hand_sign_id == "Not applicable": # point_history.append(landmark_list[8]) # else: # point_history.append([0, 0]) # debug_image = draw_bounding_rect(use_brect, debug_image, brect) # debug_image = draw_landmarks(debug_image, landmark_list) # debug_image = draw_info_text(debug_image, brect, handedness, keypoint_classifier_labels[hand_sign_id]) # else: # point_history.append([0, 0]) # for i, point in enumerate(point_history): # if point[0] == 0 and point[1] == 0: # continue # debug_image = draw_point(debug_image, point) # if i != 0 and point_history[i - 1][0] != 0 and point_history[i - 1][1] != 0: # debug_image = draw_line(debug_image, point_history[i - 1], point) # mode_text = "Mode: Normal" # debug_image = draw_info(debug_image, 0.0, mode_text, keypoint_classifier_labels) # return debug_image