3

我正在尝试编写一个程序来跟踪某些对象的相对位置,同时我正在玩流行的游戏英雄联盟。具体来说,我想跟踪屏幕上当前任何“奴才”的 x、y 屏幕坐标(“奴才”是图片中心的小家伙,头上有红色和绿色的小条)。

我目前正在使用 Java Robot 类在我玩游戏时将屏幕截图发送到我的程序,并试图找出最好的算法来定位小兵并跟踪它们,只要它们留在屏幕上。

我目前的想法是使用卷积神经网络通过头上的彩色条来识别和定位奴才。但是,我必须在每个新帧上重新识别和定位小兵,如果我想实时执行此操作(~10-60 fps),这似乎在计算上会很昂贵。

这些类型的计算机视觉算法并不是我真正的专长,但存在利用视频中对象以连续方式移动的事实的算法似乎是合理的(即它们不会从帧跳到帧)。

那么,是否有一种易于实现的算法来完成这项任务?

在此处输入图像描述

4

2 回答 2

4

由于这是一个电脑游戏,我认为条的颜色应该是恒定的。仅当动态照明影响生命条时,这可能不是真的,这是极不可能的。

因此,只需找到具有这种特定颜色的所有像素。然后你做一些形态学操作并将图像分割成斑点。通过仅选择符合某些条件的 blob,您可以找到单位的位置。

我知道我的回答不涉及视频,但是操作应该很简单,应该很快。

至于跟踪,只需在每个点中找到下一帧中最接近的点。

由于 HUD 位置是恒定的,因此移除它应该没有问题。 没有 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

结果:

在此处输入图像描述

于 2012-03-02T06:35:27.533 回答
2

您应该使用其中包含动态结构的模型。对于您的对象跟踪目的,隐藏马尔可夫模型(HMM)(或一般来说动态贝叶斯网络)非常适合。你可以在网上找到很多关于 HMM 的资源。但是,您将面临的问题取决于您的系统型号。如果您的系统动力学可以很容易地表示为线性高斯马尔可夫模型,那么简单的卡尔曼滤波器就可以了。但是,在非线性非高斯动力学的情况下,您应该使用粒子滤波这是一种顺序蒙特卡罗方法。卡尔曼滤波器和粒子滤波器都是顺序方法,因此您将使用当前步骤的结果来获得下一个时间步骤的结果。我建议你查看一些关于通过粒子过滤器进行多目标跟踪的在线教程和论文。然而,就我而言,您将遇到的主要困难是,您可能想要跟踪的对象数量,因为您不知道要跟踪的对象数量,而且您正在跟踪的对象可能会消失,因为好吧(您可能会杀死那些小家伙,或者他们可能会离开屏幕)或者其他一些人可以进入屏幕。希望这可以帮助。

于 2012-03-02T05:05:59.820 回答