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

Отслеживание рук с Python, OpenCV и MediaPipe

6 min read Компьютерное зрение Обновлено 03 Jan 2026
Отслеживание рук: Python, OpenCV и MediaPipe
Отслеживание рук: Python, OpenCV и MediaPipe

Важно: отслеживание рук обрабатывает видеопоток и потенциально относитcя к персональным данным. Получайте согласие пользователя и учитывайте локальные требования по конфиденциальности.

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

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

Отслеживание рук — это использование компьютерного зрения для определения и слежения за движениями рук человека в реальном времени. В простом определении: модель на вход получает изображение или видеокадр и возвращает координаты ключевых точек (landmarks) и/или ограничивающие рамки ладоней. Краткое определение терминов:

  • Landmarks — ключевые точки на кисти (в MediaPipe их 21 для каждой руки).
  • Palm detection — этап, где система быстро определяет область ладони.
  • Tracking — отслеживание уже обнаруженной руки в последующих кадрах.

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

Google поддерживает фреймворк MediaPipe с набором ML-решений, включая MediaPipe Hands. Алгоритм использует две основные стадии: обнаружение ладони и детекция ключевых точек руки.

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

Сначала модель находит область ладони (palm detection). Для большинства сцен проще сначала найти компактную область ладони, чем сразу оценивать конфигурацию всех суставов пальцев.

Детекция ключевых точек

После определения ладони модель предсказывает 21 координату для каждой руки. Эти координаты описывают суставы и кончики пальцев, что позволяет восстановить позу кисти.

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

Числа на изображении соответствуют уникальным идентификаторам ключевых точек.

Требования и подготовка среды

Понадобятся базовые знания Python. Установите следующие библиотеки:

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

Запустите команду (в терминале):

pip install OpenCV-Python MediaPipe imutils

После установки среда готова для разработки.

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

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

import cv2  
import mediapipe as mp  
import imutils

Обратите внимание: OpenCV импортирован как cv2, MediaPipe — как mp.

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

Создайте объекты для работы с решением Hands и утилитами рисования:

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

Можно тонко настроить параметры в Hands(), например static_image_mode, max_num_hands, min_detection_confidence и min_tracking_confidence. Для видеопотока static_image_mode оставляют False — модель сначала находит руки, затем переходит в режим отслеживания, что экономит ресурсы.

IDE Pycharm показывает параметры MediaPipe Hands

Алгоритм работы программы

Для простого трекера потребуются три функции:

  1. Обработка входного кадра — подготовка и передача в MediaPipe.
  2. Рисование ключевых точек и связей на кадре.
  3. Главная функция — чтение видеопотока и отображение результата.

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

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

# Processing the input image  
def process_image(img):  
    # Converting the input to grayscale  
    gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  
    results = hands.process(gray_image)  
  
    # Returning the detected hands to calling function  
    return results

Функция возвращает объект results с информацией о найденных руках.

Функция рисования связей

Она проверяет, нашла ли модель руки, и рисует кружки и линии между ключевыми точками:

# Drawing landmark connections  
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  
  
                # Finding the coordinates of each landmark  
                cx, cy = int(lm.x * w), int(lm.y * h)  
  
                # Printing each landmark ID and coordinates  
                # on the terminal  
                print(id, cx, cy)  
  
                # Creating a circle around each landmark  
                cv2.circle(img, (cx, cy), 10, (0, 255, 0),  
                           cv2.FILLED)  
                # Drawing the landmark connections  
                mpDraw.draw_landmarks(img, handLms,  
                                      mpHands.HAND_CONNECTIONS)  
  
        return img

Функция визуализирует каждую ключевую точку и соединения между ними.

Программа выделяет окружности вокруг каждой ключевой точки руки

Программа отслеживает руки и рисует связи

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

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

def main():  
   # Replace 0 with the video path to use a  
   # pre-recorded video  
    cap = cv2.VideoCapture(0)  
  
    while True:  
        # Taking the input  
        success, image = cap.read()  
        image = imutils.resize(image, width=500, height=500)  
        results = process_image(image)  
        draw_hand_connections(image, results)  
  
        # Displaying the output  
        cv2.imshow("Hand tracker", image)  
  
        # Program terminates when q key is pressed  
        if cv2.waitKey(1) == ord('q'):  
            cap.release()  
            cv2.destroyAllWindows()

Запустите код через стандартную проверку модуля:

if __name__ == "__main__":  
    main()

При успешном запуске вы увидите реальное отслеживание рук в окне приложения.

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

  • Обеспечьте достаточное освещение и контраст с фоном.
  • Избегайте сильной размытости при быстром движении.
  • При необходимости используйте увеличение разрешения кадра, но учитывайте нагрузку на CPU/GPU.
  • Если требуется высокая частота обновления, уменьшите разрешение и включите аппаратное ускорение.

Когда отслеживание даёт сбои

  • Частичное или полное перекрытие рук (occlusion) приводит к потере ключевых точек.
  • Перчатки или сильно изменённый внешний вид кисти могут ухудшить детекцию.
  • Очень низкая освещённость и существенные шумы на камере влияют на качество.

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

  • OpenPose — библиотека для детекции скелета и кистей; хорошо подходит для мульти-человеческих сцен.
  • Специализированные сенсоры (Leap Motion, контроллеры VR) дают более стабильные данные о положении рук, но требуют дополнительного оборудования.
  • Глубинные камеры (например, Intel RealSense) дают данные глубины, что улучшает точность при сложных ракурсах.

Мини-методология интеграции в проект

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

Тестовые случаи и критерии приёмки

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

  • Система детектирует минимум одну руку в 95% контролируемых сценариев (при адекватном освещении).
  • Задержка вывода результата не превышает допустимой для задачи (например, 100–200 мс для интерактивного интерфейса).
  • При распознавании жестов ключевые точки соответствуют ожидаемым положениям в 90% случаев.

Минимальные тесты:

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

Ролевые контрольные списки

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

  • Включить логирование ошибок модели.
  • Настроить параметры min_detection_confidence и min_tracking_confidence.
  • Покрыть критические пути unit-тестами.

QA-инженер:

  • Провести тесты высокой и низкой освещённости.
  • Проверить стабильность при длительном запуске.
  • Зафиксировать случаи падения детектора.

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

  • Определить целевой сценарий использования (VR, управление жестами, аналитика).
  • Согласовать требования по задержке и точности.

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

Обработка видеопотока может содержать персональные данные. Рекомендации:

  • Получите явное согласие пользователя на запись/обработку видео.
  • Минимизируйте хранение кадров; предпочитайте потоковую обработку без сохранения.
  • При хранении или передаче данных применяйте шифрование.

Частые ошибки и отладка

  • Пустые результаты от hands.process() — проверьте, что изображение в RGB, а не в BGR.
  • Падение приложения на слабых CPU — уменьшите разрешение или используйте ускорение.
  • Неправильные координаты — убедитесь, что вы умножаете относительные координаты на ширину и высоту кадра.

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

MediaPipe и OpenCV активно развиваются. При обновлении библиотек:

  • Прогоняйте интеграционные тесты, чтобы выявить изменения API.
  • Проверяйте параметры конструктора Hands(), т.к. возможны новые опции и изменения поведения по умолчанию.

Факты

  • MediaPipe обнаруживает 21 ключевую точку на каждой руке.
  • Для видеопотока static_image_mode обычно False.

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

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

Краткое резюме

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

Ключевые выводы

  • MediaPipe Hands использует двухэтапный подход: palm detection и landmark detection.
  • 21 ключевая точка дает достаточную семантику для распознавания жестов.
  • Качество зависит от освещения, угла камеры и перекрытий.
  • Для производства — добавьте логирование, тесты и обработку ошибок.

Спасибо за внимание. Если хотите, могу помочь адаптировать код под конкретную платформу (Windows, Linux, мобильные устройства) или предложить реализацию распознавания жестов поверх детектора ключевых точек.

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

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

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство