1.前言
初學python鉴象,看到微信跳一跳外掛覺得挺有意思抑胎,想做個比這個稍簡單的來學習一下相關(guān)語法與模塊
(此外掛只用于學習梨撞!并沒有過多關(guān)于外掛的知識1⑾础)所做的游戲就是這個!開心斗游戲中的消磚塊小游戲
通過點擊屏幕來使該位置增加方塊卧波,從而達到消掉一層四個磚塊时肿,是一個簡單的休閑小游戲。
2.所用工具/前期準備
(1).python3.X
請讀者自行配置環(huán)境港粱,推薦用conda:
# 添加國內(nèi)源螃成,下載穩(wěn)定點
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
# 其他參數(shù)
conda config --set show_channel_urls yes
# 創(chuàng)建一個虛擬環(huán)境,推薦用 tensorflow 的
conda create -n tensorflow python=3.6.4
# 開啟剛才新建的虛擬環(huán)境
conda activate tensorflow
(2).adb
本攻略只適合安卓手機查坪,請先下載adb驅(qū)動
下載地址:http://adbshell.com/downloads
(3).python中的openCV模塊進行簡單的圖像識別
下載方法:命令行中輸入pip install opencv-python進行下載
(4).python中的numpy,PIL和pylab模塊進行簡單運算和圖像處理
pip install matplotlib
pip install numpy
pip install pillow
3.adb安裝注意事項
1.在cmd中輸入adb寸宏,顯示如下字樣證明安裝成功。
...
environment variables:
$ADB_TRACE
comma-separated list of debug info to log:
all,adb,sockets,packets,rwx,usb,sync,sysdeps,transport,jdwp
$ADB_VENDOR_KEYS colon-separated list of keys (files or directories)
$ANDROID_SERIAL serial number to connect to (see -s)
$ANDROID_LOG_TAGS tags to be used by logcat (see logcat --help)
2.將手機調(diào)整到開發(fā)者模式(百度各種型號的打開方法)偿曙,并開啟USB調(diào)試功能
3.將手機與PC連接氮凝,手機中詢問是否調(diào)試,一直點同意望忆。PC中打開cmd 輸入
adb devices
若看到如下顯示罩阵,則證明已經(jīng)連接上了!可以開啟我們的編程之旅了启摄!
List of devices attached
FYIYHH7JKGLGJKK(這個是一串id) device
4.adb的簡易操作
//在屏幕上做劃屏操作稿壁,前四個數(shù)為坐標點,后面是滑動的時間(單位毫秒)歉备。把原來滑動就可以移動視圖的應(yīng)用打開驗證
adb shell input swipe 250 250 450 450 200
[觸摸] adb swipe x1 y1 x2 y2 duration(ms)
-[注] adb好像沒有觸摸 不過有滑動 ,所以把 x1 y1 x2 y2 變成一個像素點,加上時間即可變成長按
//在屏幕上點擊坐標點x=50 y=250的位置傅是。
adb shell input tap 50 250
//截圖
adb shell /system/bin/screencap -p /sdcard/screenshot.png
//將截好的圖保存到電腦之中
adb pull /sdcard/screenshot.png /Users/xxx/Downloads
以上就是我們可能會用到的基本指令了,想了解更多的adb指令的話威创,參考這篇文章:https://blog.csdn.net/jlminghui/article/details/39268419
5.圖像處理
(1).我們先要抓取屏幕并傳輸?shù)诫娔X中落午,上面已經(jīng)提過了谎懦,所以直接上函數(shù)
def screenshot():
os.system("adb shell screencap -p /sdcard/game.png")#cmd運行
os.system("adb pull /sdcard/game.png D:/PYthon/first_j/game.png")#存入電腦里面
截圖后肚豺,我們得到如下圖像
(2).我們發(fā)現(xiàn)上方的信息和下方的一些按鍵并不是我們想要的,我們可以輕松的把它們裁剪掉
crop_img = img[280:1780, 20:1080] # X=1060,Y=1500
效果圖:
(3).當我們拿到這一張彩色的圖片的時候界拦,我們自然的知道應(yīng)該向哪里發(fā)射方塊吸申,可是怎么才能讓機器知道呢?這里我們應(yīng)該把圖像轉(zhuǎn)化為灰度或二值圖像,進行一系列的去噪等操作截碴,使得計算機可以認出我們的圖像并做判斷
Q:什么是灰度圖像梳侨?什么是二值圖像?
http://www.jb51.net/article/78762.htm
這篇文章講解的非常清晰日丹,讀者可以仔細閱讀走哺,了解一下數(shù)字圖像的構(gòu)成和灰度圖像的原理
我們這里講圖片轉(zhuǎn)化為二值圖像,效果圖如下
GrayImage = cv2.cvtColor(crop_img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_BINARY_INV)
在上圖中哲虾,我們看到方塊有些不整齊丙躏,有一部分白色,我們要把這些白色填充掉束凑,使得后面的程序更容易識別方塊晒旅,此時需要一些形態(tài)學方面的操作。
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
上一下效果圖
PS:左上角的東西我們無需擔心~它只是在個別的時候會蹦出來汪诉,告訴我們我們的磚塊行數(shù)+2了废恋,然后會馬上消失~并不 影響我們的識別~
到這里,我們對圖像的處理已經(jīng)很完善了扒寄。機器已經(jīng)能很輕松的識別哪里是磚塊(黑色——值為0)鱼鼓,哪里是空白(白色——值為255),如果小伙伴們有時候處理一些復雜的圖像旗们,可以再用一下腐蝕與膨脹算法蚓哩,效果也是非常好的。貼一下代碼
# 分別執(zhí)行4次形態(tài)學腐蝕與膨脹算法上渴。
closed = cv2.erode(closed, None, iterations=4)
closed = cv2.dilate(closed, None, iterations=4)
6.模擬操作
相信大家的想法和我最初的想法非常像岸梨,這個是不是已經(jīng)接近尾聲了,我只需要檢測 X= [100,375,650,925]
這四個點哪里是白色就模擬按鍵就好了稠氮?我就是用了這個簡單的算法曹阔,發(fā)現(xiàn)模擬的結(jié)果非常不理想:(劃重點)因為adb模擬按鍵和截圖的速度并不快,所以會導致沒有人的操作快隔披!
那怎么辦赃份?只能優(yōu)化算法咯
我們先檢測哪里有方塊,什么時候出方塊奢米,并把他的位置存到數(shù)組中
#先檢測什么時候有塊
for count in np.arange(1450,0,-50):
if int(closed[count,100])+int(closed[count,375])+int(closed[count,650])+int(closed[count,925])!=255*4:
break
for i in np.arange(count,0,-160):
Y.append(i)
記錄后抓韩,一次性進行多次按鍵操作,實現(xiàn)一張圖模擬多個按鍵鬓长,這樣效率就高多啦
for i in Y:
if closed[i,100]!=0:
val.append(120)
elif closed[i,375]!=0:
val.append(395)
elif closed[i,650]!=0:
val.append(670)
elif closed[i,925]!=0:
val.append(945)
return val
原文:https://blog.csdn.net/qq_35624030/article/details/79618988