1. Главная страница » Компьютеры » Opencv слежение за объектом

Opencv слежение за объектом

Автор: | 16.12.2019

Содержание

Все животные, включая людей, очень любят следить за движущимися объектами. Этот встроенный в живых существ механизм, позволяет им не терять вещь из виду и позиционировать её в пространстве. Этот проект посвящен созданию робота-наблюдателя, который при помощи OpenCV будет следить за теннисным мячиком.

Итак, за каким объектом будет следить робот? По началу, в качестве такого объекта я выбрал обычный теннисный шарик. Шарик этот имеет классический ярко-зеленый цвет, и теоретически должен был легко выделяться из явно не зеленого окружения. Однако, в дальнейшем пришлось заменить большой зеленый шар на маленький оранжевый шарик для пинг-понга. Причина замены будет описана ниже.

В проекте были использованы два самых простых сервомотора sg90, драйвер сервомоторов Pololu и вебкамера Microsoft LifeCam HD 3000.

Программа для детектирования окружности

Писать программу было решено на языке python. Алгоритм работы python-скрипта для распознавания состоит из шести основных шагов:

  • преобразование кадра в формат HSV;
  • фильтрация в заданном диапазоне HSV;
  • морфологическое преобразование;
  • размывание;
  • детектирование окружностей;
  • передача управляющих сигналов на сервоприводы.

Преобразование в HSV

Здесь всё просто. Даем изображение с веб-камеры, получаем — конвертированное в HSV изображение. Почему HSV? Потому что в HSV проще создать правильную маску для выделения нужного цвета.

Фильтрация по цвету

Очень важный шаг. Функция inRange преобразует цветную картинку в черно-белую маску. В этой маске, все пиксели, попадающие в заданный диапазон — становятся белыми. Прочие — черными. Результат работы inRange представлен на второй картинке.

Морфологическое преобразование

Данная процедура нужна для того, чтобы убрать из кадра мелкий мусор и замазать возможные дефекты в выделяемом объекте. Например, морфологическое преобразование позволяет убрать из теннисного шарика прожилку, которая имеет отличный цвет. Либо, как в моем случае, можно убрать надпись и засвеченные участки шарика.

Размывание

Банальное размывание методом Гаусса. Как и предыдущая процедура, размывание необходимо для сглаживания шероховатостей.

Детектирование окружностей

Собственно, само детектирование. Процедура HoughCircles находит на изображении все окружности, используя при этом преобразование Хофа. Важными параметрами здесь являются:

  • mcr — минимальное расстояние между окружностями (h/4);
  • cet1 и cet2 — параметры оператора Кэнни, используемого для построения границ объекта (80 и 50);
  • mcs, xcs — минимальный и максимальный радиус окружностей (5 и 0).

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

Также в углу кадра отображается время между двумя кадрами.

Результат:

На последнем шаге, на основе координат обнаруженной окружности, рассчитываются углы поворота сервоприводов.

Полный код программы детектирования окружности

Программа для управления сервомоторами на Python

В представленной выше программе класс Servo отвечает за передачу управляющих команд для сервомоторов в специальный драйвер фирмы Pololu. Полный код класса:

Проблемы

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

Камера

Изначально, я хотел использовать старенькую 300-килопиксельную веб-камеру. Я даже вытащил её из родного корпуса и прикрутил к монтировке (см. предыдущий пост). Однако, после попытки провести распознавание, меня ждало разочарование. Цвета изображения были каким-то блеклыми, и зеленый шарик выглядел совсем не зеленым. Никак не получалось подобрать маску для отделения этого шарик от фона. Кроме того, изрядно тормозил видеопоток, вероятно из-за встроенного алгоритма автоматический экспозиции, который старался высветлить темную картинку.

Ввиду такого безобразия, я решил заменить камеру на что-то более качественное и настраиваемое. Посмотрев различные ролики на ютубе, мой выбор пал на доступную Microsoft LifeCam HD 3000. Подключив эту камеру к роботу, я снова немного разочаровался 🙁 Опять тормоза и непонятная цветопередача. Благо, отключение автоматической экспозиций решило проблему с тормозами, а отключение TrueColor и авто-баланса белого — немного стабилизировало цветопередачу.

Инфракрасное излучение

Несмотря на новую камеру, мне по-прежнему долго не удавалось настроить маску для выделения нужного цвета. Лишь спустя множество попыток, я понял что камера видит этот мир совсем не так как я. Смотря на оранжевый шарик, я вижу оранжевый шарик. Когда на этот же шарик смотрит веб-камера — она видит чертовски яркий оранжевый шарик. Такой яркий, что он уже не оранжевый, а желтый. Как это обычно со мной бывает, причина явления лежала на поверхности. Дело в том, что матрица камеры очень хорошо чувствует ближнее инфракрасное излучение (Near-infrared). Эти ИК лучи в больших количествах излучаются галогеновыми (и не только) лампами и солнцем.

Как показала практика, настройка цветовой маски в условиях ИК засветки является весьма непростой задачей. Решением здесь может стать ИК фильтр, который устанавливается в хороших фотоаппаратах для обеспечения адекватной цветопередачи. Но проблему можно попытаться решить и немного иначе, хоть и не так качественно как с фильтром. Для выделения засвеченного шарика я попробовал применить сразу два фильтра. Один — для засвеченного участка шарика, другой — для затененного. Получилось сносно, но наверняка есть и другие варианты.

Настройка цветовой маски

Как уже говорилось, для каждого объекта требуется специально настраивать цветовую маску (даже две). Для настройки этой маски, а именно параметров h_min, h_max функции inRange пришлось сделать отдельное приложение с кучей бегунков. Чтобы выделить нужный цвет необходимо подобрать границы компонента H (Hue). Параметр S (Saturation) отвечает за насыщенность цвета. Например, кожа человека имеет оранжево-желтый цвет (H) как у шарика, но слабую насыщенность. Наконец V (Value) определяет яркость цвета. Затененный шарик будет иметь низкое значение V.

Для моего оранжевого шарика я подобрал такие маски:

светлый шарик — (20, 70, 170) — (40, 170, 255)
темный шарик — (0, 170, 120) — (20, 240, 255)

Несмотря на возникшие трудности, робот-наблюдатель всё-таки ожил. Следующий этап — установка ИК фильтра и распознавание лиц. Небольшое видео представлено ниже.

  • Установка Raspbian с помощью NOOBS.
  • Главная
  • Уроки
  • Установка Raspbian с помощью NOOBS.

Автоматическое отслеживание объекта на Python

В предыдущем уроке мы рассмотрели, как управлять сервоприводами Поворота / Наклона для размещения PiCam. Теперь мы будем использовать наше устройство, чтобы помочь камере автоматически отслеживать цветные объекты, как вы можете видеть ниже:

Это мой первый опыт работы с OpenCV, и я должен признаться, я влюблен в эту фантастическую «библиотеку компьютерного зрения с открытым исходным кодом».

OpenCV бесплатный для академического и коммерческого использования. Он имеет интерфейсы C ++, C, Python и Java и поддерживает Windows, Linux, Mac OS, iOS и Android. В моей серии обучающих программ OpenCV мы сосредоточимся на Raspberry Pi (так, Raspbian как OS) и Python. OpenCV был разработан для вычислительной эффективности и с большим вниманием к приложениям реального времени. Таким образом, он идеально подходит для физических вычислений!

Шаг 1: Список деталей проекта

  1. Raspberry Pi V3 — US$ 32.00 / Raspberry Pi V3 — US$ 36.99
  2. 5 Megapixels 1080p Sensor OV5647 Mini Camera Video Module — US$ 13.00 / 5 Megapixels 1080p Sensor OV5647 Mini Camera Video Module — US$ 6.40
  3. TowerPro SG90 9G 180 degrees Micro Servo (2 X)- US$ 4.00 / TowerPro SG90 9G 180 degrees Micro Servo (2 X)- US$ 2.45
  4. Mini Pan/Tilt Camera Platform Anti-Vibration Camera Mount w/ 2 Servos (*) — US$ 8.00 / Mini Pan/Tilt Camera Platform Anti-Vibration Camera Mount w/ 2 Servos (*) — US$ 5.89
  5. Красный Светодиод
  6. Резистор 220 Ом
  7. Резистор 1 кОм (2) — Опционально
  8. Прочее: металлические детали, ленты и т. Д. (В случае, если вы создадите механизм Поворота / Наклона
Читайте также:  Final fantasy xii the zodiac age прохождение

(*) вы можете купить полную платформу Поворота / Наклона с сервоприводами или построить свой собственный.

Шаг 2: Установка пакета OpenCV 3

Я использую Raspberry Pi V3, обновленный до последней версии Raspbian (Stretch), поэтому лучший способ установить OpenCV — следовать отличному учебному пособию, разработанному Адрианом Розброком: Raspbian Stretch: Установка OpenCV 3 + Python на Raspberry Pi V3.

Я попробовал несколько разных руководств по установке OpenCV на моем Pi. Учебник Адриана — лучший. Я советую вам сделать то же самое, следуя его указаниям шаг за шагом.

После того, как вы закончите установку по учебнику Адриана, у Вас должна быть виртуальная среда OpenCV, готовая запускать наш эксперимент на Raspberry Pi.

Перейдем к нашей виртуальной среде и убедитесь, что OpenCV 3 правильно установлен.

Адриан рекомендует запускать команду «источник» каждый раз, когда вы открываете новый терминал, чтобы обеспечить правильную настройку системных переменных.

Затем перейдем к нашей виртуальной среде:

Если вы видите текст (cv), предшествующий вашему запросу, то вы находитесь в виртуальной среде cv:

Адриан обращает внимание, что виртуальная среда cv Python полностью независима и секвестрирована из стандартной версии Python, включенной в загрузку Raspbian Stretch. Таким образом, любые пакеты Python в каталоге глобальных пакетов сайтов не будут доступны для виртуальной среды cv. Аналогично, любые пакеты Python, установленные в сайтах-пакетах cv, не будут доступны для глобальной установки Python.

Теперь введите интерпретатор Python:

и убедитесь, что вы используете версию 3.5 (или выше)

Внутри интерпретатора (появится «>>>») импортируйте библиотеку OpenCV:

Если сообщений об ошибках не выходят, значит OpenCV правильно установлен на ВАШЕЙ PYTHON ВИРТУАЛЬНОЙ СРЕДЕ.

Вы также можете проверить какая версия OpenCV установлена:

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

Шаг 3: Тестирование Вашей Камеры

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

Я предполагаю, что у вас есть PiCam, уже установленный на вашем Raspberry Pi.

Введите ниже код Python в вашу среду IDE:

Вышеприведенный код будет захватывать видеопоток, который будет создан вашим PiCam, и отображать его как в цвете BGR, так и в режиме Gray.

Обратите внимание, что я повернул камеру по вертикали из-за того, что она собрана. Если это не ваше дело, прокомментируйте или удалите командную строку «flip».

Вы также можете загрузить код из GitHub: simpleCamTest.py

Для выполнения введите команду:

Чтобы завершить программу, вы должны нажать клавишу [q] tor [Ctrl] + [C] на клавиатуре

На рисунке показан результат.

Чтобы узнать больше о OpenCV, вы можете изучить за учебник: -video-python-opencv-tutorial

Шаг 4: Обнаружение цвета в Python с OpenCV

Одна вещь, которую мы попытаемся выполнить, будет — обнаружение и отслеживание определенного цветового объекта. Для этого нам нужно понять немного больше о том, как OpenCV интерпретирует цвета.

Анри Данг написал отличный учебник по распознаванию цвета в Python с OpenCV.

Обычно наша камера будет работать с цветовым режимом RGB, что можно понять, думая об этом как о всех возможных цветах, которые могут быть сделаны из трех цветных огней красного, зеленого и синего. Мы будем работать здесь с BGR (синий, зеленый, красный).

Как описано выше, с BGR пиксель представлен тремя параметрами: синим, зеленым и красным. Каждый параметр обычно имеет значение от 0 до 255 (или от 0 до FF в шестнадцатеричном формате). Например, чистый синий пиксель на экране вашего компьютера будет иметь значение B 255, значение G 0 и значение R 0.

OpenCV работает с цветовой моделью HSV (Hue, Saturation, Value), что является альтернативным представлением цветовой модели RGB, разработанной в 1970-х годах исследователями компьютерной графики, чтобы в большей степени соответствовать тому, как человеческое видение воспринимает цветовые атрибуты:

Отлично. Итак, если вы хотите отслеживать определенный цвет с помощью OpenCV, Вы должны определить его с помощью модели HSV.

Предположим, что я должен отследить желтый объект, как пластиковый кубик, показанный выше картинки. Легкость в том, чтобы найти его элементы BGR. Вы можете использовать любую конструкторскую программу для ее поиска (я использовал PowerPoint). В моем случае я обнаружил:

Затем мы должны преобразовать модель BGR (71, 234, 213) в модель HSV, которая будет определена с верхними и нижними границами диапазона. Для этого давайте запустим следующий код:

Вы также можете скачать код из GitHub: bgr_hsv_converter.py

Для выполнения введите команду ниже, имеющую в качестве параметров значения BGR, найденные ранее:

Программа напечатает верхнюю и нижнюю границы цвета нашего объекта.

Терминал PrintScreen покажет результат.

Последнее, но не финал, давайте посмотрим, как OpenCV может «mask» наш объект, как только мы определили его цвет:

Вы также можете загрузить код из GitHub: colorDetection.py

Для выполнения введите следующую команду, имеющую в вашем каталоге фотографию с вашим целевым объектом (в моем случае: yellow_object.JPG):

На приведенном выше рисунке будет отображаться исходное изображение («image») и как будет отображаться объект («mask») после применения маски.

Шаг 5: Отслеживание движения объекта

Теперь, когда мы знаем, как «выбрать» наш объект с помощью маски, давайте проследим его движение в реальном времени с помощью камеры. Для этого я написал код на основе Adrian Rosebrock’s Ball Tracking with OpenCV.

Я настоятельно рекомендую вам подробно прочитать учебник Адриана.

Сначала проверьте, установлена ли библиотека imutils. Это коллекция удобных функций OpenCV от Adrian, чтобы сделать несколько основных задач (например, изменение размера или переворот-экрана) намного проще. Если библиотека не установлена, введите команду ниже, чтобы установить библиотеку в среду Virtual Python:

Затем загрузите код ball_tracking.py из GitHub и выполните его с помощью команды:

В результате вы увидите нечто похожее на gif ниже:

В принципе, это тот же код, что и Adrian’s, если только «вертикальный вертикальный поворот», который я получил со строчкой:

Также обратите внимание, что использовались границы маски, которые мы получили на предыдущем шаге.

Шаг 6: Тестирование GPIO

Теперь, когда мы поиграли с основами OpenCV, давайте установим светодиод на наш RPi и начнем взаимодействовать с нашими GPIO.

Следуйте приведенной выше электрической схеме: катод светодиода будет подключен к GPIO 21 и анод к GND через 220-омный резистор.

Давайте проверим наш светодиод внутри нашей виртуальной среды Python.

Помните, что возможно, что RPi. GPIO не установлен в вашей виртуальной среде Python! Чтобы устранить эту проблему, как только вы зашли (не забудьте подтвердить, что (cv) находится в вашем терминале), вам нужно использовать pip для его установки в вашу виртуальную среду:

Давайте используем скрипт python для выполнения простого теста:

Этот код будет принимать в качестве аргумента номер GPIO и частоту в секундах, которые должен мигать нашим светодиодом. Светодиод будет мигать 5 раз, и программа будет прекращена. Обратите внимание: перед завершением мы освободим GPIO.

Итак, чтобы выполнить скрипт, вы должны ввести параметры, светодиод GPIO и частоту.

Вышеуказанная команда будет мигать 5 раз красным светодиодом, подключенным к «GPIO 21» через каждые «1» секунд.

Файл GPIO_LED_test.py можно загрузить с GitHub.

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

Теперь давайте работать с OpenCV и некоторыми базовыми материалами GPIO.

Шаг 7: Распознавание цветов и взаимодействие с GPIO

Давайте начнем интегрировать наш код OpenCV для взаимодействия с GPIO. Мы начнем с последнего вариант кода OpenCV, мы будем интегрировать в него библиотеку GPIO-RPI, поэтому мы запускаем красный светодиод в то время, когда наш цветной объект будет найден камерой. Код, используемый на этом шаге, был основан на большом учебнике Эдриана OpenCV, RPi.GPIO и GPIO Zero на Raspberry Pi:

Первое, что нужно сделать, это «создать» наш светодиод, подключив его к конкретному GPIO:

Во-вторых, мы должны инициализировать наш светодиод (выключен):

Теперь внутри цикла, где «круг» создается при обнаружении объекта, мы включаем светодиод:

Давайте загрузим полный код из GitHub: object_detection_LED.py

Запустите код с помощью команды:

Читайте также:  Harman kardon onyx studio 5 отзывы

Вот результат. Обратите внимание, что светодиод (левый нижний угол) горит каждый раз, когда объект обнаружен:

Попробуйте использовать разные объекты (цвет и формат). Вы увидите, что как только цвет будет соответствовать границам маски, светодиод будет включен.

Видео, приведенное ниже, показывает некоторые варианты. Обратите внимание, что будут обнаружены только желтые объекты, которые остаются внутри цветового диапазона, включив светодиод. Объекты с иными цветами игнорируются.

Мы используем только светодиод здесь, как объяснено на последнем шаге. У меня был уже собрана поворотно / наклонная площадка, когда я сделал видео, так что игнорировать его. В следующем шаге мы будем работать с механизмом Поворота / Наклона.

Шаг 8: Механизм Поворота / Наклона

Теперь, когда мы поэкспериментировали с основами OpenCV и GPIO, давайте установим наш механизм Поворота / Наклона.

Сервоприводы должны быть подключены к внешнему источнику питания 5 В, имеющему свой Контакт данных (в моем случае, их желтая проводка) подключаться к Raspberry Pi GPIO, как показано ниже:

  • GPIO 17 ==> Tilt Servo
  • GPIO 27 ==> Pan Servo

Не забудьте соединить GND вместе ==> Raspberry Pi — Серводвигатели — внешний источник питания)

Опционально у вас может быть, резистор 1 кОм, между Raspberry Pi GPIO и выводом ввода данных сервера. Это защитит ваш RPi в случае проблемы с сервомеханизмом.

Давайте также воспользуемся возможностью и протестируем наши сервомоторы внутри нашей виртуальной среды Python.

Давайте используем скрипт Python для выполнения некоторых тестов с нашими драйверами:

Ядром приведенного выше кода является функция setServoAngle (servo, angle). Эта функция принимает в качестве аргументов, номер GPIO сервопривода и значение угла, в котором должен быть установлен сервопривод. Когда вход этой функции является «углом», мы должны преобразовать его в эквивалентный рабочий цикл.

Чтобы выполнить сценарий, вы должны ввести в качестве параметров, сервопривод GPIO и angle.

Вышеуказанная команда будет позиционировать сервопривод, подключенный к GPIO 17 («наклон») с 45 градусами в «высоте». Аналогичную команду можно использовать для управления поворотного привода (положение до 45 градусов в «азимуте»:

Файл angleServoCtrl.py можно загрузить с GitHub.

Шаг 9: Поиск позиции объекта в реальном времени

Идея здесь состоит в том, чтобы поместить объект в середину экрана с помощью механизма Поворота / Наклона. Плохая новость заключается в том, что для начала мы должны знать, где объект находится в реальном времени. Но хорошая новость в том, что это очень легко, как только мы узнаем координаты центра объекта.

Во-первых, давайте возьмем использованный ранее код «object_detect_LED» и изменим его, чтобы распечатать координаты x, y основанного объекта.

«Ядро» кода — это часть, где мы находим объект и наносим на него круг с красной точкой в центре.

Давайте будем «экспортировать» координаты центра для функции mapObjectPosition (int (x), int (y)) для печати своих координат. Ниже функция:

Запустив программу, мы увидим на нашем терминале координаты положения (x, y), как показано выше. Переместите объект и наблюдайте за координатами. Мы поймем, что x идет от 0 до 500 (слева направо), а y идет от o до 350 (сверху вниз). См. Приведенные выше снимки.

Отлично! Теперь мы должны использовать эти координаты в качестве отправной точки для нашей системы отслеживания Поворота / Наклона.

Шаг 10: Система отслеживания местоположения объекта

Мы хотим, чтобы наш объект всегда находился на экране. Итак, давайте определим, например, что наш объект будет «центрирован», если:

  • Установка Raspbian с помощью NOOBS.
  • Главная
  • Уроки
  • Установка Raspbian с помощью NOOBS.

Автоматическое отслеживание объекта на Python

В предыдущем уроке мы рассмотрели, как управлять сервоприводами Поворота / Наклона для размещения PiCam. Теперь мы будем использовать наше устройство, чтобы помочь камере автоматически отслеживать цветные объекты, как вы можете видеть ниже:

Это мой первый опыт работы с OpenCV, и я должен признаться, я влюблен в эту фантастическую «библиотеку компьютерного зрения с открытым исходным кодом».

OpenCV бесплатный для академического и коммерческого использования. Он имеет интерфейсы C ++, C, Python и Java и поддерживает Windows, Linux, Mac OS, iOS и Android. В моей серии обучающих программ OpenCV мы сосредоточимся на Raspberry Pi (так, Raspbian как OS) и Python. OpenCV был разработан для вычислительной эффективности и с большим вниманием к приложениям реального времени. Таким образом, он идеально подходит для физических вычислений!

Шаг 1: Список деталей проекта

  1. Raspberry Pi V3 — US$ 32.00 / Raspberry Pi V3 — US$ 36.99
  2. 5 Megapixels 1080p Sensor OV5647 Mini Camera Video Module — US$ 13.00 / 5 Megapixels 1080p Sensor OV5647 Mini Camera Video Module — US$ 6.40
  3. TowerPro SG90 9G 180 degrees Micro Servo (2 X)- US$ 4.00 / TowerPro SG90 9G 180 degrees Micro Servo (2 X)- US$ 2.45
  4. Mini Pan/Tilt Camera Platform Anti-Vibration Camera Mount w/ 2 Servos (*) — US$ 8.00 / Mini Pan/Tilt Camera Platform Anti-Vibration Camera Mount w/ 2 Servos (*) — US$ 5.89
  5. Красный Светодиод
  6. Резистор 220 Ом
  7. Резистор 1 кОм (2) — Опционально
  8. Прочее: металлические детали, ленты и т. Д. (В случае, если вы создадите механизм Поворота / Наклона

(*) вы можете купить полную платформу Поворота / Наклона с сервоприводами или построить свой собственный.

Шаг 2: Установка пакета OpenCV 3

Я использую Raspberry Pi V3, обновленный до последней версии Raspbian (Stretch), поэтому лучший способ установить OpenCV — следовать отличному учебному пособию, разработанному Адрианом Розброком: Raspbian Stretch: Установка OpenCV 3 + Python на Raspberry Pi V3.

Я попробовал несколько разных руководств по установке OpenCV на моем Pi. Учебник Адриана — лучший. Я советую вам сделать то же самое, следуя его указаниям шаг за шагом.

После того, как вы закончите установку по учебнику Адриана, у Вас должна быть виртуальная среда OpenCV, готовая запускать наш эксперимент на Raspberry Pi.

Перейдем к нашей виртуальной среде и убедитесь, что OpenCV 3 правильно установлен.

Адриан рекомендует запускать команду «источник» каждый раз, когда вы открываете новый терминал, чтобы обеспечить правильную настройку системных переменных.

Затем перейдем к нашей виртуальной среде:

Если вы видите текст (cv), предшествующий вашему запросу, то вы находитесь в виртуальной среде cv:

Адриан обращает внимание, что виртуальная среда cv Python полностью независима и секвестрирована из стандартной версии Python, включенной в загрузку Raspbian Stretch. Таким образом, любые пакеты Python в каталоге глобальных пакетов сайтов не будут доступны для виртуальной среды cv. Аналогично, любые пакеты Python, установленные в сайтах-пакетах cv, не будут доступны для глобальной установки Python.

Теперь введите интерпретатор Python:

и убедитесь, что вы используете версию 3.5 (или выше)

Внутри интерпретатора (появится «>>>») импортируйте библиотеку OpenCV:

Если сообщений об ошибках не выходят, значит OpenCV правильно установлен на ВАШЕЙ PYTHON ВИРТУАЛЬНОЙ СРЕДЕ.

Вы также можете проверить какая версия OpenCV установлена:

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

Шаг 3: Тестирование Вашей Камеры

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

Я предполагаю, что у вас есть PiCam, уже установленный на вашем Raspberry Pi.

Введите ниже код Python в вашу среду IDE:

Вышеприведенный код будет захватывать видеопоток, который будет создан вашим PiCam, и отображать его как в цвете BGR, так и в режиме Gray.

Обратите внимание, что я повернул камеру по вертикали из-за того, что она собрана. Если это не ваше дело, прокомментируйте или удалите командную строку «flip».

Вы также можете загрузить код из GitHub: simpleCamTest.py

Для выполнения введите команду:

Чтобы завершить программу, вы должны нажать клавишу [q] tor [Ctrl] + [C] на клавиатуре

На рисунке показан результат.

Чтобы узнать больше о OpenCV, вы можете изучить за учебник: -video-python-opencv-tutorial

Шаг 4: Обнаружение цвета в Python с OpenCV

Одна вещь, которую мы попытаемся выполнить, будет — обнаружение и отслеживание определенного цветового объекта. Для этого нам нужно понять немного больше о том, как OpenCV интерпретирует цвета.

Анри Данг написал отличный учебник по распознаванию цвета в Python с OpenCV.

Обычно наша камера будет работать с цветовым режимом RGB, что можно понять, думая об этом как о всех возможных цветах, которые могут быть сделаны из трех цветных огней красного, зеленого и синего. Мы будем работать здесь с BGR (синий, зеленый, красный).

Читайте также:  Blu ray или dvd

Как описано выше, с BGR пиксель представлен тремя параметрами: синим, зеленым и красным. Каждый параметр обычно имеет значение от 0 до 255 (или от 0 до FF в шестнадцатеричном формате). Например, чистый синий пиксель на экране вашего компьютера будет иметь значение B 255, значение G 0 и значение R 0.

OpenCV работает с цветовой моделью HSV (Hue, Saturation, Value), что является альтернативным представлением цветовой модели RGB, разработанной в 1970-х годах исследователями компьютерной графики, чтобы в большей степени соответствовать тому, как человеческое видение воспринимает цветовые атрибуты:

Отлично. Итак, если вы хотите отслеживать определенный цвет с помощью OpenCV, Вы должны определить его с помощью модели HSV.

Предположим, что я должен отследить желтый объект, как пластиковый кубик, показанный выше картинки. Легкость в том, чтобы найти его элементы BGR. Вы можете использовать любую конструкторскую программу для ее поиска (я использовал PowerPoint). В моем случае я обнаружил:

Затем мы должны преобразовать модель BGR (71, 234, 213) в модель HSV, которая будет определена с верхними и нижними границами диапазона. Для этого давайте запустим следующий код:

Вы также можете скачать код из GitHub: bgr_hsv_converter.py

Для выполнения введите команду ниже, имеющую в качестве параметров значения BGR, найденные ранее:

Программа напечатает верхнюю и нижнюю границы цвета нашего объекта.

Терминал PrintScreen покажет результат.

Последнее, но не финал, давайте посмотрим, как OpenCV может «mask» наш объект, как только мы определили его цвет:

Вы также можете загрузить код из GitHub: colorDetection.py

Для выполнения введите следующую команду, имеющую в вашем каталоге фотографию с вашим целевым объектом (в моем случае: yellow_object.JPG):

На приведенном выше рисунке будет отображаться исходное изображение («image») и как будет отображаться объект («mask») после применения маски.

Шаг 5: Отслеживание движения объекта

Теперь, когда мы знаем, как «выбрать» наш объект с помощью маски, давайте проследим его движение в реальном времени с помощью камеры. Для этого я написал код на основе Adrian Rosebrock’s Ball Tracking with OpenCV.

Я настоятельно рекомендую вам подробно прочитать учебник Адриана.

Сначала проверьте, установлена ли библиотека imutils. Это коллекция удобных функций OpenCV от Adrian, чтобы сделать несколько основных задач (например, изменение размера или переворот-экрана) намного проще. Если библиотека не установлена, введите команду ниже, чтобы установить библиотеку в среду Virtual Python:

Затем загрузите код ball_tracking.py из GitHub и выполните его с помощью команды:

В результате вы увидите нечто похожее на gif ниже:

В принципе, это тот же код, что и Adrian’s, если только «вертикальный вертикальный поворот», который я получил со строчкой:

Также обратите внимание, что использовались границы маски, которые мы получили на предыдущем шаге.

Шаг 6: Тестирование GPIO

Теперь, когда мы поиграли с основами OpenCV, давайте установим светодиод на наш RPi и начнем взаимодействовать с нашими GPIO.

Следуйте приведенной выше электрической схеме: катод светодиода будет подключен к GPIO 21 и анод к GND через 220-омный резистор.

Давайте проверим наш светодиод внутри нашей виртуальной среды Python.

Помните, что возможно, что RPi. GPIO не установлен в вашей виртуальной среде Python! Чтобы устранить эту проблему, как только вы зашли (не забудьте подтвердить, что (cv) находится в вашем терминале), вам нужно использовать pip для его установки в вашу виртуальную среду:

Давайте используем скрипт python для выполнения простого теста:

Этот код будет принимать в качестве аргумента номер GPIO и частоту в секундах, которые должен мигать нашим светодиодом. Светодиод будет мигать 5 раз, и программа будет прекращена. Обратите внимание: перед завершением мы освободим GPIO.

Итак, чтобы выполнить скрипт, вы должны ввести параметры, светодиод GPIO и частоту.

Вышеуказанная команда будет мигать 5 раз красным светодиодом, подключенным к «GPIO 21» через каждые «1» секунд.

Файл GPIO_LED_test.py можно загрузить с GitHub.

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

Теперь давайте работать с OpenCV и некоторыми базовыми материалами GPIO.

Шаг 7: Распознавание цветов и взаимодействие с GPIO

Давайте начнем интегрировать наш код OpenCV для взаимодействия с GPIO. Мы начнем с последнего вариант кода OpenCV, мы будем интегрировать в него библиотеку GPIO-RPI, поэтому мы запускаем красный светодиод в то время, когда наш цветной объект будет найден камерой. Код, используемый на этом шаге, был основан на большом учебнике Эдриана OpenCV, RPi.GPIO и GPIO Zero на Raspberry Pi:

Первое, что нужно сделать, это «создать» наш светодиод, подключив его к конкретному GPIO:

Во-вторых, мы должны инициализировать наш светодиод (выключен):

Теперь внутри цикла, где «круг» создается при обнаружении объекта, мы включаем светодиод:

Давайте загрузим полный код из GitHub: object_detection_LED.py

Запустите код с помощью команды:

Вот результат. Обратите внимание, что светодиод (левый нижний угол) горит каждый раз, когда объект обнаружен:

Попробуйте использовать разные объекты (цвет и формат). Вы увидите, что как только цвет будет соответствовать границам маски, светодиод будет включен.

Видео, приведенное ниже, показывает некоторые варианты. Обратите внимание, что будут обнаружены только желтые объекты, которые остаются внутри цветового диапазона, включив светодиод. Объекты с иными цветами игнорируются.

Мы используем только светодиод здесь, как объяснено на последнем шаге. У меня был уже собрана поворотно / наклонная площадка, когда я сделал видео, так что игнорировать его. В следующем шаге мы будем работать с механизмом Поворота / Наклона.

Шаг 8: Механизм Поворота / Наклона

Теперь, когда мы поэкспериментировали с основами OpenCV и GPIO, давайте установим наш механизм Поворота / Наклона.

Сервоприводы должны быть подключены к внешнему источнику питания 5 В, имеющему свой Контакт данных (в моем случае, их желтая проводка) подключаться к Raspberry Pi GPIO, как показано ниже:

  • GPIO 17 ==> Tilt Servo
  • GPIO 27 ==> Pan Servo

Не забудьте соединить GND вместе ==> Raspberry Pi — Серводвигатели — внешний источник питания)

Опционально у вас может быть, резистор 1 кОм, между Raspberry Pi GPIO и выводом ввода данных сервера. Это защитит ваш RPi в случае проблемы с сервомеханизмом.

Давайте также воспользуемся возможностью и протестируем наши сервомоторы внутри нашей виртуальной среды Python.

Давайте используем скрипт Python для выполнения некоторых тестов с нашими драйверами:

Ядром приведенного выше кода является функция setServoAngle (servo, angle). Эта функция принимает в качестве аргументов, номер GPIO сервопривода и значение угла, в котором должен быть установлен сервопривод. Когда вход этой функции является «углом», мы должны преобразовать его в эквивалентный рабочий цикл.

Чтобы выполнить сценарий, вы должны ввести в качестве параметров, сервопривод GPIO и angle.

Вышеуказанная команда будет позиционировать сервопривод, подключенный к GPIO 17 («наклон») с 45 градусами в «высоте». Аналогичную команду можно использовать для управления поворотного привода (положение до 45 градусов в «азимуте»:

Файл angleServoCtrl.py можно загрузить с GitHub.

Шаг 9: Поиск позиции объекта в реальном времени

Идея здесь состоит в том, чтобы поместить объект в середину экрана с помощью механизма Поворота / Наклона. Плохая новость заключается в том, что для начала мы должны знать, где объект находится в реальном времени. Но хорошая новость в том, что это очень легко, как только мы узнаем координаты центра объекта.

Во-первых, давайте возьмем использованный ранее код «object_detect_LED» и изменим его, чтобы распечатать координаты x, y основанного объекта.

«Ядро» кода — это часть, где мы находим объект и наносим на него круг с красной точкой в центре.

Давайте будем «экспортировать» координаты центра для функции mapObjectPosition (int (x), int (y)) для печати своих координат. Ниже функция:

Запустив программу, мы увидим на нашем терминале координаты положения (x, y), как показано выше. Переместите объект и наблюдайте за координатами. Мы поймем, что x идет от 0 до 500 (слева направо), а y идет от o до 350 (сверху вниз). См. Приведенные выше снимки.

Отлично! Теперь мы должны использовать эти координаты в качестве отправной точки для нашей системы отслеживания Поворота / Наклона.

Шаг 10: Система отслеживания местоположения объекта

Мы хотим, чтобы наш объект всегда находился на экране. Итак, давайте определим, например, что наш объект будет «центрирован», если:

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

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