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這是一個連續的蒙特卡羅方法。卡爾曼濾波器和粒子濾波器都是順序方法,因此您將使用當前步驟中的結果在下一個時間步驟中獲得結果。我建議你通過粒子濾波器檢查一些關於多目標跟蹤的在線教程和論文。然而,就我而言,您將遇到的主要困難是,由於您不知道要跟蹤的對象的數量以及您正在跟蹤的對象可能會消失,因此可能需要跟蹤的對象數量會隨着(你可能會殺死那些小傢伙,或者他們可能會離開屏幕),或者其他人可以進入屏幕。希望這可以幫助。