diff --git a/code/Interface_Lounes/compteurDoigt.py b/code/Interface_Lounes/compteurDoigt.py new file mode 100644 index 0000000..c0fbc1f --- /dev/null +++ b/code/Interface_Lounes/compteurDoigt.py @@ -0,0 +1,98 @@ +import cv2 +import mediapipe as mp +mp_drawing = mp.solutions.drawing_utils +mp_drawing_styles = mp.solutions.drawing_styles +mp_hands = mp.solutions.hands + +def prodScalaire(V1,V2): + return (V1[0]*V2[0]+V1[1]*V2[1])/((V1[0]**2+V1[1]**2)**(1/2)*(V2[0]**2+V2[1]**2)**(1/2)) #produit scalaire normalisé + +# initialisation de la caméra +cap = cv2.VideoCapture(0) + +# initialisation de Mediapipe Hands +with mp_hands.Hands( static_image_mode=False, max_num_hands=2, min_detection_confidence=0.5, min_tracking_confidence=0.5) as hands: + + while cap.isOpened(): + + # lecture de la vidéo + ret, frame = cap.read() + + # conversion de l'image en RGB + image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + + # détection des mains + results = hands.process(image) + + # Draw the hand annotations on the image. + image.flags.writeable = True + if results.multi_hand_landmarks: + for hand_landmarks in results.multi_hand_landmarks: + mp_drawing.draw_landmarks( + image, + hand_landmarks, + mp_hands.HAND_CONNECTIONS, + mp_drawing_styles.get_default_hand_landmarks_style(), + mp_drawing_styles.get_default_hand_connections_style()) + + # détection du nombre de doigts levés + hand_landmarks = [0, 0] + finger_count = 0 + if len(results.multi_hand_landmarks) >0 : + hand_landmarks[0] = results.multi_hand_landmarks[0] + V0= [hand_landmarks[0].landmark[2].x - hand_landmarks[0].landmark[0].x, hand_landmarks[0].landmark[2].y - hand_landmarks[0].landmark[0].y] + V1= [hand_landmarks[0].landmark[4].x - hand_landmarks[0].landmark[2].x, hand_landmarks[0].landmark[4].y - hand_landmarks[0].landmark[2].y] + if prodScalaire(V0,V1) > 0.905135675: + finger_count += 1 + V0= [hand_landmarks[0].landmark[8].x - hand_landmarks[0].landmark[6].x, hand_landmarks[0].landmark[8].y - hand_landmarks[0].landmark[6].y] + V1= [hand_landmarks[0].landmark[6].x - hand_landmarks[0].landmark[0].x, hand_landmarks[0].landmark[6].y - hand_landmarks[0].landmark[0].y] + if prodScalaire(V0,V1) > 0: + finger_count += 1 + V0= [hand_landmarks[0].landmark[12].x - hand_landmarks[0].landmark[10].x, hand_landmarks[0].landmark[12].y - hand_landmarks[0].landmark[10].y] + V1= [hand_landmarks[0].landmark[10].x - hand_landmarks[0].landmark[0].x, hand_landmarks[0].landmark[10].y - hand_landmarks[0].landmark[0].y] + if prodScalaire(V0,V1) > 0: + finger_count += 1 + V0= [hand_landmarks[0].landmark[20].x - hand_landmarks[0].landmark[18].x, hand_landmarks[0].landmark[20].y - hand_landmarks[0].landmark[18].y] + V1= [hand_landmarks[0].landmark[18].x - hand_landmarks[0].landmark[0].x, hand_landmarks[0].landmark[18].y - hand_landmarks[0].landmark[0].y] + if prodScalaire(V0,V1) > 0: + finger_count += 1 + V0= [hand_landmarks[0].landmark[16].x - hand_landmarks[0].landmark[14].x, hand_landmarks[0].landmark[16].y - hand_landmarks[0].landmark[14].y] + V1= [hand_landmarks[0].landmark[14].x - hand_landmarks[0].landmark[0].x, hand_landmarks[0].landmark[14].y - hand_landmarks[0].landmark[0].y] + if prodScalaire(V0,V1) > 0: + finger_count += 1 + + if len(results.multi_hand_landmarks) >1 : + hand_landmarks[1] = results.multi_hand_landmarks[1] + V0= [hand_landmarks[1].landmark[2].x - hand_landmarks[1].landmark[0].x, hand_landmarks[1].landmark[2].y - hand_landmarks[1].landmark[0].y] + V1= [hand_landmarks[1].landmark[4].x - hand_landmarks[1].landmark[2].x, hand_landmarks[1].landmark[4].y - hand_landmarks[1].landmark[2].y] + if prodScalaire(V0,V1) > 0.905135675: + finger_count += 1 + V0= [hand_landmarks[1].landmark[8].x - hand_landmarks[1].landmark[6].x, hand_landmarks[1].landmark[8].y - hand_landmarks[1].landmark[6].y] + V1= [hand_landmarks[1].landmark[6].x - hand_landmarks[1].landmark[0].x, hand_landmarks[1].landmark[6].y - hand_landmarks[1].landmark[0].y] + if prodScalaire(V0,V1) > 0: + finger_count += 1 + V0= [hand_landmarks[1].landmark[12].x - hand_landmarks[1].landmark[10].x, hand_landmarks[1].landmark[12].y - hand_landmarks[1].landmark[10].y] + V1= [hand_landmarks[1].landmark[10].x - hand_landmarks[1].landmark[0].x, hand_landmarks[1].landmark[10].y - hand_landmarks[1].landmark[0].y] + if prodScalaire(V0,V1) > 0: + finger_count += 1 + V0= [hand_landmarks[1].landmark[20].x - hand_landmarks[1].landmark[18].x, hand_landmarks[1].landmark[20].y - hand_landmarks[1].landmark[18].y] + V1= [hand_landmarks[1].landmark[18].x - hand_landmarks[1].landmark[0].x, hand_landmarks[1].landmark[18].y - hand_landmarks[1].landmark[0].y] + if prodScalaire(V0,V1) > 0: + finger_count += 1 + V0= [hand_landmarks[1].landmark[16].x - hand_landmarks[1].landmark[14].x, hand_landmarks[1].landmark[16].y - hand_landmarks[1].landmark[14].y] + V1= [hand_landmarks[1].landmark[14].x - hand_landmarks[1].landmark[0].x, hand_landmarks[1].landmark[14].y - hand_landmarks[1].landmark[0].y] + if prodScalaire(V0,V1) > 0: + finger_count += 1 + + # affichage du nombre de doigts levés + cv2.putText(image, f"Finger count: {finger_count}", (10, 50), + cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) + + # affichage de la vidéo + cv2.imshow('Video', cv2.cvtColor(image, cv2.COLOR_RGB2BGR)) + if cv2.waitKey(10) & 0xFF == ord('q'): + break + +# libération de la caméra et des ressources +cap.release() +cv2.destroyAllWindows() \ No newline at end of file