Оглавление:

Gesture Hawk: робот, управляемый жестами руки, с использованием интерфейса на основе обработки изображений: 13 шагов (с изображениями)
Gesture Hawk: робот, управляемый жестами руки, с использованием интерфейса на основе обработки изображений: 13 шагов (с изображениями)

Видео: Gesture Hawk: робот, управляемый жестами руки, с использованием интерфейса на основе обработки изображений: 13 шагов (с изображениями)

Видео: Gesture Hawk: робот, управляемый жестами руки, с использованием интерфейса на основе обработки изображений: 13 шагов (с изображениями)
Видео: Управление жестами руки машинкой трансформер RC Stunt Car 2024, Ноябрь
Anonim
Gesture Hawk: робот, управляемый жестами рук, с использованием интерфейса на основе обработки изображений
Gesture Hawk: робот, управляемый жестами рук, с использованием интерфейса на основе обработки изображений

Gesture Hawk был представлен в TechEvince 4.0 как простой человеко-машинный интерфейс, основанный на обработке изображений. Его полезность заключается в том, что для управления роботизированной машиной, работающей по принципу дифференциального привода, никаких дополнительных датчиков или носимых устройств, кроме перчаток, не требуется. В этом руководстве мы познакомим вас с принципом работы, лежащим в основе отслеживания объектов и обнаружения жестов, используемых в системе. Исходный код этого проекта можно скачать с Github по ссылке:

Шаг 1: НЕОБХОДИМО:

НЕОБХОДИМЫЕ ВЕЩИ
НЕОБХОДИМЫЕ ВЕЩИ
НЕОБХОДИМЫЕ ВЕЩИ
НЕОБХОДИМЫЕ ВЕЩИ
НЕОБХОДИМЫЕ ВЕЩИ
НЕОБХОДИМЫЕ ВЕЩИ
НЕОБХОДИМЫЕ ВЕЩИ
НЕОБХОДИМЫЕ ВЕЩИ
  1. Драйвер двигателя L298N
  2. Двигатели постоянного тока
  3. Шасси автомобиля-робота
  4. Ардуино Уно
  5. LiPo аккумуляторы
  6. USB-кабель Arduino (длинный)
  7. Библиотека OpenCV с Python

Шаг 2: ПРИНЦИП РАБОТЫ:

ПРИНЦИП РАБОТЫ
ПРИНЦИП РАБОТЫ

Gesture Hawk - это трехфазная система обработки, как вы можете видеть на диаграмме выше.

Шаг 3: ЗАХВАТ И ОБРАБОТКА ВВОДА:

ЗАХВАТ И ОБРАБОТКА ВВОДА
ЗАХВАТ И ОБРАБОТКА ВВОДА

Захват ввода можно понять в более широких категориях, приведенных на диаграмме выше.

Чтобы извлечь форму руки из окружающей среды, нам нужно использовать маскировку или фильтрацию определенного цвета (в данном случае - фиолетово-синего »). Для этого вам необходимо преобразовать изображение из формата BGR в формат HSV, что можно сделать с помощью следующего фрагмента кода.

hsv = cv2.cvtColor (кадр, cv2. COLOR_BGR2HSV)

Теперь следующий шаг - найти желаемый диапазон параметров HSV для извлечения руки с помощью маски или фильтра. Для этого лучше всего использовать направляющие для поиска подходящего диапазона. Вот снимок экрана трекбара, используемого в этом проекте.

Шаг 4:

Изображение
Изображение

Шаг 5:

Ниже приведен фрагмент кода для создания такой трекбара для построения маски:

импорт cv2

импортировать numpy как npdef ничего (x): передать cv2. namedWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, ничего) cv2.createTrackbar ('l_S ',' image ', 50, 255, ничего) cv2.createTrackbar (' l_V ',' image ', 50, 255, ничего) cv2.createTrackbar (' h_H ',' image ', 130, 255, ничего) cv2. createTrackbar ('h_S', 'image', 255, 255, ничего) cv2.createTrackbar ('h_V', 'image', 255, 255, ничего) while (1): _, frame = img.read ()

hsv = cv2.cvtColor (frame, cv2. COLOR_BGR2HSV) lH = cv2.getTrackbarPos ('l_H', 'image') lS = cv2.getTrackbarPos ('l_S', 'image') lV = cv2.getTrackbarPos ('l_V', 'image') hH = cv2.getTrackbarPos ('h_H', 'image') hS = cv2.getTrackbarPos ('h_S', 'image') hV = cv2.getTrackbarPos ('h_V', 'image') lower_R = np. array ([lH, lS, lV]) upper_R = np.array ([hH, hS, hV]) mask = cv2.inRange (hsv, lower_R, upper_R) res = cv2.bitwise_and (кадр, кадр, маска = маска) cv2.imshow ('image', res) k = cv2.waitKey (1) & 0xFF, если k == 27: прервать cv2.destroyAllWindows ()

Шаг 6: ОБРАБОТКА ЧАСТИ:

ОБРАБОТКА
ОБРАБОТКА

Итак, у нас есть геометрическая форма руки, теперь пришло время использовать ее для определения жестов руки.

Выпуклая оболочка:

Через выпуклую оболочку мы пытаемся вписать примерный многоугольник через крайние точки, присутствующие в форме. На изображении слева показан примерный многоугольник, который был назначен фигуре с выпуклыми точками, отмеченными красным.

Выпуклые точки - это те точки формы, которые наиболее удалены от стороны аппроксимированного многоугольника. Но проблема с выпуклой оболочкой заключается в том, что во время ее вычисления мы получим массив всех выпуклых точек, но нам нужна синяя выпуклая точка. Мы расскажем, зачем это нужно.

Чтобы найти эту выпуклую точку, нам нужно применить формулу расстояния по перпендикуляру, чтобы найти расстояние от выпуклой точки до ближайшей стороны. Мы заметили, что синяя точка находится на максимальном расстоянии сбоку, и мы получили эту точку.

Шаг 7:

Изображение
Изображение

Шаг 8:

Изображение
Изображение

Далее нам нужно найти наклон линии, соединяющей кончик большого пальца (или крайнюю точку) с этой выпуклой точкой с горизонталью.

Шаг 9:

Изображение
Изображение

В приведенном выше случае угол α должен составлять от 0 до 90 градусов, если жест предназначен для поворота влево. То есть tan (α) должен быть положительным.

Шаг 10:

Изображение
Изображение

В приведенном выше случае угол α должен составлять от 180 до 90 градусов, если жест предназначен для поворота вправо. То есть tan (α) должен быть отрицательным.

Следовательно, если Tan α положительный, то поверните налево. Если Tan α отрицательный, то поверните направо. Теперь пора посмотреть, как определить самую важную команду остановки.

Здесь проверяется заданное соотношение (найденное путем попадания и попытки), и в максимальных случаях это соотношение расстояний остается в этом конкретном диапазоне.

Шаг 11:

Изображение
Изображение

Наконец, жест движения вперед анализируется функцией matchShape () в OpenCV. Эта функция сравнивает форму двух счетчиков, в данном случае, между тренировочным примером на правой стороне на изображении выше, с контуром в левой части изображения. Он возвращает значение от 0 до 2 или 3, в зависимости от вариации, представленной в форме двух контуров. Для идентичного контура возвращается 0.

ret = cv2.matchShapes (cnt1, cnt2, 1, 0.0)

Здесь cn1 и cnt2 - два сравниваемых контура.

Шаг 12: УПРАВЛЕНИЕ ДВИЖЕНИЕМ:

УПРАВЛЕНИЯ ДВИЖЕНИЕМ
УПРАВЛЕНИЯ ДВИЖЕНИЕМ

PySerial:

Мы использовали библиотеку Python PySerial для преобразования обработанных данных в последовательные данные, которые передавались на Arduino Uno через USB-кабель Arduino. Как только конкретный жест был обнаружен opencv, мы создали временную переменную, скажем «x», присвоили ей какое-то уникальное значение и преобразовали ее в последовательный ввод, используя следующую командную строку: -

import serial # для импорта библиотеки Pyserial

serial. Serial ('', baudrate = '9600', timeout = '0') # настройка последовательного вывода.. ИМЯ ПОРТА - это имя порта, через который будет происходить передача данных.

serial.write (b'x ') # x - это алфавит, отправляемый в порт… b - это преобразование этой строки в байты.

Обработка Arduino:

Теперь arduino закодирован таким образом, что каждый отдельный последовательный x линейно отображается на определенное действие, отвечающее за плавное движение робота (скажем, обнаружение левого жеста запустит двигатели справа, чтобы повернуть налево). Мы можем управлять движением каждого колеса как поступательно, так и вращательно, правильно изменяя код.

L298N Драйвер двигателя: -

Драйвер двигателя используется в качестве посредника между двигателем и источником питания, поскольку двигатели не могут получать питание напрямую из-за низкого номинального напряжения. Батарея Li-Po подключается к входной клемме 12 В, и мы подключаем разъем 5 В Arduino к входному разъему 5 В драйвера двигателя, наконец, соединяя землю Li-Po, а также Arduino в общем разъеме заземления драйвера двигателя.

Теперь клеммы двигателей подключены к данным розеткам. Наконец, мы подключаем входные клеммы для двигателя к выходным разъемам PWM Arduino, что позволяет нам точно определять вращательные и поступательные аспекты движения.

Рекомендуемые: