Spaces:
Sleeping
Sleeping
| # utils.py | |
| import numpy as np | |
| import cv2 | |
| # Removed: import random, string, generate_gibberish | |
| # Function to calculate Eye Aspect Ratio (EAR) | |
| def calculate_ear(eye_landmarks, frame_shape): | |
| """ | |
| Calculates the Eye Aspect Ratio (EAR) for a given eye. | |
| Args: | |
| eye_landmarks: A list of 6 MediaPipe landmark objects for the eye. | |
| Expected order: [p1, p2, p3, p4, p5, p6] | |
| where p1, p4 are horizontal extremes, and p2, p3, p5, p6 | |
| are vertical extremes. | |
| frame_shape: Tuple (height, width) of the frame. | |
| Returns: | |
| The calculated EAR value. | |
| """ | |
| if len(eye_landmarks) != 6: | |
| # print("Warning: Expected 6 eye landmarks, but received", len(eye_landmarks)) # Optional warning | |
| return 0.0 # Return 0 or handle error appropriately | |
| # Convert MediaPipe landmarks to numpy array (pixel coordinates) | |
| coords = np.array([(landmark.x * frame_shape[1], landmark.y * frame_shape[0]) | |
| for landmark in eye_landmarks]) | |
| # Calculate the Euclidean distances between the two sets of vertical eye landmarks | |
| # p2-p6 and p3-p5 | |
| vertical_dist1 = np.linalg.norm(coords[1] - coords[5]) | |
| vertical_dist2 = np.linalg.norm(coords[2] - coords[4]) | |
| # Calculate the Euclidean distance between the horizontal eye landmark | |
| # p1-p4 | |
| horizontal_dist = np.linalg.norm(coords[0] - coords[3]) | |
| # Calculate the EAR | |
| # Avoid division by zero | |
| if horizontal_dist == 0: | |
| return 0.0 | |
| ear = (vertical_dist1 + vertical_dist2) / (2.0 * horizontal_dist) | |
| return ear | |
| def draw_landmarks(image, landmarks, connections=None, point_color=(0, 255, 0), connection_color=(255, 255, 255)): | |
| """ | |
| Draws landmarks and connections on the image. | |
| Args: | |
| image: The image (numpy array) to draw on. | |
| landmarks: A list of MediaPipe landmark objects. | |
| connections: A list of tuples representing landmark connections (e.g., [(0, 1), (1, 2)]). | |
| point_color: Color for the landmarks (BGR tuple). | |
| connection_color: Color for the connections (BGR tuple). | |
| """ | |
| if not landmarks: | |
| return image | |
| img_h, img_w, _ = image.shape | |
| landmark_points = [(int(l.x * img_w), int(l.y * img_h)) for l in landmarks] | |
| # Draw connections | |
| if connections: | |
| for connection in connections: | |
| p1 = landmark_points[connection[0]] | |
| p2 = landmark_points[connection[1]] | |
| cv2.line(image, p1, p2, connection_color, 1) | |
| # Draw points | |
| for point in landmark_points: | |
| cv2.circle(image, point, 2, point_color, -1) | |
| return image |