Управляемый жестами видеоплеер на Raspberry Pi и MediaPipe

Технологии распознавания жестов в настоящее время становятся все более популярными благодаря стремительному развитию проектов виртуальной и дополненной реальности. В одной из предыдущих статей на нашем сайте мы уже рассматривали распознавание жестов с помощью Raspberry Pi и библиотек Tensorflow и Keras на основе известной игры "камень, ножницы, бумага". В этой же статье мы рассмотрим распознавание жестов с помощью библиотеки MediaPipe, написанной на Python. С помощью распознанных жестов руки пользователя мы будем управлять работой видеоплеера, запущенного на плате Raspberry Pi.

Внешний вид управляемого жестами видеоплеера на Raspberry Pi и MediaPipe

Всего в данном проекте мы будем распознавать 6 жестов: Open & Close Fist (раскрытие и закрытие кулака), Up, Down, Left, Right – движения руки вверх, вниз, влево, вправо. Открытие и закрытие кулака будут использоваться для запуска воспроизведения видео и постановки его на паузу. Движения руки вверх и вниз будут использоваться для увеличения и уменьшения громкости звука. Движения руки вправо и влево будут использоваться для быстрой перемотки видео назад и вперед.

Ранее на нашем сайте мы рассматривали управление видеоплеером с помощью жестов на основе платы Arduino.

Необходимые компоненты

  1. Плата Raspberry Pi 4 (купить на AliExpress).
  2. Камера для Raspberry Pi (купить на AliExpress).

В данном проекте мы будем использовать плату Raspberry Pi 4 с модулем камеры с установленными на нее библиотеками OpenCV и MediaPipe.

Что такое MediaPipe

MediaPipe – это фреймворк для создания кросс-платформенных (Android, iOS, web, оконечные устройства) мультимодальных (видео, аудио, временные последовательности данных) конвейеров (pipelines) машинного обучения (Machine Learning), который состоит из алгоритмов машинного обучения, классического компьютерного зрения и обработки медиа информации (то есть декодирования видео). MediaPipe включает в себя пакеты, написанные на python и других языках программирования), для решения следующих задач:

  • обнаружение объектов;
  • обнаружение лиц;
  • отслеживание рук (как одной, так и нескольких);
  • оценка положения тела;
  • сегментации волос.

Пакет MediaPipe доступен на PyPI для Linux, macOS и Windows. Используйте следующую команду для установки MediaPipe на плату Raspberry Pi 4:

Если у вас нет Raspberry Pi 4, то на Raspberry Pi 3 пакет MediaPipe можно установить с помощью команды:

Установка OpenCV на Raspberry Pi 4

Перед началом установки OpenCV обновите программное обеспечение платы Raspberry Pi до последней версии с помощью команды:

Затем установим необходимые дополнения, которые нам понадобятся для дальнейшей установки OpenCV.

Далее установим OpenCV на Raspberry Pi с помощью установщика pip.

Установка PyAutoGUI на Raspberry Pi

PyAutoGUI – это кросс-платформенный модуль, написанный на Python, для автоматизации GUI (Graphical User Interface - графический интерфейс пользователя). Данный модуль позволяет вашему скрипту на Python управлять мышкой и клавиатурой чтобы автоматизировать взаимодействие с другими приложениями. PyAutoGUI работает на Windows, macOS и Linux. Его можно использовать в Python 2 и 3. Для установки PyAutoGUI на Raspberry Pi выполните команду:

Объяснение программы для Raspberry Pi

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Вначале программы нам необходимо импортировать пакеты OpenCV, MediaPipe и PyAutoGUI. MediaPipe будет использоваться для отслеживания положения рук, а OpenCV для обработки изображений. PyAutoGUI мы будем использовать для управления клавиатурой в соответствии с обнаруженными жестами пользователя.

Далее мы объявим две переменные. Переменная mp_drawing будет использоваться для извлечения всех необходимых утилит рисования из пакета MediaPipe, а переменная mp_hands будет использоваться для импортирования модели отслеживания положения рук.

После этого запрограммируем функцию под названием findPosition(). Как следует из ее названия, она будет использоваться для нахождения координат X, Y пальцев Index (указательного), Middle (среднего), Ring (безымянного) и Pinky (мизинца). Координаты всех пальцев будут сохраняться внутри переменной lmList[].

Затем начнем трансляцию видеопотока с камеры Raspberry Pi с размерами кадра 720х640.

Далее мы создадим новый объект фида mediapipe чтобы получить доступ к модели отслеживания положения рук (Hand Tracking model), которую мы импортировали ранее. Также мы будем использовать два ключевых аргумента – минимальный доверительный уровень обнаружения и минимальный доверительный уровень отслеживания местоположения (mp_hands.Hands(min_detection_confidence=0.8, min_tracking_confidence=0.5)). Далее мы будем считывать видео кадры и сохранять их в переменной image.

Изображение, которое мы будем получать из видеопотока, будет изначально в формате BGR. Поэтому мы сначала мы развернем его горизонтально чтобы удобнее было просматривать на дисплеях с горизонтальной ориентацией, и конвертируем его в формат RGB. Перезаписываемый флаг image установим в положение false.

После этого мы будем передавать наше изображение в модель отслеживания положения рук (Hand Tracking model), а полученные с ее помощью результаты определения положения мы будем сохранять в переменной ‘results.’

После того как распознавание жеста руки будет закончено, мы установим перезаписываемый флаг image в true и преобразуем изображение из формата RGB в формат BGR.

Также, после получения результатов распознавания жеста, мы будем вызывать функцию mp_drawing чтобы нарисовать наши результаты распознавания на изображении и соединить их с утилитами для рисования (drawing utilities), которые мы импортировали ранее.

После этого мы будем вызывать функцию findPosition() чтобы считать идентификаторы и координаты всех обнаружений. Эти значения будут сохраняться в переменной lmList.

Теперь, когда мы будем знать координаты всех ключевых точек руки, мы будем использовать эту информацию для распознавания различных жестов руки и в первую очередь мы будем пытаться определить сжат или разжат кулак. Для этого мы будем сравнивать координаты кончиков пальцев [8, 12, 16, 20] и их средних точек [6, 10, 14, 19] и если кончики находятся ниже средних точек, то кулак сжат, и наоборот.

Ключевые точки руки человека, используемые в нашем проекте

В следующих строках кода мы будем вычислять общее количество определенных пальцев и сохранять его в переменной totalFingers.

И теперь, когда мы будем знать число пальцев, мы будем использовать эту информацию для проигрывания и постановки на паузу видео.

Далее мы будем определять жесты движения руки влево, вправо, вверх и вниз. Чтобы распознать движения руки влево и вправо, мы сначала будем определять координату X указательного пальца и если она меньше 300, то это будет означать движение руки влево, а если она больше 400 – это будет означать движение руки вправо.

Аналогичным образом бы будем определять движение руки вверх и вниз на основе анализа координаты Y среднего пальца. Если она меньше 210 – это движение руки вверх, а если она больше 230 – это движение руки вниз.

Тестирование работы видеоплеера, управляемого жестами рук

Подключите модель камеры к плате Raspberry Pi как показано на следующем рисунке.

Сборка аппаратной части проекта

Удостоверьтесь в том, что камера работает корректно. После этого запустите программу проекта на выполнение, в результате чего на экране вы должны увидеть всплывающее окно, в которое будет транслироваться видеопоток с камеры. После этого вы можете осуществлять управление видеоплеером с помощью жестов руки. Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Исходный код программы на Python

Видео, демонстрирующее работу проекта

Источник статьи

(Проголосуй первым!)
Загрузка...
73 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *