Слежение за объектом по его цвету с использованием Aforge.NET
Здравствуйте. В этом посте хочу вам рассказать о своем небольшом проекте по отслеживанию объекта по его цвету. Сейчас это имеет довольно широкую область применения, например те же джойстики от Wii и Playstation 3. Основой для работы послужила разработка Андрея Кириллова Aforge.NET – довольно мощная штука для самопальной обработки изображений.
Код не претендует на «истину в последней инстанции», многое было упрощено (в одном месте, в некотором смысле даже допущено дублирование – для быстрого доступа к пикселам я создал свой класс, хотя аналогичные наработки были и в Aforge). Но тем не менее, код работает, отслеживает объект, выдает информацию о местоположении, позволяет динамически вычислять оттенок объекта (на случай изменения освещения).
Небольшой экскурс в AForge
Фреймворк представляет собой набор библиотек, каждая из которых предназначена для решения определенного рода задач:
- AForge.Imaging – библиотека с фильтрам и расчетами для обработки изображений;
- AForge.Vision – библиотека машинного зрения;
- AForge.Neuro – библиотека для работы с нейронными сетями;
- AForge.Genetic – библиотека для работы с генетическими алгоритмами;
- 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() – сбрасывает содержимое класса.
Свойства:
-
AForge.Vision.Motion.IMotionDetector.MotionFrame – свойство типа AForge.Imaging.UnmanagedImage, которое отвечает за подсветку региона с объектом.
-
AForge.Vision.Motion.IMotionDetector.MotionLevel – «уровень движения» (от 0 до 1) – эфимерная величина. Не имплементировал.
Для обновления информации в строке состояния приложения, добавлены Get Properties:
-
Point Center
-
Rectangle BoundsBox
-
Color ObjectColor
Для того, чтобы использовалось не только целевой цвет, но и некоторые оттенки, используется Set Property DifferenceThreshold.
Основная обработка кадра происходит в функции ProcessFrame. Алгоритм можно разделить на такие шаги:
-
Расширение региона присутствия объекта. Новое положение будем искать не по всему экрану, а лишь в области, смежной с предыдущим положением. Это делает поиск точнее с той точки зрения, что целевой объект не будет перепутан с другим объектом такого же цвета (в другой части изображения).
-
Вычисление границ объекта в вышеописанной области через определение крайних точек того цвета, который является доминирующим для объекта (здесь также учитывается возможное цветовое отклонение — DifferenceThreshold).
-
Создание «маски» MotionFrame, которая позволит MotionDetector-у подсветить целевой объект на изображении.
-
Далее вычисляется «средний цвет» и размер нового объекта.
-
Если объект слишком мал (например, на следующем кадре наш целевой объект полностью был закрыт другим объектом) – мы не меняем информации о положении и цвете, которые остались в наследство от обработки предыдущего кадра.
-
Иначе – запоминается новое положение и границы объекта, и, если алгоритм следит за изменением цвета, что устанавливается с помощью свойства bool DynamicColorTracking, то также запоминается и новый вычисленный цвет.
На этом обработка изображения заканчиваетcя.
Возможные улучшения
Так как уже говорилось о контроллерах к игровым приставкам, то их цвет обычно контрастно отличается от любых других объектов в кадре. Поэтому можно сделать первичный поиск целевого цвета по всему кадру (а не только по смежной области). Это позволит отслеживать объект при более быстром движении.
Полезные ссылки по теме
P.S. Ссылка на исходник на depositfiles, ссылка на исходник в Google Docs.