一语淘、小程序:跳一跳
本質(zhì)上是棋子坐標到新物件中心的距離ds與屏幕長按時間dt的比例關系
二、使用到的工具和用法
1际歼、adb工具包
adb全名Andorid Debug Bridge. 顧名思義, 這是一個Debug工具惶翻。
用途:
(1)、截屏(保存為screenshot.png
)
adb shell /system/bin/screencap -p /sdcard/screenshot.png
(2)鹅心、將截屏圖片推送到電腦(temp.png
)
adb pull /sdcard/screenshot.png E:\\testproject\\temp.png
(3)吕粗、模擬屏幕長按
adb shell input swipe x1 y1 x2 y2 dt
swipe
模擬的是屏幕的滑動,x1,y1到x2,y2的滑動旭愧,延遲dt秒
2颅筋、python庫
(1)子進程庫subprocess
用途:執(zhí)行上述adb命令
基本使用1:subprocess.Popen(args)
,其中args為命令行输枯,這個是最基本的使用议泵,還有很多參數(shù),不細說了桃熄。注意如果其他參數(shù)都默認先口,該子線程將獨立運行,即子線程間不等待瞳收。
基本使用2:subprocess.call(args)
碉京,是上面的封裝,多個子線程會按照順序依次執(zhí)行螟深。
(2)圖像處理庫opencv
用途:從截圖上識別棋子的坐標和新物件的中心坐標
步驟:
1谐宙、讀取截屏圖片,并做切割血崭,主要是去除圖片上下其他內(nèi)容的影像
image_name = 'temp.png'
# 圖片讀取
img = cv2.imread(image_name)
# 圖片切割
roi = img[400:1000, 80:680]
2卧惜、灰度處理和邊緣檢測厘灼,獲取輪廓圖
# 灰度處理
gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
# canny邊緣檢測,用于識別落點
edges = cv2.Canny(roi, 50, 100)
3咽瓷、識別棋子:通過識別棋子頂部的圓實現(xiàn)
使用到opencv庫中的霍夫圓變換
cv2.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)
主要參數(shù):
image
輸入 8-比特设凹、單通道灰度圖像.
method
Hough 變換方式
dp
累加器圖像的分辨率,dp的值不能比1小茅姜。
min_dist
該參數(shù)是讓算法能明顯區(qū)分的兩個不同圓之間的最小距離闪朱。
param1
用于Canny的邊緣閥值上限,下限被置為上限的一半钻洒。
param2
累加器的閥值奋姿。
min_radius
最小圓半徑。
max_radius
最大圓半徑素标。
返回值為檢測到圓的序列称诗,包括圓心坐標和半徑
這里的參數(shù),只要半徑是19-21左右头遭,其他需要多次嘗試后寓免,取合適的值
# 檢測圓心和半徑
def findring(gray):
circles1 = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 2,
400, param1=100, param2=50, minRadius=19, maxRadius=21)
# print(circles1)
circles = circles1[0, :, :]
circles = np.uint16(np.around(circles))
ring = circles[0]
return ring
4、識別新物件的中心
這個是通過新物件最高點(x最屑莆)和最右端(y最大)來確定的
分三步:
(1)確定棋子位置后袜香,消除棋子的輪廓。因為有的是有新物件靠的比較近或者新物件比較小鲫惶。棋子高度影響對新物件坐標的識別蜈首。
(2)確定這個edges的最高點,找到x最小的點欠母,一般就是新物件的最高點欢策,這時的y坐標為中心點的y坐標
(3)從新物件最高點向右迭代,找到y(tǒng)最大值的點艺蝴,即最右端猬腰。這時的x坐標為中心的x坐標
def findtop(edges):
x,y = np.where(edges==255)
# 獲得x最小時的索引,并獲得對應的y坐標
index = np.argmin(x)
ymin = y[index]
# 從該位置向右400個像素猜敢,查找y最大值,獲得對應的x坐標
xmax = x[np.argmax(y[index:index+400])]
return ymin,xmax
這里返回值中盒延,xy坐標相反是為了視圖顯示的方便缩擂,因為cv2畫圖時候的x,y分別表示對應左邊界和上邊界的距離添寺,和numpy讀取圖片像素矩陣的索引x胯盯,y(行和列)正好相反。
三计露、其他注意點:
1博脑、獲得棋子上端圓心坐標后憎乙,做修正獲得棋子落點坐標
2、新物件中心坐標獲得后叉趣,稍微向上做修正泞边,因為隨著游戲后期新物件變小,中心坐標要做稍微上移疗杉,增加容錯率阵谚。游戲初期新物件比較大,問題不大烟具。
3梢什、計算ds,增加系數(shù)(約2.1)計算dt朝聋。系數(shù)根據(jù)屏幕大小有區(qū)別嗡午,多嘗試幾次做相應調(diào)整。
ds = math.sqrt((e_pos[0] - b_pos[0]) ** 2 + (e_pos[1] - b_pos[1]) ** 2)
a = 2.1
dt = int(a*ds)
jump(dt)
time.sleep(1.5)
4冀痕、每次jump后翼馆,要等待1.5秒左右,一方面是為了某些額外加分金度。另一反面有時超越好友會有動畫效果应媚,會影響新物件坐標的識別。
四猜极、寫在最后的最后
分數(shù)不要刷太高中姜,有時候排行榜不會顯示的。跟伏。丢胚。