GitHub 倉庫已刪除。html
IDE:VisualStudiogit
Language:C# / VB.NETgithub
GitHub:AutoJump.NET微信
本文將向你介紹一種經過圖像識別實現「跳一跳」機器人的方法。 測試
文中提到的方法和步驟只涉及簡單的向量計算。動畫
須要用到哪些計算?spa
比較像素點的顏色3d
求向量集合的中心htm
計算顏色的類似度blog
一個 RGB 顏色能夠看做一個三維向量
比較兩個顏色的類似度能夠計算它們的歐幾里得距離
也能夠直接比較它們的夾角:夾角越小,兩個顏色越類似,反之亦然
求平面向量集合的中心位置
首先,將集合中全部的向量相加獲得向量 S
再將向量 S 除以集合元素的個數,結果即爲它們的中心
圖1-1 識別效果預覽
找出盒子落點的前提是發掘每一個盒子都具備的共同特徵。
盒子特徵
目標落點有兩種類型,菱形或圓形的盒子
只有部分盒子的頂面顏色是大面積的純色
盒子下方的地面背景是純色,但隨着遊戲進行顏色會發生變化
頂點特徵
頂點的上側爲背景色
頂點的左側(可能不適用於圓形)、右側(可能不適用於圓形)均爲背景色
識別方法
從上向下逐行掃描像素找出盒子的頂點 A
繼續向下找出與 A 顏色類似的全部像素點集合 C
求出 C 像素集合的中心點,即爲落點
圖2-1 盒子落點識別
角色的顏色相對特殊,很容易從遊戲圖像中區分出來。
人物特徵
角色呈國際象棋棋子狀
角色總體顏色較爲一致,部分區域有高光
頂點特徵
角色的頂點顏色較深,易於區分
識別方法
從上向下逐行掃描像素找出角色的頂點 A
繼續向下找出與 A 顏色類似的全部像素點集合 C
求出 C 像素集合的中心點,並向下偏移固定數值
中心點偏移後的像素 D 的位置即爲角色的底部
圖3-1 角色底部識別
一般,簡單的方法只適應於絕大部分狀況,特定情形時仍會出錯。
哪些狀況會致使識別錯誤
盒子頂部的顏色不一致時
角色頂部的位置高於目標盒子時
角色站立的盒子和目標盒子的頂部顏色一致時
其餘干擾因素的解決方案
加分提示的動畫:延時解決
擊中中心的動畫:延時解決
音樂盒的樂符動畫:不要在音樂盒上停留:)
圖4-1 魔方(正確)
圖4-2 商店(偏離中心)
圖4-3 音樂盒 (偏離中心)
程序的部分參數須要經過實際測試得出。
識別區域
僅屏幕中間的三分之一區域須要進行圖像識別
觸壓時間
觸壓屏幕的毫秒數正好是角色與落點距離數值的兩倍
距離爲 500 個像素點,那麼就須要持續按下 1000 毫秒
該比例適用於 1280*720 分辨率的設備,不一樣設備可能須要適當調節
如何計算其餘設備分辨率的比例
計算公式:比例 = 2560 / 設備屏幕高度
例如 1980*1080 分辨率的設備,比例爲 2560 / 1980 = 1.29
圖5-1 識別區域(陰影部分)
GitHub:AutoJump.NET
參考文章:.NET開發一個微信跳一跳輔助程序
參考書籍:《數學之美》[美] 吳軍 著 人民郵電出版社