用于实时跟踪几个简单对象的算法

时间:2012-03-01 22:42:08

标签: image-processing computer-vision tracking video-processing object-recognition

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

我正在使用Java Robot类在我正在播放时向我的程序发送屏幕截图,并且我试图找出最好的算法来定位minions并跟踪它们只要它们留在屏幕上。

我目前的想法是使用卷积神经网络通过那里的彩色条来识别和定位爪牙。但是,我必须在每个新帧上重新识别和定位minions,如果我想实时(~10-60 fps),这似乎是计算上昂贵的。

这些类型的计算机视觉算法并不是我的专业化,但是利用视频中的事实对象以连续的方式移动(即它们不会在帧与帧之间跳转)的算法似乎是合理的。 / p>

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

enter image description here

2 个答案:

答案 0 :(得分:4)

由于这是一款电脑游戏,我认为酒吧的颜色应该是不变的。仅当动态照明影响健康条时才可能不是这样,这种可能性很小。

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

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

至于跟踪,只需查找下一帧中距离最近的每个点。

由于HUD位置是恒定的,因此删除它应该没有问题。 Image without HUD

这是我在Matlab中快速且不那么强大的实现,它有一些限制:

  1. 单位必须非常健康(至少40像素宽)
  2. 条形图不重叠。

  3.  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 :(得分:1)

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

相关问题