Слежение за объектом по его цвету с использованием 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), а так же открывать определенные видео файлы (с чем, признаюсь, не экспериментировал):
    image

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

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

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

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

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

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

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


    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. Алгоритм можно разделить на такие шаги:
    1. Расширение региона присутствия объекта. Новое положение будем искать не по всему экрану, а лишь в области, смежной с предыдущим положением. Это делает поиск точнее с той точки зрения, что целевой объект не будет перепутан с другим объектом такого же цвета (в другой части изображения).
    2. Вычисление границ объекта в вышеописанной области через определение крайних точек того цвета, который является доминирующим для объекта (здесь также учитывается возможное цветовое отклонение — DifferenceThreshold).
    3. Создание «маски» MotionFrame, которая позволит MotionDetector-у подсветить целевой объект на изображении.
    4. Далее вычисляется «средний цвет» и размер нового объекта.
    5. Если объект слишком мал (например, на следующем кадре наш целевой объект полностью был закрыт другим объектом) – мы не меняем информации о положении и цвете, которые остались в наследство от обработки предыдущего кадра.
    6. Иначе – запоминается новое положение и границы объекта, и, если алгоритм следит за изменением цвета, что устанавливается с помощью свойства bool DynamicColorTracking, то также запоминается и новый вычисленный цвет.

    На этом обработка изображения заканчиваетcя.

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


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

    Полезные ссылки по теме


    Сайт проекта Aforge.
    Aforge – статья на CodeProject.

    P.S. Ссылка на исходник на depositfiles.
    Ссылка на исходник в Google Docs

    UPD. Спасибо за карму, перенес в тематический блог.
    Поделиться публикацией

    Комментарии 12

      +1
      Просто как совет — лучше не выкладывайте исходники на Depositfiles. Это неудобно по многим причинам (реклама, надо ждать начала скачивания, лимиты и т.п.). Идеальный вариант — любой code-хостинг (codeplex, google code etc), либо архив с кодом залить на Dropbox / Skydrive
        0
        Спасибо за совет.
        Опубликовал в Google Docs.
          0
          Docs? Надо на Google Code. Ну или Codeplex, BitBucket или GitHub например.
            +1
            Мест есть много. Главное, чтобы пользователю скачать было легко.
              0
              Большинству пользователей исходного кода, т. е. программистам, вероятно, удобнее всего скачивать этим.

        –1
        Нашел свой комментарий к статье на CodeProject. В то время я интересовался тем, почему нейронные сети не поддерживают тип float. Вопрос был в основном задан потому, что такие вещи как нейронные сети намного лучше идут на GPU с использованием Microsoft Accelerator и аналогичных методов.
          +1
          Я как-то списывался с Кирилловым. Он, оказывается, разработал Imaging во время работы над дипломом бакалавра, далее во время работы над магистерской — добавились элементы AI. Вообщем очень неплохо как для студенческой разработки.
          Он и дальше её развивает, но теперь это больше напоминает хобби.
            +3
            Я бы сказал даже очень неплохо. Глянул в исходники Кириллова и проникся объёмом проделанной работы (я думал там на основе какой-нибудь готовой библиотеки всё сделано, например OpenCV — ан нет, там всё по-честному, ручками). Спасибо за пост!
          0
          Ммм, понятно. Вот меня например интересуют (интересовали) нейронные сети в применении к разным финансовым алгоритмам. Проблема основная в том, что на домашнем компе просчет более-менее серьезных перцептронов занимала часы если не дни (это если на исторических данных). Что же касается сиюминутных (тиковых) данных, то таковые конечно можно грузить в нейронную сеть любой сложности — компьютер потянет. Я кстати сейчас пишу посты об eventing, там подобные сценарии как раз применимы.

          Вообщем, плюсую вам карму с надеждой что вы напишете еще много технических постов про .Net. Удачи!
            0
            Спасибо :).
            0
            Использовали в одном проекте Aforge.Net, потом отказались в пользу EmguCV (.Net враппер над OpenCV)
              0
              А в чем, собственно, состояла задача Вашего проекта?

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое