import gradio as gr import cv2, os import mediapipe as mp mp_hands = mp.solutions.hands hands = mp_hands.Hands(max_num_hands=1) # ensure slides folder exists if not os.path.exists("slides"): os.makedirs("slides") slides = sorted([f"slides/{img}" for img in os.listdir("slides")]) index = 0 def detect(frame): global index, slides slides = sorted([f"slides/{img}" for img in os.listdir("slides")]) if not slides: import numpy as np blank = np.zeros((600,800,3),dtype=np.uint8) cv2.putText(blank, "Upload slide images in /slides", (50,300), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 2) return blank h,w,c = frame.shape frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) result = hands.process(frame_rgb) if result.multi_hand_landmarks: lm = result.multi_hand_landmarks[0] x = lm.landmark[mp_hands.HandLandmark.WRIST].x * w if x < w*0.3: index = max(0, index-1) elif x > w*0.7: index = min(len(slides)-1, index+1) slide = cv2.imread(slides[index]) slide = cv2.cvtColor(slide, cv2.COLOR_BGR2RGB) return slide demo = gr.Interface(fn=detect, inputs=gr.Image(source="webcam", streaming=True), outputs="image", live=True) demo.launch()