3

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

我目前正在使用Java机器人类在屏幕截图中发送屏幕截图,而我正在玩这个游戏,并且试图找出最佳算法来定位小爪子并追踪它们,只要它们留在屏幕上。

我目前的想法是使用卷积神经网络来识别和定位在那里头部的彩条。但是,我必须在每一个新帧上重新识别并定位小爪子,如果我想实时做到这一点(大约10-60 fps),这看起来好像在计算上会很昂贵。

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

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

enter image description here

回答

4

由于这是一款电脑游戏,我认为酒吧的颜色应该是不变的。这只有在动态光照影响健康条时才可能是真实的,这是不太可能的。

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

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

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

由于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

添加一个简单的卡尔曼滤波器,以帮助跟踪单位帧与帧和你设置。 – 2012-03-02 08:57:19

+0

Wow nice job!你的代码正是我需要的:--D – zergylord 2012-03-03 06:15:32

1

您应该使用一个模型,其中包括在其动态结构。为了您的物体追踪目的,Hidden Markov Models(HMMs)(或一般Dynamic Bayesian Networks)非常适合。您可以在线找到大量HMM资源。你将要面对的问题取决于你的系统模型。如果您的系统动态可以很容易地表示为线性高斯 - 马尔可夫模型,那么简单的Kalman Filter将会很好。但是,在非线性非高斯动态的情况下,您应该使用Particle Filtering这是一个连续的蒙特卡罗方法。卡尔曼滤波器和粒子滤波器都是顺序方法,因此您将使用当前步骤中的结果在下一个时间步骤中获得结果。我建议你通过粒子滤波器检查一些关于多目标跟踪的在线教程和论文。然而,就我而言,您将遇到的主要困难是,由于您不知道要跟踪的对象的数量以及您正在跟踪的对象可能会消失,因此可能需要跟踪的对象数量会随着(你可能会杀死那些小家伙,或者他们可能会离开屏幕),或者其他人可以进入屏幕。希望这可以帮助。