日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于计算机视觉的梦幻西游辅助脚本(只用于开发学习技术)

發(fā)布時(shí)間:2024/3/12 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于计算机视觉的梦幻西游辅助脚本(只用于开发学习技术) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一個(gè)基于計(jì)算機(jī)視覺開發(fā)的夢幻西游輔助腳本

(為了不讓別有用心的人用軟件牟利,雖然軟件打包好了,但僅供有興趣的人學(xué)習(xí)代碼,不提供軟件下載)

從有想法到弄出來花了兩三天,很多知識都是現(xiàn)學(xué)的,哈哈,雖然有點(diǎn)累,但是蠻開心的。

【注】本工具不為盈利,只為興趣,學(xué)以致用而已。

麻煩覺得不錯(cuò)的人點(diǎn)個(gè)star哦!

【注1】腳本或程序需要跑在管理員權(quán)限運(yùn)行才行。因?yàn)槭髽?biāo)點(diǎn)擊需要管理員權(quán)限。只截圖不需要。

【注2】本項(xiàng)目代碼完整,存放在我的github上面,文中只是展示了一部分代碼。

項(xiàng)目下載地址

【注3】類似下面的資源圖片不會(huì)提供哦。

我的代碼力都有截圖保存的部分被我注釋了,想實(shí)踐的同學(xué)可以根據(jù)自己的窗口的情況先在目標(biāo)區(qū)域截圖保存作為基準(zhǔn),然后以后每次運(yùn)行都截圖來和保存的圖比較即可。

本教程分四部分:

(1)使用python 的pywin32這個(gè)庫來實(shí)現(xiàn)對Windows窗口的操作和點(diǎn)擊。

(2)使用PIL來實(shí)現(xiàn)圖像相似度的計(jì)算。

(3)使用tkinter這個(gè)庫來實(shí)現(xiàn)圖形化界面。

(4)使用pyinstaller這個(gè)庫來實(shí)現(xiàn)把源程序打包成.exe文件。

一、pywin32的主要作用

1.捕獲窗口;

def resolution(): # 獲取屏幕分辨率return win32api.GetSystemMetrics(0), win32api.GetSystemMetrics(1)# 獲取夢幻西游窗口信息,返回一個(gè)矩形窗口 def get_window_info():wdname = u'《夢幻西游》手游'handle = win32gui.FindWindow(0, wdname) # 獲取窗口句柄if handle == 0:return Noneelse:return win32gui.GetWindowRect(handle)

2.模擬鼠標(biāo)鍵盤動(dòng)作;

def move_click(x, y, t=0): # 移動(dòng)鼠標(biāo)并點(diǎn)擊左鍵win32api.SetCursorPos((x, y)) # 設(shè)置鼠標(biāo)位置(x, y)win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN |win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0) # 點(diǎn)擊鼠標(biāo)左鍵if t == 0:time.sleep(random.random()*2+1) # sleep一下else:time.sleep(t)return 0

二、使用PIL來抓取圖像并實(shí)現(xiàn)相似度計(jì)算

#師門任務(wù) def shimen(window_size):global is_startis_start = Truetopx, topy = window_size[0], window_size[1]# 使用按鈕(比如是x1,y1,x2,y2)shiyong = Image.open("shiyong_jpg")shiyong_hash = get_hash(shiyong)# shiyong.show()# print(shiyong_hash)# 購買寵物(比如是x1,y1,x2,y2)goumai_cw = Image.open("goumai_cw_jpg")goumai_cw_hash = get_hash(goumai_cw)# 上交藥品按鈕(比如是x1,y1,x2,y2)shangjiao_yp = Image.open("shangjiao_yp_jpg")shangjiao_yp_hash = get_hash(shangjiao_yp)# 上交寵物按鈕shangjiao_cw = Image.open("shangjiao_cw_jpg")shangjiao_cw_hash = get_hash(shangjiao_cw)#師門任務(wù)欄shimen = Image.open("shimen_jpg")shimen_hash = get_hash(shimen)# 師門任務(wù)欄shimen_songxin = Image.open("shimen_songxin_jpg")shimen_songxin_hash = get_hash(shimen_songxin)# 藥店購買goumai_yp = Image.open("goumai_yp_jpg")goumai_yp_hash = get_hash(goumai_yp)# 商城購買goumai_sc = Image.open("goumai_sc_jpg")goumai_sc_hash = get_hash(goumai_sc)i=0count = 0while is_start:time.sleep(2)i=i+1print("第%i次循環(huán)" %i)# 使用按鈕(635 ,510 ,710 ,540)img_shiyong = ImageGrab.grab((topx + get_posx(635, window_size), topy + get_posy(510, window_size), topx + get_posx(710, window_size), topy + get_posy(540, window_size)))# img_shiyong.show()# img_shiyong.save("shiyong.jpg")# print("顯示圖片")# print(get_hash(img_shiyong))# print(hamming(get_hash(img_shiyong), shiyong_hash, 20))if hamming(get_hash(img_shiyong), shiyong_hash, 20):move_click(topx + get_posx(670, window_size), topy + get_posy(525, window_size))print("點(diǎn)擊使用")time.sleep(3)continue# 購買寵物610,505,740,540img_goumai_cw = ImageGrab.grab((topx + get_posx(610, window_size), topy + get_posy(505, window_size), topx + get_posx(740, window_size), topy + get_posy(540, window_size)))# img_goumai_cw.save("goumai_cw.jpg")if hamming(get_hash(img_goumai_cw), goumai_cw_hash, 20):move_click(topx +get_posx(680, window_size), topy + get_posy(520, window_size))print("點(diǎn)擊購買寵物")time.sleep(3)continue# 藥店購買 570,470,700,505img_goumai_yp = ImageGrab.grab((topx + get_posx(560, window_size), topy + get_posy(460, window_size), topx + get_posx(690, window_size), topy + get_posy(500, window_size)))# img_goumai_yp.save("goumai_yp.jpg")if hamming(get_hash(img_goumai_yp), goumai_yp_hash, 20):move_click(topx + get_posx(620, window_size), topy + get_posy(480, window_size))print("點(diǎn)擊購買藥")time.sleep(3)continue# 商城購買 520,520,715,550img_goumai_sc = ImageGrab.grab((topx + get_posx(580, window_size), topy + get_posy(515, window_size), topx + get_posx(715, window_size), topy + get_posy(550, window_size)))# img_goumai_sc.save("goumai_sc.jpg")if hamming(get_hash(img_goumai_sc), goumai_sc_hash, 20):move_click(topx + get_posx(650, window_size), topy + get_posy(530, window_size))print("點(diǎn)擊商城購買")time.sleep(3)continue# 上交藥品按鈕 600,470,700,500img_shangjiao_yp = ImageGrab.grab((topx + get_posx(590, window_size), topy + get_posy(465, window_size), topx + get_posx(695, window_size), topy + get_posy(490, window_size)))# img_shangjiao_yp .save("shangjiao_yp.jpg")if hamming(get_hash(img_shangjiao_yp), shangjiao_yp_hash, 20):move_click(topx + get_posx(640, window_size), topy + get_posy(478, window_size))print("點(diǎn)擊藥品上交")time.sleep(3)continue# 上交寵物按鈕img_shangjiao_cw = ImageGrab.grab((topx + get_posx(500, window_size), topy + get_posy(460, window_size), topx + get_posx(600, window_size), topy + get_posy(500, window_size)))# img_shangjiao_cw.save("shangjiao_cw.jpg")if hamming(get_hash(img_shangjiao_cw), shangjiao_cw_hash, 20):move_click(topx + get_posx(550, window_size), topy + get_posy(480, window_size))print("點(diǎn)擊寵物上交")time.sleep(3)continue# 師門任務(wù)按鈕img_shimen_songxin = ImageGrab.grab((topx + get_posx(620, window_size), topy + get_posy(345, window_size), topx + get_posx(700, window_size), topy + get_posy(370, window_size)))# img_shimen_songxin .save("shimen_songxin1.jpg")if hamming(get_hash(img_shimen_songxin), shimen_songxin_hash, 30):move_click(topx + get_posx(660, window_size), topy + get_posy(360, window_size))print("點(diǎn)擊師門任務(wù)")time.sleep(3)continue# # 師門任務(wù)欄 630,150,665,175img_shimen = ImageGrab.grab((topx + get_posx(630, window_size), topy + get_posy(160, window_size), topx + get_posx(670, window_size), topy + get_posy(180, window_size)))# img_shimen.save("shimen.jpg")if hamming(get_hash(img_shimen), shimen_hash, 40):move_click(topx + get_posx(650, window_size), topy + get_posy(170, window_size))print("點(diǎn)擊師門任務(wù)欄")time.sleep(3)continue

具體思路就是抓取對應(yīng)位置的圖像和已經(jīng)保存的圖像進(jìn)行相似度計(jì)算,(這里使用的是計(jì)算漢明距離,值越小說明越相似。)如果出現(xiàn)相似的情況就說明事件發(fā)生,然后點(diǎn)擊按鈕。否則什么也不做。這樣就避免了傳統(tǒng)的定時(shí)定點(diǎn)點(diǎn)擊的弊端。我們的腳本可以每次都點(diǎn)擊,也可以很多次不點(diǎn)。經(jīng)測試,效果很好。就和人一樣只有在需要點(diǎn)擊的時(shí)候才會(huì)點(diǎn)擊。平時(shí)什么也不做。

三、tkinter圖像化界面

# 啟動(dòng) if __name__ == "__main__":screen_resolution = resolution()# print(screen_resolution)window_size = get_window_info()print(window_size)global is_start# 創(chuàng)建主窗口root = tk.Tk()root.title("夢幻西游手游輔助")root.minsize(300, 250)root.maxsize(300, 250)# 創(chuàng)建按鈕button_shimen = tk.Button(root, text=u"師門", command=lambda: MyThread(shimen, window_size), width = 15,height = 2)button_shimen.place(relx=0.2, rely=0.15, width=200)button_shimen.pack()button_bangpai = tk.Button(root, text="幫派", command=lambda: MyThread(bang_pai, window_size), width = 15,height = 2)button_bangpai.place(relx=0.2, rely=0.35, width=200)button_bangpai.pack()button_baotu = tk.Button(root, text="寶圖", command=lambda: MyThread(baotu,window_size), width = 15,height = 2)button_baotu.place(relx=0.4, rely=0.55, width=200)button_baotu.pack()button_zhuagui = tk.Button(root, text="帶隊(duì)抓鬼", command=lambda: MyThread(zhua_gui, window_size), width = 15,height = 2)button_zhuagui.place(relx=0.4, rely=0.65, width=100)button_zhuagui.pack()button_tingzhi = tk.Button(root,text=u"停止", command=lambda: MyThread(stop), width = 15,height = 2)button_tingzhi.place(relx=0.4, rely=0.85, width=200)button_tingzhi.pack()root.mainloop()

結(jié)果展示:

四、pyinstaller 打包

直接使用pyinstaller打包的話,如圖片之類的資源文件并不會(huì)被打包。所以把圖片需要轉(zhuǎn)化成.py文件。在需要的地方導(dǎo)入才能使用。(當(dāng)然也有其他方法,我使用的是這個(gè))

【注】這段代碼來源于CSDN

#!/usr/bin/env python # _*_ coding:utf-8 _*_import base64def pic2py(picture_names, py_name):"""將圖像文件轉(zhuǎn)換為py文件:param picture_name::return:"""write_data = []for picture_name in picture_names:filename = picture_name.replace('.', '_')open_pic = open("%s" % picture_name, 'rb')b64str = base64.b64encode(open_pic.read())open_pic.close()# 注意這邊b64str一定要加上.decode()write_data.append('%s = "%s"\n' % (filename, b64str.decode()))f = open('%s.py' % py_name, 'w+')for data in write_data:f.write(data)f.close()if __name__ == '__main__':pics = ["bangpai.jpg", "bangpai_renwu.jpg", "bangpai_renwu2.jpg", "goumai_cw.jpg","goumai_sc.jpg","goumai_yp.jpg","shangjiao_cw.jpg","shangjiao_yp.jpg","shimen.jpg","shimen_songxin.jpg","shiyong.jpg","qiecuo.jpg", "qiecuo_yulin.jpg"]pic2py(pics, 'memory_pic') # 將pics里面的圖片寫到 memory_pic.py 中print("ok")

結(jié)果是這樣

使用:

在需要使用的地方導(dǎo)入,就可以把bangpai_jpg當(dāng)作bangpai.jpg來使用。

(不懂的同學(xué)可以百度一下或者CSDN一下base64編解碼哈。)

import base64# 從.py文件獲取圖片 def get_pic(pic_code, pic_name):image = open(pic_name, 'wb')image.write(base64.b64decode(pic_code))image.close() # 導(dǎo)入圖片 get_pic(bangpai_jpg, 'bangpai_jpg') get_pic(bangpai_renwu_jpg, 'bangpai_renwu_jpg') get_pic(bangpai_renwu2_jpg, 'bangpai_renwu2_jpg') get_pic(goumai_cw_jpg, 'goumai_cw_jpg') get_pic(goumai_sc_jpg, 'goumai_sc_jpg') get_pic(goumai_yp_jpg, 'goumai_yp_jpg') get_pic(shangjiao_cw_jpg, 'shangjiao_cw_jpg') get_pic(shangjiao_yp_jpg, 'shangjiao_yp_jpg') get_pic(shimen_jpg, 'shimen_jpg') get_pic(shimen_songxin_jpg, 'shimen_songxin_jpg') get_pic(shiyong_jpg, 'shiyong_jpg')

結(jié)果展示:

打包成功!

運(yùn)行結(jié)果以及日志。

經(jīng)測試,打?qū)殘D,師門任務(wù),幫派任務(wù)全做完了,

在本電腦上測試,效果很好,所有情況都檢測到了,但是換了一臺比較舊的電腦屏幕,偶爾就會(huì)有一個(gè)按鈕檢測不出來,這時(shí)候就需要調(diào)整參數(shù)或者在本機(jī)上抓取圖片來作為基準(zhǔn)(因?yàn)槲覀兪菑钠聊唤貓D和我們保存的圖的相似度來判斷事件是否發(fā)生的,所以屏幕是有關(guān)系的比較老的屏幕一般看起來比較暗,所以偶爾檢測不出來也是正常)。

抓鬼的話沒具體做,只是把代碼寫好了沒有填具體參數(shù)所以沒有功能。因?yàn)橛X得組好隊(duì)只需要跟著別人就好了。10次才需要點(diǎn)擊一次繼續(xù)按鈕。不需要做。當(dāng)然如果有興趣的同學(xué)可以把我的這部分代碼補(bǔ)充完整,然后就可以使用啦。

【注】腳本或程序需要跑在管理員權(quán)限運(yùn)行才行。因?yàn)槭髽?biāo)點(diǎn)擊需要管理員權(quán)限。只是截圖不需要。

總結(jié)

以上是生活随笔為你收集整理的基于计算机视觉的梦幻西游辅助脚本(只用于开发学习技术)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。