python控制手机自动刷新闻_Python控制android手机实现微信自动跳一跳
學習一個新東西一定要有趣,如果只是簡單學習語法太枯燥了。弄了個跳一跳的程序,注釋寫的很清楚#!/usr/bin/env?python
#?encoding:?utf-8
#?@software:?PyCharm
#?@time:?2019/7/10?15:39
#?@author:?Paulson●Wier
#?@file:?jump_跳一跳.py
#?@desc:
import?os
import?random
import?time
import?cv2
import?numpy?as?np
def?get_screenshot():
#?截取手機的屏幕
os.system('adb?shell?/system/bin/screencap?-p?/sdcard/screencap.png')
#?把模擬器里面的文件傳到電腦上
os.system('adb?pull?/sdcard/screencap.png?screencap.png')
def?get_start(img):
"""
模板匹配,獲取跳一跳起點的位置參數(小跳棋)
????:param?img:跳一跳當前圖片
:return?跳塊中心點坐標(x,y)
"""
#?使用標準相關系數匹配,1表示完美匹配,?-1表示糟糕匹配,?0表示沒有任何相關性
????result?=?cv2.matchTemplate(img,?temple,?cv2.TM_CCOEFF_NORMED)
#?使用函數?minMaxloc,?確定匹配結果矩陣的最大值和最小值(val),以及它們的位置(loc)
min_val,?max_val,?min_loc,?max_loc?=?cv2.minMaxLoc(result)
#?此處選取最大值的位置,為圖像的左上角
t1?=?max_loc
#?獲取圖像的右下角
br?=?(t1[0]?+?tw,?t1[1]?+?th)
t_x_center?=?(t1[0]?+?br[0])?//?2
t_y_center?=?int(max_loc[1]?*?0.25?+?br[1]?*?0.75)
print(f"跳塊中心點坐標({t_x_center},{t_y_center})")
return?t_x_center,?t_y_center
def?get_next(img):
"""
獲取下一跳目標方塊中心點坐標
????:param?img:
:return:
"""
#?高斯模糊
????img_rgb?=?cv2.GaussianBlur(img,?(5,?5),?0)
????canny_img?=?cv2.Canny(img_rgb,?1,?10)
#?輸出邊緣檢測圖像的高和寬
????H,?W?=?canny_img.shape
#?第一個頂點的高度,row為列表(代表每一行的像素值),?max(row)?獲取列表中最大的像素值
#?對圖像高度大于400的行進行遍歷(這樣可以去除上方數字以及小程序塊的影響)。
#?np.nonzero()?表示獲取列表元素數值不為0的位置,
????y_top?=?np.nonzero([max(row)?for?row?in?canny_img[420:]])[0][0]?+?420
#?獲取第一個頂點的寬度值
????x_top?=?int(np.mean(np.nonzero(canny_img[y_top])))
#?跳過小白圈,然后遍歷
y_bottom?=?y_top?+?125
for?row?in?range(y_bottom,?H):
????????if?canny_img[row,?x_top]?!=?0:
y_bottom?=?row
break
#?得到方塊的中心點
x_center,?y_center?=?x_top,?(y_top?+?y_bottom)?//?2
print(f"目標方塊中心點({x_center},{y_center})",)
return?x_center,?y_center
def?game_over(img):
"""
模板匹配,檢測是否要將程序結束
"""
#?如果在游戲截圖中匹配到帶"再玩一局"字樣的模板,則循環中止
????res_end?=?cv2.matchTemplate(img,?temp_end,?cv2.TM_CCOEFF_NORMED)
if?cv2.minMaxLoc(res_end)[1]?>?0.95:
print('Game?over!')
return?True
def?jump(distance,?flag=1.5):
#?設置按壓時間,系數為默認為1.35
press_time?=?int(distance?*?flag)
#?生成隨機手機屏幕模擬觸摸點,防止成績無效
#?生成隨機整數(0-9),最終數值為(0-90)
rand?=?random.randint(0,?9)?*?10
#?adb長按操作,即在手機屏幕上((320-410),(410-500))坐標處長按press_time毫秒
cmd?=?('adb?shell?input?swipe?%i?%i?%i?%i?'?+?str(press_time))?%?(320?+?rand,?410?+?rand,?320?+?rand,?410?+?rand)
#?輸出adb命令
print(cmd)
#?執行adb命令
os.system(cmd)
def?main():
i?=?0
while?True:
#?將安卓手機上的截圖移到電腦當前文件夾下
i?+=?1
get_screenshot()
#?讀取截圖圖像
????????img?=?cv2.imread('screencap.png',?0)
????????if?game_over(img):
print(f"第{i-1}次跳動失敗")
break
print(f"第{i-1}次跳動成功")??#?提示上一次跳動是否成功
????????begin_x,?begin_y?=?get_start(img)
????????target_x,?target_y?=?get_next(img)
distance?=?((begin_x-target_x)**2?+?(begin_y-target_y)**2)?**?0.5
#?將起點位置繪制出來,一個圓
????????cv2.circle(img,?(begin_x,?begin_y),?20,?255,?-1)
#?將終點位置繪制出來,一個圓
????????img_end?=?cv2.circle(img,?(target_x,?target_y),?20,?188,?-1)
#?保存圖片
????????cv2.imwrite('last.png',?img_end)
#?根據獲得的距離來設置按壓時長
jump(distance)
time.sleep(1.3)
if?__name__?==?'__main__':
#?游戲結束的模板圖像
temp_end?=?cv2.imread('end.jpg',?0)
#?讀取小跳棋模板圖像
temple?=?cv2.imread('temple.png',?0)
#?獲取小跳棋模板圖像的高和寬
th,?tw?=?temple.shape[:2]
main()
總結
以上是生活随笔為你收集整理的python控制手机自动刷新闻_Python控制android手机实现微信自动跳一跳的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都大熊猫基地军官证免票吗
- 下一篇: 精子不液化会导致男性不育发生吗