Spaces:
Runtime error
Runtime error
File size: 4,240 Bytes
43317b5 |
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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
import csv
import pickle
import time
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)
language = ''
labels_dict = {0: 'A', 1: 'B', 2: 'C', 3: 'H'}
# Dictionary to store the start time of each gesture
gesture_start_time = {gesture: None for gesture in labels_dict.values()}
previous_gesture = None
# File to save gesture data
csv_file = 'gesture_data.csv'
# Dictionary to store detected gestures and their durations
gesture_duration_dict = {}
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(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_duration = current_time - gesture_start_time[previous_gesture]
# Store the detected gesture and its duration in the dictionary
gesture_duration_dict[previous_gesture] = gesture_duration
# Update the previous gesture and its start time
previous_gesture = detected_gesture
gesture_start_time[detected_gesture] = current_time
# Calculate the duration of the current gesture
gesture_duration = current_time - gesture_start_time[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', 'Duration'])
for gesture, duration in gesture_duration_dict.items():
writer.writerow([gesture, duration])
break
# Release resources
cap.release()
cv2.destroyAllWindows()
|