Распознавание морганий – одна из ключевых задач в области компьютерного зрения и анализа поведения человека. Такой механизм может использоваться в системах:
-
контроля усталости водителей,
-
биометрической аутентификации,
-
интерфейсов без использования рук,
-
исследований в области нейропсихологии и UX.
В этой статье мы разберём Python-программу, которая фиксирует моргания глаз в реальном времени с использованием библиотек OpenCV и Mediapipe.
Для определения моргания используется метрика EAR (Eye Aspect Ratio). Она вычисляется на основе расстояний между ключевыми точками глаза:
-
Горизонталь (ширина глаза)
-
Вертикали (два расстояния между веками)
Формула:
EAR = (ver1 + ver2)(2 * hor)
Когда глаз открыт – значение EAR относительно высокое. При закрытии глаза – оно резко падает ниже порога.
Импорт библиотек
import cv2
import math
import time
import numpy as np
import mediapipe as mp
-
cv2 – работа с видеопотоком.
-
math – вычисление расстояний.
-
numpy – статистика (медиана).
-
mediapipe – распознавание лица и ключевых точек.
Константы
W_CAM, H_CAM = 1280, 720 # размер окна камеры
CALIBRATION_FRAMES = 60 # количество кадров для калибровки
MARGIN_K = 0.80 # коэффициент для вычисления порога
MIN_CLOSE_FRAMES = 2 # минимальное кол-во кадров закрытых глаз
Здесь задаются параметры работы. Например, программа автоматически подстраивает порог EAR под конкретного человека, анализируя первые 60 кадров.
Функция для расстояний и вычисления EAR
def euclid(a, b):
return math.dist(a, b)
def eye_ear(landmarks, eye_idx, w, h):
pts = [(int(landmarks[i].x * w), int(landmarks[i].y * h)) for i in eye_idx]
hor = euclid(pts[0], pts[3])
ver1 = euclid(pts[1], pts[4])
ver2 = euclid(pts[2], pts[5])
ear = (ver1 + ver2) / (2.0 * hor + 1e-6)
return ear, pts
-
Берутся координаты точек глаза.
-
Считаются расстояния.
-
Возвращается EAR и список точек для отрисовки.
Основной цикл обработки видео
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, W_CAM)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, H_CAM)
Открываем камеру и устанавливаем разрешение.
Логика моргания
if ear_val < thresh:
close_frames += 1
else:
if close_frames >= MIN_CLOSE_FRAMES and not eye_closed:
eye_closed = True
if eye_closed and close_frames >= MIN_CLOSE_FRAMES:
blink_count += 1
eye_closed = False
close_frames = 0
Здесь мы отслеживаем:
-
сколько кадров подряд глаз был закрыт,
-
если глаз закрыт ≥2 кадров, то фиксируем моргание.
Вывод информации
cv2.putText(frame, f"Blinks: {blink_count}", (20, 40),
cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 200, 0), 2)
cv2.putText(frame, f"EAR: {ear_val:.3f}" if ear_val else "EAR: --",
(20, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 2)
На экран выводится:
-
Количество морганий
-
Значение EAR
-
Порог (threshold)
-
FPS
При запуске появляется окно с камерой:
-
В левом верхнем углу – счётчик морганий.
-
Значение EAR обновляется в реальном времени.
-
Если нажать
r
, калибровка начнётся заново.
Может применяться в:
-
Безопасность – система контроля усталости водителей (фиксирует засыпание).
-
UX-тесты – изучение реакции пользователей (частота морганий).
-
Медицинские исследования – мониторинг неврологических заболеваний.
-
Геймификация – управление персонажем глазами.
Мы реализовали систему, которая в реальном времени определяет моргание глаз. Благодаря калибровке программа адаптируется к индивидуальным особенностям человека и работает достаточно надёжно.
Для улучшения можно добавить:
-
Отрисовку сетки лица (FaceMesh).
-
Сохранение статистики морганий в файл.
-
Звуковое предупреждение при редких морганиях (усталость).
Автор: Евгений Морковин
0 комментариев
Оставьте комментарий
Комментарии