Здравствуйте. Частая фраза: «мой первый пост» :). В нем хочу вам рассказать о своем небольшом проекте по отслеживанию объекта по его цвету. Сейчас это имеет довольно широкую область применения, например те же джойстики от Wii и Playstation 3. Основой для работы послужила разработка Андрея Кириллова Aforge.NET – довольно мощная штука для самопальной обработки изображений.
Код не претендует на «истину в последней инстанции», многое было упрощено (в одном месте, в некотором смысле даже допущено дублирование – для быстрого доступа к пикселам я создал свой класс, хотя аналогичные наработки были и в Aforge). Но тем не менее, код работает, отслеживает объект, выдает информацию о местоположении, позволяет динамически вычислять оттенок объекта (на случай изменения освещения).
Для заинтересовавшихся — прошу под кат.
Фреймворк представляет собой набор библиотек, каждая из которых предназначена для решения определенного рода задач:
В комплекте с библиотеками идет набор примеров.
Свой проект я не писал с нуля, за основу взял пример Vision\MotionDetector. Он уже умеет подключаться к веб камере, удаленной веб камере (через JPEG, MJPEG url), а так же открывать определенные видео файлы (с чем, признаюсь, не экспериментировал):
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg375.imageshack.us%2Fimg375%2F5395%2Fimage1t.png%22)
Оригинальный пример умеет идентифицировать движение на потоке по нескольким алгоритмам, простейшим из которых является нахождение разницы между двумя последовательными кадрами.
Код формы был обработан напильником, и заточен конкретно под задачу. На вкладке Motion нужно выбрать алгоритм поиска объекта:
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg710.imageshack.us%2Fimg710%2F2408%2Fimage2zd.png%22)
После чего выбрать объект через Define color tracking object форму:
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg63.imageshack.us%2Fimg63%2F9282%2Fimage3bq.png%22)
Информация о объекте будет отображаться в статус баре главной формы:
Как дополнительная настройка предусмотрен color difference threshold – возможность не отслеживать единый цвет, а учитывать его вариации:
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg819.imageshack.us%2Fimg819%2F3656%2Fimage5p.png%22)
Также дополнительно пользователь может указать, хочет ли он, чтобы цвет объекта также отслеживался во время обработки (то есть не только сам объект отслеживается по цвету, но и новый цвет объекта вычисляется в процессе обработки):
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg156.imageshack.us%2Fimg156%2F6403%2Fimage6gt.png%22)
Следующая плюшка идет в стандартной поставке от Aforge Motion Detector. Объект можно по разному подсвечивать на изображении:
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg256.imageshack.us%2Fimg256%2F9784%2Fimage7tg.png%22)
AForge.Vision.Motion.IMotionDetector – интерфейс, позволяющий искать разницу между изображениями. От него унаследован ColorDetection класс, выполняющий обработку.
Для взаимодействия с интерфейсом пользователя был добавлен метод Initialize(Image image, Rectangle rect), который инициализирует процесс обработки последующих кадров. Здесь происходит сбор информации о целевом объекте (выделенным прямоугольником на изображении). Собирается информация о доминирующем цвете в избранной области (это свойство и будет в дальнейшем служить основой для слежения). Также запоминается позиция целевого объекта.
IMotionDetector имеет следующие методы:
Свойства:
Для обновления информации в строке состояния приложения, добавлены Get Properties:
Для того, чтобы использовалось не только целевой цвет, но и некоторые оттенки, используется Set Property DifferenceThreshold.
Основная обработка кадра происходит в функции ProcessFrame. Алгоритм можно разделить на такие шаги:
На этом обработка изображения заканчиваетcя.
Так как уже говорилось о контроллерах к игровым приставкам, то их цвет обычно контрастно отличается от любых других объектов в кадре. Поэтому можно сделать первичный поиск целевого цвета по всему кадру (а не только по смежной области). Это позволит отслеживать объект при более быстром движении.
• Сайт проекта Aforge.
• Aforge – статья на CodeProject.
P.S. Ссылка на исходник на depositfiles.
Ссылка на исходник в Google Docs
UPD. Спасибо за карму, перенес в тематический блог.
Код не претендует на «истину в последней инстанции», многое было упрощено (в одном месте, в некотором смысле даже допущено дублирование – для быстрого доступа к пикселам я создал свой класс, хотя аналогичные наработки были и в 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), а так же открывать определенные видео файлы (с чем, признаюсь, не экспериментировал):
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg375.imageshack.us%2Fimg375%2F5395%2Fimage1t.png%22)
Оригинальный пример умеет идентифицировать движение на потоке по нескольким алгоритмам, простейшим из которых является нахождение разницы между двумя последовательными кадрами.
Код формы был обработан напильником, и заточен конкретно под задачу. На вкладке Motion нужно выбрать алгоритм поиска объекта:
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg710.imageshack.us%2Fimg710%2F2408%2Fimage2zd.png%22)
После чего выбрать объект через Define color tracking object форму:
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg63.imageshack.us%2Fimg63%2F9282%2Fimage3bq.png%22)
Информация о объекте будет отображаться в статус баре главной формы:
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg20.imageshack.us%2Fimg20%2F160%2Fimage4rv.png%22)
Как дополнительная настройка предусмотрен color difference threshold – возможность не отслеживать единый цвет, а учитывать его вариации:
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg819.imageshack.us%2Fimg819%2F3656%2Fimage5p.png%22)
Также дополнительно пользователь может указать, хочет ли он, чтобы цвет объекта также отслеживался во время обработки (то есть не только сам объект отслеживается по цвету, но и новый цвет объекта вычисляется в процессе обработки):
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg156.imageshack.us%2Fimg156%2F6403%2Fimage6gt.png%22)
Следующая плюшка идет в стандартной поставке от Aforge Motion Detector. Объект можно по разному подсвечивать на изображении:
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg256.imageshack.us%2Fimg256%2F9784%2Fimage7tg.png%22)
Имплементация
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я.
Возможные улучшения
Так как уже говорилось о контроллерах к игровым приставкам, то их цвет обычно контрастно отличается от любых других объектов в кадре. Поэтому можно сделать первичный поиск целевого цвета по всему кадру (а не только по смежной области). Это позволит отслеживать объект при более быстром движении.
Полезные ссылки по теме
• Сайт проекта Aforge.
• Aforge – статья на CodeProject.
P.S. Ссылка на исходник на depositfiles.
Ссылка на исходник в Google Docs
UPD. Спасибо за карму, перенес в тематический блог.