import gradio as gr from matplotlib.pyplot import draw import mediapipe as mp import numpy as np import tempfile import mediapy as media mp_hands = mp.solutions.hands mp_hands_connections = mp.solutions.hands_connections hands = mp_hands.Hands() mp_draw = mp.solutions.drawing_utils connections = { 'HAND_CONNECTIONS': mp_hands_connections.HAND_CONNECTIONS, 'HAND_PALM_CONNECTIONS': mp_hands_connections.HAND_PALM_CONNECTIONS, 'HAND_THUMB_CONNECTIONS': mp_hands_connections.HAND_THUMB_CONNECTIONS, 'HAND_INDEX_FINGER_CONNECTIONS': mp_hands_connections.HAND_INDEX_FINGER_CONNECTIONS, 'HAND_MIDDLE_FINGER_CONNECTIONS': mp_hands_connections.HAND_MIDDLE_FINGER_CONNECTIONS, 'HAND_RING_FINGER_CONNECTIONS': mp_hands_connections.HAND_RING_FINGER_CONNECTIONS, 'HAND_PINKY_FINGER_CONNECTIONS': mp_hands_connections.HAND_PINKY_FINGER_CONNECTIONS, } def process_hands(img, selected_connection, draw_background): results = hands.process(img) output_img = img if draw_background else np.zeros_like(img) if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: mp_draw.draw_landmarks(output_img, hand_landmarks, connections[selected_connection]) return output_img def process_video(video_path, selected_connection, draw_background): with tempfile.NamedTemporaryFile() as f: out_path = f"{f.name}.{video_path.split('.')[-1]}" with media.VideoReader(video_path) as r: with media.VideoWriter( out_path, shape=r.shape, fps=r.fps, bps=r.bps) as w: for image in r: w.add_image(process_hands(image, selected_connection, draw_background)) return out_path demo = gr.Blocks() with demo: gr.Markdown( """ # Hand & Finger Tracking This is a demo of hand and finger tracking using [Google's MediaPipe](https://google.github.io/mediapipe/solutions/hands.html). """) with gr.Column(): draw_background = gr.Checkbox(value=True, label="Draw background?") connection_keys = list(connections.keys()) selected_connection = gr.Dropdown( label="Select connections to draw", choices=connection_keys, value=connection_keys[0], ) with gr.Tabs(): with gr.TabItem(label="Record a video"): recorded_video = gr.Video(source="webcam", format="mp4") submit_recorded_video = gr.Button(value="Process Video") with gr.TabItem(label="Upload a video"): uploaded_video = gr.Video(format="mp4") submit_uploaded_video = gr.Button(value="Process Video") with gr.Column(): processed_video = gr.Video() gr.Markdown('visitor badge') submit_recorded_video.click(fn=process_video, inputs=[recorded_video, selected_connection, draw_background], outputs=[processed_video]) submit_uploaded_video.click(fn=process_video, inputs=[recorded_video, selected_connection, draw_background], outputs=[processed_video]) demo.launch()