File size: 3,853 Bytes
7a43526
6aef42d
7a43526
 
 
 
10edeb5
7a43526
 
 
 
 
 
 
 
 
 
 
 
 
6a749b1
 
7a43526
55173b7
7a43526
 
 
bacd351
7a43526
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
db59562
 
 
7a43526
a15dfc9
7a43526
 
 
 
 
 
 
 
 
 
 
 
499aa61
 
b92100b
7a43526
af4695c
b92100b
10edeb5
b92100b
10edeb5
7a43526
a15dfc9
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
import cv2
import mediapipe as mp
import numpy as np
import streamlit as st
from PIL import Image

st.title("Custom_Hand_Gesture_Recognition")

uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "png", "jpeg"])

if uploaded_file is not None:
        # Convert the uploaded file to a PIL Image
    img = Image.open(uploaded_file)
        
        # Convert the PIL Image to a numpy array
    img = np.array(img)
        
        # Convert the image from RGB to BGR (OpenCV uses BGR format)
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)

    img = cv2.resize(img,(256,256))

        # Display the image using OpenCV (cv2.imshow does not work in Streamlit)
    st.image(img, channels="BGR")
    mp_hands = mp.solutions.hands

# Now second step is to set the hands function which will hold the landmarks points
    hands = mp_hands.Hands(static_image_mode=True, max_num_hands=2, min_detection_confidence=0.1)
    
    # Last step is to set up the drawing function of hands landmarks on the image
    mp_drawing = mp.solutions.drawing_utils
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    results = hands.process(img)
    def calculate_angle(a,b,c):
        a = np.array(a) # First
        b = np.array(b) # Mid
        c = np.array(c) # End
    
        radians = np.arctan2(c[1]-b[1], c[0]-b[0]) - np.arctan2(a[1]-b[1], a[0]-b[0])
        angle = np.abs(radians*180.0/np.pi)
    
        if angle >180.0:
            angle = 360-angle
        return angle
    def distance(a, b, width, height):
        distance = np.sqrt(((b[0] - a[0]) * width) ** 2 + ((b[1] - a[1]) * height) ** 2)
        return distance
    if results.multi_hand_landmarks:
            # Render detections
      for i in results.multi_hand_landmarks:
        mp_drawing.draw_landmarks(img, i, mp_hands.HAND_CONNECTIONS,
                                    mp_drawing.DrawingSpec(color=(245,117,66), thickness=2, circle_radius=2),
                                    mp_drawing.DrawingSpec(color=(245,66,230), thickness=2, circle_radius=2))
        st.image(img)
                                     
      for hand_no, hand_landmarks in enumerate(results.multi_hand_landmarks):

          first = [hand_landmarks.landmark[mp_hands.HandLandmark(6).value].x,hand_landmarks.landmark[mp_hands.HandLandmark(6).value].y]
          mid = [(hand_landmarks.landmark[mp_hands.HandLandmark(5).value].x + hand_landmarks.landmark[mp_hands.HandLandmark(9).value].x)/2,(hand_landmarks.landmark[mp_hands.HandLandmark(5).value].y + hand_landmarks.landmark[mp_hands.HandLandmark(9).value].y)/2]
          last = [hand_landmarks.landmark[mp_hands.HandLandmark(10).value].x,hand_landmarks.landmark[mp_hands.HandLandmark(10).value].y]
    
          
          
          ring_top = [hand_landmarks.landmark[mp_hands.HandLandmark(16).value].x,hand_landmarks.landmark[mp_hands.HandLandmark(16).value].y]
          pinky_top = [hand_landmarks.landmark[mp_hands.HandLandmark(20).value].x,hand_landmarks.landmark[mp_hands.HandLandmark(20).value].y]
          thumb_top = [hand_landmarks.landmark[mp_hands.HandLandmark(4).value].x,hand_landmarks.landmark[mp_hands.HandLandmark(4).value].y]
          height,width,_ = img.shape
          thumb_ring_dist = distance(ring_top,thumb_top,width,height)
          thumb_pinky_dist = distance(pinky_top,thumb_top,width,height)
          st.write('Distance between thumb and ring finger is',thumb_ring_dist)
          st.write('Distance between thumb and pinky finger is',thumb_pinky_dist)
          if thumb_pinky_dist <= 25 and thumb_ring_dist <= 25:
            angle = calculate_angle(first,mid,last)
            st.write('angle is ',angle)
            if angle >= 50:
              st.write('The fingers are opened')
            elif angle < 50:
              st.write('The fingers are closed')
            else:
              st.write('error')