Слежение за объектом. Слежение за объектом на карте

24 июня 2010 в 16:33

Слежение за объектом по его цвету с использованием Aforge.NET

  • .NET

Здравствуйте. Частая фраза: «мой первый пост»:). В нем хочу вам рассказать о своем небольшом проекте по отслеживанию объекта по его цвету. Сейчас это имеет довольно широкую область применения, например те же джойстики от Wii и Playstation 3. Основой для работы послужила разработка Андрея Кириллова Aforge.NET – довольно мощная штука для самопальной обработки изображений.
Код не претендует на «истину в последней инстанции», многое было упрощено (в одном месте, в некотором смысле даже допущено дублирование – для быстрого доступа к пикселам я создал свой класс, хотя аналогичные наработки были и в Aforge). Но тем не менее, код работает, отслеживает объект, выдает информацию о местоположении, позволяет динамически вычислять оттенок объекта (на случай изменения освещения).

Для заинтересовавшихся - прошу под кат.

Небольшой экскурс в AForge.

Фреймворк представляет собой набор библиотек, каждая из которых предназначена для решения определенного рода задач:
  • AForge.Imaging – библиотека с фильтрам и расчетами для обработки изображений;
  • AForge.Vision – библиотека машинного зрения;
  • AForge.Neuro – библиотека для работы с нейронными сетями;
  • AForge.Geneti c – библиотека для работы с генетическими алгоритмами;
  • AForge.Fuzzy – библиотека нечетких вычислений;
  • AForge.MachineLearning – библиотека для машинного обучения;
  • AForge.Robotics – библиотека, предоставляющая подержу некоторых Robotics kits;
  • AForge.Video – набор библиотек для обработки видео.
В комплекте с библиотеками идет набор примеров.

Пользовательский интерфейс

Свой проект я не писал с нуля, за основу взял пример Vision\MotionDetector. Он уже умеет подключаться к веб камере, удаленной веб камере (через JPEG, MJPEG url), а так же открывать определенные видео файлы (с чем, признаюсь, не экспериментировал):

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

После чего выбрать объект через Define color tracking object форму:

Информация о объекте будет отображаться в статус баре главной формы:

Как дополнительная настройка предусмотрен color difference threshold – возможность не отслеживать единый цвет, а учитывать его вариации:

Также дополнительно пользователь может указать, хочет ли он, чтобы цвет объекта также отслеживался во время обработки (то есть не только сам объект отслеживается по цвету, но и новый цвет объекта вычисляется в процессе обработки):

Следующая плюшка идет в стандартной поставке от Aforge Motion Detector. Объект можно по разному подсвечивать на изображении:

Имплементация

AForge.Vision.Motion.IMotionDetector – интерфейс, позволяющий искать разницу между изображениями. От него унаследован ColorDetection класс, выполняющий обработку.
Для взаимодействия с интерфейсом пользователя был добавлен метод Initialize (Image image, Rectangle rect), который инициализирует процесс обработки последующих кадров. Здесь происходит сбор информации о целевом объекте (выделенным прямоугольником на изображении). Собирается информация о доминирующем цвете в избранной области (это свойство и будет в дальнейшем служить основой для слежения). Также запоминается позиция целевого объекта.

IMotionDetector имеет следующие методы:

  • ProcessFrame (AForge.Imaging.UnmanagedImage) – передает в объект следующий кадр, полученный от устройства захвата изображений. Следующий кадр – объект типа AForge.Imaging.UnmanagedImage, класса, позволяющего подступаться к пикселам намного быстрее, чем Bitmap.GetPixel(x,y) .
  • Reset () – сбрасывает содержимое класса.
Свойства:
  • MotionFrame – свойство типа AForge.Imaging.UnmanagedImage , которое отвечает за подсветку региона с объектом.
  • AForge.Vision.Motion.IMotionDetector.MotionLevel – «уровень движения» (от 0 до 1) – эфимерная величина. Не имплементировал.
Для обновления информации в строке состояния приложения, добавлены Get Properties:
  • Point Center
  • Rectangle BoundsBox
  • Color ObjectColor
Для того, чтобы использовалось не только целевой цвет, но и некоторые оттенки, используется Set Property DifferenceThreshold .
Основная обработка кадра происходит в функции ProcessFrame . Алгоритм можно разделить на такие шаги:
  1. Расширение региона присутствия объекта. Новое положение будем искать не по всему экрану, а лишь в области, смежной с предыдущим положением. Это делает поиск точнее с той точки зрения, что целевой объект не будет перепутан с другим объектом такого же цвета (в другой части изображения).
  2. Вычисление границ объекта в вышеописанной области через определение крайних точек того цвета, который является доминирующим для объекта (здесь также учитывается возможное цветовое отклонение - DifferenceThreshold).
  3. Создание «маски» MotionFrame , которая позволит MotionDetector-у подсветить целевой объект на изображении.
  4. Далее вычисляется «средний цвет» и размер нового объекта.
  5. Если объект слишком мал (например, на следующем кадре наш целевой объект полностью был закрыт другим объектом) – мы не меняем информации о положении и цвете, которые остались в наследство от обработки предыдущего кадра.
  6. Иначе – запоминается новое положение и границы объекта, и, если алгоритм следит за изменением цвета, что устанавливается с помощью свойства bool DynamicColorTracking, то также запоминается и новый вычисленный цвет.
На этом обработка изображения заканчиваетcя.

Возможные улучшения

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

Два года назад, когда я только начал заниматься мультикоптерами, мне пришлось сделать небольшой . Поскольку квадрокоптер задумывался сугубо автономным, все что требовалось от этого пульта - это управлять беспилотником во время испытаний и настройки.

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

  1. Батарейки в корпус никак не влазили, поэтому приходилось их приматывать к корпусу изолентой:)
  2. Настройка параметров была вынесена на четыре потенциометра, которые оказались очень чувствительными к температуре. В помещении настраиваешь одни значения, выходишь на улицу - а они уже другие, уплыли.
  3. У Arduino Nano, которую я использовал в пульте, есть всего 8 аналоговых входов. Четыре были заняты настроечными потенциометрами. Один потенциометр служил газом. Два входа были подключены к джойстику. Оставался свободен только один выход, а параметров для настройки гораздо больше.
  4. Единственный джойстик был вовсе не пилотным. Управление газом с помощью потенциометра тоже весьма угнетало.
  5. А еще пульт не издавал никаких звуков, что иногда бывает крайне полезно.

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

  • Сделать большой корпус, чтобы в него можно было запихнуть все что хочется сейчас (включая батарейки), и что захочется позже.
  • Как-то решить проблему с настройками, не за счет увеличения числа потенциометров. Плюс, добавить возможность сохранения параметров в пульте.
  • Сделать два джойстика, как на нормальных пилотных пультах. Ну и сами джойстики поставить православные.

Новый корпус

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

Элементы управления и меню

Чтобы управлять кучей параметров, нужно либо разместить на пульте кучу потенциометров и добавить АЦП, либо делать все настройки через меню. Как я уже говорил, настройка потенциометрами не всегда хорошая идея, но и отказываться от нее не стоит. Так что, решено было оставить в пульте четыре потенциометра, и добавить полноценное меню.

Чтобы перемешаться по меню, и менять параметры обычно используют кнопки. Влево, вправо, вверх, вниз. Но мне захотелось использовать вместо кнопок энкодер. Эту идею я подсмотрел у контроллера 3D-принтера.


Разумеется, за счет добавления меню, код пульта распух в несколько раз. Для начала я добавил всего три пункта меню: "Telemetry", "Parameters" и "Store params". В первом окне отображается до восьми разных показателей. Пока я использую только три: заряд батареи, компас и высота.

Во втором окне доступны шесть параметров: коэффициенты PID регулятора для осей X/Y,Z и корректировочные углы акселерометра.

Третий пункт позволяет сохранять параметры в EEPROM.

Джойстики

Над выбором пилотных джойстиков я долго не размышлял. Так получилось, что первый джойстик Turnigy 9XR я добыл у коллеги по квадрокоптерному делу - Александра Васильева, хозяина небезызвестного сайта alex-exe.ru . Второй такой же заказал напрямую на Hobbyking.


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

Питание

В старом пульте я использовал простой регулятор напряжения LM7805, который кормил связкой из 8 батареек AA. Жутко неэффективный вариант, при котором 7 вольт уходили на нагрев регулятора. 8 батареек - потому что под рукой был только такой отсек, а LM7805 - потому что в то время этот вариант мне представлялся самым простым, и главное быстрым.

Теперь же я решил поступить мудрее, и поставил достаточной эффективный регулятор на LM2596S. А вместо 8-ми AA батареек, установил отсек на два LiIon аккумулятора 18650.


Результат

Собрав все воедино, получился вот такой аппарат. Вид изнутри.


А вот с закрытой крышкой.


Не хватает колпачка на одном потенциометре и колпачков на джойстиках.

Наконец, видеоролик о том, как происходит настройка параметров через меню.


Итог

Физически пульт собран. Сейчас я занимаюсь тем, что дорабатываю код пульта и квадрокоптера, чтобы вернуть им былую крепкую дружбу.

По ходу настройки пульта, были выявлены недостатки. Во-первых, нижние углы пульта упираются в руки:(Наверное я немного перепроектирую пластины, сглажу углы. Во-вторых, даже дисплея 16х4 не хватает для красивого вывода телеметрии - приходится названия параметров сокращать до двух букв. В следующей версии девайса установлю точечный дисплей, либо сразу TFT матрицу.

Глава 15: Работа с Ограничителями

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

Иногда Вам необходимо "ограничить" движение объекта или заставить его "следить" за другими объектами сцены. В этом учебнике мы рассмотрим один из Ограничителей, с помощью которого можно заставить камеру следить за объектом. Этот ограничитель называется "Track To ". Ограничители слежения используются в анимации и позволяют сэкономить много времени.

Давайте рассмотрим как работает ограничитель "Track To " на примере. Добавьте в сцену объект, за которым будет следить камера. Перейдите к его кнопкам редактирования (F9 ). Для дальней работы вам необходимо знать имя этого объекта. Вызовите информационное окошко с помощью кнопки "N ", измените имя объекта на Actor для удобства.

Теперь выберите камеру, перейдите к кнопкам Объекта (F7 ). Найдите здесь вкладку Constraints , нажмите в ней кнопку Add Constraint и выберите из списка ограничителей "Track To ". В панели опций Track To , найдите поле Target OB: Впишите в него имя нашего объекта, то есть Actor . После этого меду объектом и камерой появится пунктирная линия, обозначающая слежение камеры за объектом. Если Вы сейчас посмотрите в камеру - перед вами встанет одна проблема - Камера не видит объект! Чтобы решить эту проблему, нажмите кнопку To: -Z , а также Up: Y в панели Constraints . Вот и все! Теперь куда бы вы не передвигали объект - он всегда будет виден из камеры. Есть другой способ создания слежения камеры за объектом. Выберите камеру, затем объект и нажмите Ctrl T , в появившемся меню выберите тип "Track To Constraint ".

Опции панели Constraints:

To: X,Y или Z и -X,-Y или -Z - оси, по которым происходит слежение. Обычно необходимо выбрать ось -Z

Influence - Степень слежения. Чем меньше значение этого поля, тем слабее слежение камеры за объектом.

Target - имя объекта слежения

Up - направление слежения обычно используется "Y"

Иногда в анимации используется прием слежения камеры за объектом Пустышкой. Это позволяет более динамически управлять фокусом камеры. Например Вы можете следить за объектом (возле которого находится пустышка), а затем изменить фокус (переместить пустышку). Так же поэкспериментируйте с параметром Influence .

Чтобы увидеть местоположение объекта на карте, достаточно кликнуть левой кнопкой мыши на названии объекта в списке. Карта будет центрирована по указанному объекту. При этом масштаб карты останется прежним. Перемещайтесь по карте и масштабируйте ее, как Вам удобно. Способы обращения с картой подробно описаны в разделе Карта.

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

Однако, если в настройках пользователя установлен флаг «Показывать иконки объектов по краям карты», то в случае выхода какого-то объекта за пределы видимой области карты, его иконка будет отображаться на краю карты. Тогда достаточно щелкнуть по ней, чтобы карта была центрирована по данному объекту.

Чтобы не терять текущее местоположение объекта на карте, поставьте также флажок в графе «Следить за объектом» . Объекты, отмеченные флажками в этой графе, видны на карте всегда. По приходу нового сообщения от таких объектов, карта автоматически центрируется так, чтобы эти объекты были видны.

Еще в данном разделе:

-



Поделиться