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

Что такое отслеживание рук
Отслеживание рук — это использование компьютерного зрения для определения и слежения за движениями рук человека в реальном времени. В простом определении: модель на вход получает изображение или видеокадр и возвращает координаты ключевых точек (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 — модель сначала находит руки, затем переходит в режим отслеживания, что экономит ресурсы.
Алгоритм работы программы
Для простого трекера потребуются три функции:
- Обработка входного кадра — подготовка и передача в MediaPipe.
- Рисование ключевых точек и связей на кадре.
- Главная функция — чтение видеопотока и отображение результата.
Функция обработки входа
Эта функция конвертирует изображение в нужный формат и передаёт его модели:
# 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) дают данные глубины, что улучшает точность при сложных ракурсах.
Мини-методология интеграции в проект
- Прототип: реализуйте базовый трекер с MediaPipe и проведите полевые тесты с ключевой аудиторией.
- Оценка: соберите метрики стабильности (время простоя, частота потерянных треков) и UX-фидбек.
- Оптимизация: настройте параметры модели, уменьшите задержку, адаптируйте пред- и постобработку.
- Производство: добавьте обработку ошибок, логирование, и механизмы согласия пользователя.
Тестовые случаи и критерии приёмки
Критерии приёмки:
- Система детектирует минимум одну руку в 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, мобильные устройства) или предложить реализацию распознавания жестов поверх детектора ключевых точек.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone