import csv import time from datetime import datetime from ultralytics import YOLO import cv2 import mediapipe as mp import numpy as np model = YOLO('best_5.pt') cap = cv2.VideoCapture(0) mp_hands = mp.solutions.hands mp_drawing = mp.solutions.drawing_utils mp_drawing_styles = mp.solutions.drawing_styles hands = mp_hands.Hands(static_image_mode=True, min_detection_confidence=0.3) labels_dict = {0: 'A', 1: 'B', 2: 'C', 3: 'H'} # File to save gesture data csv_file = 'gesture_data.csv' # Initialize variables for tracking gestures previous_gesture = None gesture_start_time = None # List to store gesture data for CSV gesture_data_list = [] while True: data_aux = [] x_ = [] y_ = [] ret, frame = cap.read() if not ret: print("Failed to capture frame. Exiting...") break H, W, _ = frame.shape frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) results = hands.process(frame_rgb) if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: mp_drawing.draw_landmarks( frame, hand_landmarks, mp_hands.HAND_CONNECTIONS, mp_drawing_styles.get_default_hand_landmarks_style(), mp_drawing_styles.get_default_hand_connections_style()) for hand_landmarks in results.multi_hand_landmarks: for i in range(len(hand_landmarks.landmark)): x = hand_landmarks.landmark[i].x y = hand_landmarks.landmark[i].y x_.append(x) y_.append(y) for i in range(len(hand_landmarks.landmark)): x = hand_landmarks.landmark[i].x y = hand_landmarks.landmark[i].y data_aux.append(x - min(x_)) data_aux.append(y - min(y_)) x1 = int(min(x_) * W) - 10 y1 = int(min(y_) * H) - 10 x2 = int(max(x_) * W) + 10 y2 = int(max(y_) * H) + 10 prediction = model.predict(frame, conf=0.25, iou=0.45) names_dict = prediction[0].names probs = prediction[0].probs.data.numpy() detected_gesture = names_dict[np.argmax(probs)] print("Gesture:", detected_gesture) if detected_gesture == 'A': language = 'Arabic' elif detected_gesture == 'B': language = 'Bengali' elif detected_gesture == 'C': language = 'Chinese' elif detected_gesture == 'H': language = 'Hindi' # Get the current timestamp current_time = time.time() # Check if the detected gesture has changed if detected_gesture != previous_gesture: # If the detected gesture has changed, calculate the duration of the previous gesture if previous_gesture is not None: gesture_end_time = current_time gesture_duration = gesture_end_time - gesture_start_time # Store the detected gesture, start time, end time, and duration in the list gesture_data_list.append([previous_gesture, datetime.fromtimestamp(gesture_start_time).strftime('%H:%M:%S.%f'), datetime.fromtimestamp(gesture_end_time).strftime('%H:%M:%S.%f'), round(gesture_duration, 2)]) # Update the previous gesture and its start time previous_gesture = detected_gesture gesture_start_time = current_time # Calculate the duration of the current gesture gesture_duration = current_time - gesture_start_time # Draw rectangle around the detected gesture cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 0), 4) cv2.putText(frame, detected_gesture, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 1.3, (0, 255, 0), 3, cv2.LINE_AA) # Display the frame cv2.imshow('frame', frame) # Check if 'q' key is pressed to stop the program if cv2.waitKey(1) & 0xFF == ord('q'): # Save data to CSV file with open(csv_file, 'w', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow(['Gesture', 'Start Time', 'End Time', 'Duration']) for gesture, start_time, end_time, duration in gesture_data_list: writer.writerow([gesture, start_time, end_time, duration]) break # Release resources cap.release() cv2.destroyAllWindows()