Гид по технологиям

Отслеживание рук в реальном времени с помощью Python, OpenCV и MediaPipe

6 min read Компьютерное зрение Обновлено 05 Dec 2025
Отслеживание рук с Python и MediaPipe
Отслеживание рук с Python и MediaPipe

Человек использует VR-гарнитуру и жесты рук

Что такое отслеживание рук?

Отслеживание рук — это использование компьютерного зрения для обнаружения и отслеживания движений руки человека в реальном времени. Чаще всего это применяется в VR-гарнитурах, где руки служат управляющим вводом вместо контроллеров. Это повышает погружение и делает взаимодействие более естественным.

Краткое определение терминов:

  • Landmarks: ключевые точки на кисти (21 точка), которые модель предсказывает как (x, y, z) в относительных координатах.
  • Palm detection: быстрый шаг, который находит область ладони и строит ограничивающую рамку (bounding box).
  • Tracking: отслеживание последовательности кадров после первоначального обнаружения для экономии ресурсов.

Как MediaPipe отслеживает руки

Google разработала фреймворк MediaPipe, содержащий набор ML-решений. Одно из них — MediaPipe Hands. Алгоритм состоит из двух этапов:

  1. Обнаружение ладони (palm detection). Быстрая модель, которая выделяет область, где находится рука. Строит ориентированные прямоугольники вокруг ладони.
  2. Детекция landmarks. Более точная модель предсказывает 21 координату для каждой руки, включая суставы пальцев и запястье.

Обнаружение ладони

Обнаружение ладони проще, чем сразу оценивать всю структуру пальцев. MediaPipe сначала находит «коробку» ладони, затем передаёт область в детектор landmarks.

Детекция контрольных точек на руке

После обнаружения ладони модель возвращает 21 координату. Эти точки позволят определить положение каждого сустава и направление пальцев.

Схема руки с пронумерованными контрольными точками

Номера указывают уникальный идентификатор каждой точки.

Подготовка окружения

Для выполнения проекта нужны базовые знания Python и установленные библиотеки:

  • OpenCV — обработка изображений и отображение видео.
  • MediaPipe — обнаружение ладони и landmarks.
  • imutils — вспомогательные утилиты для работы с изображениями (изменение размера и пр.).

Установите пакеты командой (терминал/командная строка):

pip install OpenCV-Python MediaPipe imutils

После установки окружение готово.

Important: используйте виртуальное окружение (venv или conda), чтобы избежать конфликтов версий.

Импорт необходимых библиотек

Откройте любой Python IDE, создайте файл и добавьте импорты:

import cv2
import mediapipe as mp
import imutils

Удостоверьтесь, что mediapipe импортирован именно как “mediapipe” в нижнем регистре.

Создание объектов MediaPipe

Инициализируем объекты, которые будем использовать для обнаружения и рисования результатов:

mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils

Вы можете тонко настроить модель через параметры конструктора Hands(), например изменить static_image_mode, max_num_hands или min_detection_confidence.

IDE PyCharm с параметрами MediaPipe Hands

Совет: оставьте static_image_mode=False для обработки видео в реальном времени. Тогда модель выполнит обнаружение один раз и будет трекать дальнейшие кадры, обновляя обнаружение только при падении уверенности.

Реализация самого трекинга

Нам понадобится три функции:

  • process_image — обработка кадра и подача его в модель;
  • draw_hand_connections — отрисовка маркеров и связей на кадре;
  • main — управляющая функция, которая захватывает видео и отображает результат.

Функция обработки входного кадра

Эта функция переводит изображение в формат, удобный для MediaPipe, и запускает обработку:

# Обработка входного изображения
def process_image(img):
    # Конвертация BGR (OpenCV) в RGB (MediaPipe ожидает RGB)
    rgb_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    results = hands.process(rgb_image)
    # Возвращаем результаты детекции
    return results

Примечание: MediaPipe ожидает RGB-изображение. OpenCV по умолчанию использует BGR.

Функция отрисовки контрольных точек и связей

Эта функция проверяет, есть ли обнаруженные руки, затем обходит все landmarks, вычисляет пиксельные координаты и рисует кружки и связи:

# Рисование связей между контрольными точками
def draw_hand_connections(img, results):
    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            for id, lm in enumerate(handLms.landmark):
                h, w, c = img.shape
                # Координаты каждой точки в пикселях
                cx, cy = int(lm.x * w), int(lm.y * h)
                # Вывод ID точки и её координат в консоль для отладки
                print(id, cx, cy)
                # Рисуем круг на каждой контрольной точке
                cv2.circle(img, (cx, cy), 5, (0, 255, 0), cv2.FILLED)
            # Рисуем соединения между точками
            mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)
    return img

Выход программы: маркеры на каждой точке руки

Главная функция

Главная функция организует цикл захвата кадров, обработку и отображение окна:

def main():
    # По умолчанию используем камеру (0). Для файла укажите путь.
    cap = cv2.VideoCapture(0)

    while True:
        success, image = cap.read()
        if not success:
            break
        # Приводим кадр к фиксированному размеру для стабильности
        image = imutils.resize(image, width=500, height=500)
        results = process_image(image)
        image = draw_hand_connections(image, results)

        # Показываем результат пользователю
        cv2.imshow("Hand tracker", image)

        # Выход по нажатию клавиши 'q'
        if cv2.waitKey(1) == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

Выход программы: отслеживание руки в реальном времени

Готово — программа отслеживает руки в реальном времени.

Практические советы и улучшения

  • Частота кадров: уменьшите разрешение или используйте аппаратное ускорение (OpenVINO / TensorRT), если требуется высокая FPS.
  • Фильтрация шума: применяйте экспоненциальную фильтрацию координат для более плавного движения курсора.
  • Множественные руки: по умолчанию MediaPipe может детектировать несколько рук; добавьте логику для определения правой/левой руки (handedness).
  • Отказоустойчивость: проверяйте None-результаты и избегайте падений при внезапных потерях детекции.

Когда этот подход не подходит

  • Полная 3D-реконструкция кисти при плохой освещённости требует специализированных сенсоров (глубинные камеры).
  • Высокоточные измерения углов суставов в медицинских приложениях лучше выполнять с аппаратными сенсорами или датчиками движения.
  • Работа в условиях очень плотного перекрытия рук и предметов уменьшает точность 2D-моделей.

Альтернативные подходы

  • Использование глубинных камер (Intel RealSense, Azure Kinect) для восстановления 3D-координат.
  • Связка OpenPose для общего скелета тела + кастомные модели для кистей.
  • Аппаратные решения: перчатки с IMU/датчиками, если нужна абсолютная точность положений суставов.

Ментальные модели (как думать о задаче)

  1. Обнаружение → локализация → трекинг.
  2. Быстрый, но грубый детектор (palm) снижает объём работы для точной модели.
  3. Разделяй визуальную задачу: сначала «где рука», затем «что делает рука».

Факт-бокс

  • Контрольных точек в MediaPipe Hands: 21.
  • Поддержка: CPU и мобильные устройства (оптимизированно).
  • Входные форматы: фотографии и потоковое видео (RGB).

Мини-методология: быстрый план внедрения (4 шага)

  1. Прототип: реализуйте пример выше и проверьте на веб-камере.
  2. Оценка качества: снимите тесты в разных условиях освещения.
  3. Оптимизация: уменьшите разрешение, включите threading и буферизацию.
  4. Интеграция: адаптируйте сигналы (жесты) под интерфейс приложения.

Чек-листы по ролям

Разработчик:

  • Запустить пример на локальной машине.
  • Проверить стабильность при 30+ мин работы.

QA-инженер:

  • Тесты на разных освещениях.
  • Тест на быстром движении руки.

Продукт-менеджер:

  • Сценарии использования в UI (жесты).
  • Критерии приёмки и UX-флоу.

Критерии приёмки

  • Стабильная детекция рук при нормальном освещении в 90% случаев (камеры consumer-level).
  • Корректное распознавание основных жестов (открытая/сжатая ладонь, указание) при 95% совпадении по визуальной оценке.
  • Нормальная работа в течение 30 минут без падений приложения.

Сниппет: определение простого жеста «пальцы вместе»

# Пример: простая детекция сомкнутых пальцев
def is_fist(hand_landmarks, img_shape):
    h, w, _ = img_shape
    # Сравним расстояние кончиков пальцев с основанием пальцев
    tip_ids = [4, 8, 12, 16, 20]
    tips = []
    for tid in tip_ids:
        lm = hand_landmarks.landmark[tid]
        tips.append((int(lm.x * w), int(lm.y * h)))
    # Простейшая эвристика: если среднее расстояние между кончиками маленькое
    dsum = 0
    for i in range(1, len(tips)):
        dsum += ((tips[i][0]-tips[0][0])2 + (tips[i][1]-tips[0][1])2) ** 0.5
    avg = dsum / (len(tips)-1)
    return avg < 40  # порог в пикселях — подберите под разрешение

Безопасность и конфиденциальность

  • Не отправляйте необработанный видеопоток на чужие серверы без явного согласия пользователя.
  • При хранении видеозаписей анонимизируйте данные и соблюдайте локальные законы о приватности (например, требования GDPR для ЕС).
  • Минимизируйте время хранения и доступ к потокам видео.

Оптимизация производительности

  • Используйте отдельный поток (thread) для захвата кадров и ещё один для обработки, чтобы избежать задержек UI.
  • Кэшируйте результаты детекции, если уверенность остаётся высокой.
  • Рассмотрите аппаратное ускорение (GPU, NPU) для мобильных и встраиваемых устройств.

Совместимость и миграция

  • MediaPipe поддерживает Android, iOS и настольные платформы. При переходе на мобильную версию адаптируйте разрешение и включите оптимизации для NPU.
  • При миграции с OpenPose: перенесите логику из 2D-координат в pipeline MediaPipe, проверьте согласованность индексов точек.

Тест-кейсы и приёмка

  • Сценарий 1: статичная рука, разные углы — модель должна детектировать ладонь.
  • Сценарий 2: быстрые движения (мах) — модель не должна генерировать слишком много ложных срабатываний.
  • Сценарий 3: две руки — обе руки должны корректно отображаться.

Короткое объявление (для рассылки, 100–200 слов)

Встречайте реализацию отслеживания рук на Python с OpenCV и MediaPipe. Простая и быстрая настройка позволяет обрабатывать видеопоток с веб-камеры, определять ладони и 21 контрольную точку кисти в реальном времени. В статье вы найдёте пошаговый код, советы по оптимизации, чек-листы для ролей и рекомендации по безопасности данных. Подойдёт для прототипов VR-интерфейсов, интерактивных инсталляций и учебных проектов.

Резюме

Отслеживание рук с MediaPipe — удобный инструмент для быстрого прототипирования жестов и взаимодействия в реальном времени. Он хорошо работает на CPU, прост в интеграции и предоставляет 21 контрольную точку для точного анализа позы кисти. Для продвинутых задач рассмотрите комбинирование с глубинными камерами или аппаратными сенсорами.

Основные выводы

  • MediaPipe Hands даёт 21 точку для каждой руки.
  • Потоковая обработка требует RGB-формата и оптимизации частоты кадров.
  • Применяйте меры по безопасности и хранению видеоданных.

Спасибо за чтение! Если нужно, могу подготовить версию примера под мобильную платформу, добавить распознавание набора жестов или flowchart принятия решений для интеграции в продукт.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как устроить идеальную вечеринку для просмотра ТВ
Развлечения

Как устроить идеальную вечеринку для просмотра ТВ

Как распаковать несколько RAR‑файлов сразу
Инструменты

Как распаковать несколько RAR‑файлов сразу

Приватный просмотр в Linux: как и зачем
Приватность

Приватный просмотр в Linux: как и зачем

Windows 11 не видит iPod — способы исправить
Руководство

Windows 11 не видит iPod — способы исправить

PS5: как настроить игровые пресеты
Консоли

PS5: как настроить игровые пресеты

Как переключить камеру в Omegle на iPhone и Android
Руководство

Как переключить камеру в Omegle на iPhone и Android