在上一期的開源周報中,我們介紹了利用圖像識別來估計按壓的時間而實現精確跳躍的Python腳本,今天我們對這個微信跳一跳小遊戲的「外掛」做一些更多的介紹。
核心原理:
每次落穩之後截圖,根據截圖算出棋子的坐標和下一個塊頂面的中點坐標,根據兩個點的距離乘以一個時間係數獲得長按的時間。
識別棋子:
靠棋子的顏色來識別位置,通過截圖發現最下面一行大概是一條直線,就從上往下一行一行遍歷,比較顏色(顏色用了一個區間來比較)找到最下面的那一行的所有點,然後求個中點,求好之後再讓 Y 軸坐標減小棋子底盤的一半高度從而得到中心點的坐標。
識別棋盤:
靠底色和方塊的色差來做,從分數之下的位置開始,一行一行掃描,由於圓形的塊最頂上是一條線,方形的上面大概是一個點,所以就用類似識別棋子的做法多識別了幾個點求中點,這時候得到了塊中點的 X 軸坐標,這時候假設現在棋子在當前塊的中心,根據一個通過截圖獲取的固定的角度來推出中點的 Y 坐標。
最後:根據兩點的坐標算距離乘以係數來獲取長按時間(似乎可以直接用 X 軸距離)
這個思路非常典型,就是去找所需屬性的特徵,而且這個遊戲的設定完美地避開了這個演算法的漏洞:基本上沒有與平台相同的顏色(當然相同的話是會被玩家吐槽的),並且遊戲的視角沒有出現過旋轉或者縮放。如果有的話識別上會有一定難度。
利用背景色色差來識別棋盤:
跳一跳的背景現在會逐漸變色,有的時候甚至會與下一個平台的顏色一模一樣,不過截圖也就一瞬間的事,對於這個演算法來說並不是什麼問題。作者還專門優化了當小人的圖案位於下個矩形頂部上方的情況。不過識別平台大小的演算法對於雜色效果並不好,筆者測試的時候大部分都是這個時候掛掉的( ̄ε(# ̄) Σ
對這個程序的探索大概到這裡就結束了,這個小項目後續的更新基本上是對識別的進一步優化以及防反外掛機制。本篇延展權當大家學習中的一個小插曲,希望它能讓大家在鑽研之餘輕鬆一刻。