Отслеживание рук — это процесс использования компьютерного зрения для обнаружения и отслеживания движений руки человека в режиме реального времени. Наиболее часто отслеживание рук используется в гарнитурах виртуальной реальности. Гарнитуры позволяют использовать руки вместо сенсорных контроллеров. Это, в свою очередь, делает опыт более захватывающим.
Узнайте, как отслеживать руки человека с помощью Python, OpenCV для компьютерного зрения и MediaPipe.
Google разработал платформу MediaPipe, которая содержит множество решений для машинного обучения. Одним из решений является решение для отслеживания рук и пальцев, называемое Руки MediaPipe. Для отслеживания рук MediaPipe Hands выполняет два процесса: обнаружение ладоней и обнаружение ориентиров.
Обнаружение ладони
MediaPipe начинает с определения того, где на входном изображении находятся ладони. Поскольку оценка ограничивающих рамок для жестких объектов проще, чем идентификация рук с сочлененными пальцами.
Обнаружение ручных ориентиров
После обнаружения ладони MediaPipe выполняет обнаружение ориентиров рук. Модель ручного ориентира может предсказать 21 точную координату местоположения каждого ручного ориентира.
Цифры представляют собой уникальный идентификатор для каждого ориентира.
Настройка вашей среды
Чтобы следовать этому проекту, вы должны быть знакомы с основы Python. Установите следующие библиотеки в вашей среде:
- OpenCV: вы будете использовать эту библиотеку для компьютерного зрения и для выполнения методов обработки изображений на входном изображении.
- MediaPipe: вы будете использовать эту библиотеку для обнаружения и отслеживания рук на входном изображении.
- imutils: вы будете использовать эту библиотеку для изменения размера видеокадра ввода.
Выполните следующую команду на своем терминале, чтобы установить библиотеки OpenCV, MediaPipe и imutils. Установите pip — менеджер пакетов Python.-Если вам нужно. Убедитесь, что вы передаете библиотеки в виде списка, разделенного пробелами.
pip установить OpenCV-Python MediaPipe imutils
Когда обновление будет завершено, среда будет готова для начала написания кода.
Полный исходный код этого проекта доступен в его Репозиторий GitHub.
Импорт необходимых библиотек
Вам нужно будет импортировать библиотеки, которые вы установили, чтобы вы могли их использовать. Откройте любой Python IDE, создайте файл Python и добавьте следующие импорты:
Импортировать cv2
Импортировать медиапайп как член парламента
Импортировать imutils
Убедитесь, что вы импортируете OpenCV как cv2 и MediaPipe в нижнем регистре. Если этого не сделать, будет выдана ошибка.
Вы будете использовать mpHands для вызова решения MediaPipe hands, а объект hands — для обнаружения и отслеживания ввода рукой. Вы будете использовать объект mpDraw, чтобы нарисовать связи между ориентирами идентифицированных рук.
mpHands = mp.solutions.hands
руки = mpHands. Руки()
mpDraw = mp.solutions.drawing_utils
Вы можете точно настроить модель рук MediaPipe, передав различные параметры конструктору Hands(). Значения по умолчанию достаточно хороши для этого проекта, но вы можете поэкспериментировать с ними, чтобы увидеть, как они влияют на модель:
Вам следует оставить static_image_mode установите значение False, чтобы гарантировать, что модель обнаружит руки один раз, прежде чем начнет их отслеживать. Он повторяет процесс отслеживания только в том случае, если достоверность обнаружения падает ниже заявленного параметра, что ускоряет общую обработку ввода.
Выполнение отслеживания рук
Вам нужны три функции для отслеживания рук: одна для обработки ввода, одна для рисования соединений ориентиров рук и основная функция для управления потоком программы.
Функция обработки ввода
Эта функция принимает входные данные, преобразует их в оттенки серого и передает в модель рук MediaPipe для обнаружения и отслеживания рук во входных данных.
# Обработка входного изображения
дефprocess_image(изображение):
# Преобразование ввода в оттенки серого
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
результаты = руки.процесс (серое_изображение)
# Возврат обнаруженных раздач в функцию вызова
возвращаться Результаты
Функция возвращает результаты о том, были ли обнаружены какие-либо руки на входе.
Функция рисования соединений ручных ориентиров
Эта функция проверяет, обнаружила ли функция обработки ввода какие-либо руки. Если есть какие-либо обнаруженные руки, он зацикливается на каждом ориентире и рисует вокруг него круг, отслеживая ориентир с помощью Функция перечисления Python. Затем он рисует связи между ориентирами на исходном видеовходе.
# Отрисовка соединений ориентиров
дефdraw_hand_connections(изображение, результаты):
если результаты.multi_hand_landmarks:
для руки в результаты.multi_hand_landmarks:
для идентификатор, лм в перечислить (handLms.landmark):
ч, ш, с = изображение.форма# Нахождение координат каждого ориентира
cx, cy = int (lm.x * w), int (lm.y * h)# Печать идентификатора и координат каждого ориентира
# на терминале
печать (id, cx, cy)# Создание круга вокруг каждого ориентира
cv2.circle(img, (cx, cy), 10, (0, 255, 0),
cv2.ЗАПОЛНЕН)
# Рисование соединений ориентиров
mpDraw.draw_landmarks (img, handLms,
mpHands. РУЧНЫЕ_СОЕДИНЕНИЯ)
возвращаться изображение
Функция начинается с обведения каждого ориентира:
Затем он рисует ручные соединения:
Наконец, он возвращает свой вывод вызывающей функции.
Основная функция
Создайте основную функцию, которая будет управлять потоком вашей программы. Он примет ввод и изменит размер видеокадра, чтобы обеспечить согласованность вывода. Передайте входные данные функции обработки, которая затем обнаружит и отследит руки. Возьмите возвращенные результаты в функцию рисования соединения ручных ориентиров, которая нарисует соединение на исходном видеовходе. Наконец, он отобразит вывод пользователю.
дефосновной():
# Замените 0 на путь к видео, чтобы использовать
# предварительно записанное видео
крышка = cv2.VideoCapture(0)покаИстинный:
# Получение ввода
успех, изображение = cap.read()
image = imutils.resize (изображение, ширина =500, высота =500)
результаты = process_image (изображение)
draw_hand_connections (изображение, результаты)# Отображение вывода
cv2.imshow («Ручной трекер», изображение)
# Программа завершается при нажатии клавиши q
если cv2.waitKey(1) == порядок('к'):
крышка.релиз()
cv2.destroyAllWindows()
Последний шаг — запуск вашей программы. Приведенный ниже код гарантирует, что при запуске программы основная функция запускается первой.
если __имя__ == "__основной__":
основной()
Когда программа запускается, она выдает такой вывод:
Программа отслеживает руки в режиме реального времени.
Отслеживание рук для погружения в виртуальную реальность
Отслеживание рук в виртуальной реальности делает технологию более привлекательной. Гарнитуры виртуальной реальности начали внедрять отслеживание рук, привнося ощущение повышенной реальности в виртуальный мир. Гарнитуры позволяют пользователю вводить команды с помощью виртуальной руки.
Отслеживание рук в виртуальных гарнитурах — лишь одно из применений этой технологии. Вы можете включить отслеживание рук в любой применимой области по своему вкусу.