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 |