Оглавление:
- Шаг 1: НЕОБХОДИМО:
- Шаг 2: ПРИНЦИП РАБОТЫ:
- Шаг 3: ЗАХВАТ И ОБРАБОТКА ВВОДА:
- Шаг 4:
- Шаг 5:
- Шаг 6: ОБРАБОТКА ЧАСТИ:
- Шаг 7:
- Шаг 8:
- Шаг 9:
- Шаг 10:
- Шаг 11:
- Шаг 12: УПРАВЛЕНИЕ ДВИЖЕНИЕМ:
- Шаг 13:
Видео: Gesture Hawk: робот, управляемый жестами руки, с использованием интерфейса на основе обработки изображений: 13 шагов (с изображениями)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:52
Gesture Hawk был представлен в TechEvince 4.0 как простой человеко-машинный интерфейс, основанный на обработке изображений. Его полезность заключается в том, что для управления роботизированной машиной, работающей по принципу дифференциального привода, никаких дополнительных датчиков или носимых устройств, кроме перчаток, не требуется. В этом руководстве мы познакомим вас с принципом работы, лежащим в основе отслеживания объектов и обнаружения жестов, используемых в системе. Исходный код этого проекта можно скачать с Github по ссылке:
Шаг 1: НЕОБХОДИМО:
- Драйвер двигателя L298N
- Двигатели постоянного тока
- Шасси автомобиля-робота
- Ардуино Уно
- LiPo аккумуляторы
- USB-кабель Arduino (длинный)
- Библиотека 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, что позволяет нам точно определять вращательные и поступательные аспекты движения.
Рекомендуемые:
Робот, управляемый жестами с использованием Arduino: 7 шагов
Робот, управляемый жестами, с использованием Arduino: Роботы используются во многих секторах, таких как строительство, военная промышленность, производство, сборка и т. Д. Роботы могут быть автономными или полуавтономными. Автономные роботы не требуют вмешательства человека и могут действовать самостоятельно в зависимости от ситуации. Se
Система распознавания и тушения пожара на основе обработки изображений: 3 шага
Система распознавания и тушения пожара на основе обработки изображений: Здравствуйте, друзья, это система обнаружения и тушения пожара на основе обработки изображений с использованием Arduino
Робот, управляемый жестами на основе IOT: 10 шагов (с изображениями)
Робот, управляемый жестами: робот, управляемый жестами, которым можно управлять из любого места с помощью Интернета. В этом проекте акселерометр MPU 6050 используется для сбора данных о движениях наших рук. Он измеряет ускорение нашей руки за три
Процессор обработки изображений в коде Python GET1033: 5 шагов
GET1033 Python Coded Image Processor: Этот проект посвящен созданию моего собственного процессора изображений, закодированного на Python, для моего модуля GET1033 Exploring Computational Media Literacy. Сначала пользователю нужно будет ввести свою фотографию, а затем выбрать нужные фильтры. Я создал 9 фильтров, которые
Ровер, управляемый жестами, с использованием акселерометра и пары РЧ-передатчик-приемник: 4 шага
Ровер, управляемый жестами, с использованием акселерометра и пары РЧ-передатчик-приемник: Привет! Вы когда-нибудь хотели построить ровер, которым можно было бы управлять простыми жестами рук, но никогда не набраться смелости, чтобы отважиться погрузиться в тонкости обработки изображений и взаимодействия веб-камеры с вашей камерой. микроконтроллер, не говоря уже о подъеме