Алгоритм для отслеживания в реальном времени нескольких простых объектов - PullRequest
3 голосов
/ 02 марта 2012

Я пытаюсь написать программу для отслеживания относительного положения определенных объектов во время игры в популярную игру League of Legends.В частности, я хочу отслеживать координаты экрана x, y любых «миньонов», которые в данный момент находятся на экране («миньоны» - это маленькие ребята в центре картинки с маленькими красными и зелеными полосами над головами).

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

В настоящее время я думаю об использовании сверточной нейронной сети для идентификации и определения местоположения миньонов по цветным полосам над головами.Тем не менее, мне пришлось бы повторно идентифицировать и определять местоположение миньонов в каждом новом кадре, и, похоже, это было бы вычислительно дорого, если бы я хотел сделать это в режиме реального времени (~ 10-60 кадров в секунду).

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

Итак, есть ли легко реализуемый алгоритм для выполнения этой задачи?

enter image description here

Ответы [ 2 ]

4 голосов
/ 02 марта 2012

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

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

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

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

Поскольку местоположение HUD является постоянным, не должно быть проблем с его удалением.Image without HUD

Вот моя быстрая и не очень надежная реализация в Matlab, которая имеет несколько ограничений:

  1. Единицы должны быть достаточно исправными (по крайней мере, 40 пикселей в ширину)
  2. Прутки не перекрываются.

 function FindUnits()
    x = double(imread('c:\1.jpg'));
    green = cat(3,149,194,151); 

    diff = abs(x - repmat(green,[size(x,1) size(x,2)]));
    diff =  mean(diff,3);
    diff = logical(diff < 30);
    diff = imopen(diff,strel('square',1));

    rp = regionprops(diff,'Centroid','MajorAxisLength','MinorAxisLength','Orientation');
    long = [rp.MajorAxisLength]./[rp.MinorAxisLength];
    rp( long < 20) = [];

    xy = [rp.Centroid];
    x = xy(1:2:end);
    y = xy(2:2:end);
    figure;imshow('c:\1.jpg');hold on ;scatter(x,y,'g');
end

И результаты:

enter image description here

1 голос
/ 02 марта 2012

Вы должны использовать модель, которая включает в себя динамическую структуру. Для целей отслеживания ваших объектов скрытые марковские модели (HMM) (или вообще динамические байесовские сети ) очень хорошо подходят. Вы можете найти много ресурсов на HMM онлайн. Однако проблемы, с которыми вы столкнетесь, зависят от модели вашей системы. Если динамику вашей системы легко представить в виде линейной модели Гаусса-Маркова, тогда подойдет простой фильтр Калмана . Однако в случае нелинейной негауссовой динамики следует использовать Фильтрация частиц , которая является последовательным методом Монте-Карло. Оба фильтра Калмана и фильтр частиц являются последовательными методами, поэтому вы будете использовать результаты, полученные на текущем шаге, чтобы получить результат на следующем шаге по времени. Я предлагаю вам ознакомиться с некоторыми онлайн-учебниками и статьями по отслеживанию нескольких объектов с помощью фильтров частиц. Насколько мне известно, основная трудность, с которой вы столкнетесь, заключается в том, что количество объектов, которые вы можете отслеживать, поскольку вы не будете знать количество объектов, которые хотите отслеживать, а также объект, который вы отслеживаете, может просто исчезнуть как ну (вы можете убить этих маленьких парней или они могут просто покинуть экран) или какой-нибудь другой парень может просто войти в экран. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...