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')