Top.Mail.Ru

Отслеживание моргания глаз в реальном времени с помощью Python, OpenCV и Mediapipe

Отслеживание моргания глаз в реальном времени с помощью Python, OpenCV и Mediapipe

Распознавание морганий – одна из ключевых задач в области компьютерного зрения и анализа поведения человека. Такой механизм может использоваться в системах:

  • контроля усталости водителей,

  • биометрической аутентификации,

  • интерфейсов без использования рук,

  • исследований в области нейропсихологии и 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, калибровка начнётся заново.


Может применяться в:

  1. Безопасность – система контроля усталости водителей (фиксирует засыпание).

  2. UX-тесты – изучение реакции пользователей (частота морганий).

  3. Медицинские исследования – мониторинг неврологических заболеваний.

  4. Геймификация – управление персонажем глазами.

Мы реализовали систему, которая в реальном времени определяет моргание глаз. Благодаря калибровке программа адаптируется к индивидуальным особенностям человека и работает достаточно надёжно.

Для улучшения можно добавить:

  • Отрисовку сетки лица (FaceMesh).

  • Сохранение статистики морганий в файл.

  • Звуковое предупреждение при редких морганиях (усталость).

 

Автор:

52

Читайте также

0 комментариев

Оставьте комментарий

Комментарии

×
Подпишитесь на наш Telegram-канал, чтобы быть в курсе всех новостей и акций!
Подписаться