開發簡易影像辨識腳本小工具
2022, Sep 05
這是一個因為遊戲中的重複作業實在是太麻煩了,又浪費時間,所做出來的小工具
網路上搜了半天沒有找到一個同時包含腳本、辨識的輕量化小工具,因此想自己開發一個
Library也非常簡單,主要以下三個就好,辨識 & 控制滑鼠、鍵盤
- pyautogui
- cv2
- json
設定檔 (config.json)
為了讓使用者可以自行編輯腳本,規劃設定檔如下
- image: 代表此動作要影像辨識
- command: 輸入影像實體路徑
- dir: 對圖片做的動作 (left、right 左右鍵)
{"type":"image", "command":"A.jpg","dir":"left", "alt":"A_alt.jpg"},
- button: 代表此動作要按下某按鈕
- command: 按下的按鈕
- dir: 留空
{"type":"button","command":"num0","dir":""},
- long: 代表此動作要按下滑鼠
- command: 留空
- dir: left、right 左右鍵
{"type":"long","command":"","dir":"left"}
而組合而成後,就代表要先辨識A圖片後按下左鍵 => 按下數字鍵0 => 按下滑鼠左鍵
{"type":"image", "command":"A.jpg","dir":"left", "alt":"A_alt.jpg"},
{"type":"button","command":"num0","dir":""},
{"type":"long","command":"","dir":"left"}
程式碼
程式啟用後鍵入的設定
- 次數: 跑config.json流程的次數
- 信度: 辨識圖片的信度,越高越嚴謹
- 間格秒數: 每個流程的間隔
- 灰度匹配: 先轉成黑白在辨識
runtime = input("次數: ")
conf = float(input("信度: "))
sec = float(input("間隔秒數: "))
isGray = input("啟用灰度匹配 (Y/N): ").upper()
將設定檔轉為JSON物件,讓不同type跑不同的動作
for i in jsonObject:
type = i["type"]
commmand = i["command"]
dir = i["dir"]
if type == "button":
press(commmand)
elif type == "image":
path = img_dir + commmand
if not locate_click(path, alt_path, t=0.35, button = dir):
break;
elif type == "long":
long_click(button=dir)
else:
print("not defind")
time.sleep(sec)
辨識圖片則是locateOnScreen檢查有沒有圖片在當前螢幕中後點擊
box = locateOnScreen(img,confidence=conf, grayscale=isGrayscale)
print(imgname, "found at:\n\t", box)
if box is None:
if alt is not None:
locate_click(alt, button=button)
print("找不到圖片" + imgname)
這樣一個簡單的腳本小工具就完成了, 後續只要更改Config.json即可,小工具Repo如以下連結 FFXIV_Cook_Guildleve
附加! 直接抓FFXIV的Process來執行腳本
為考慮到我僅擁有單一螢幕,且不希望腳本運行佔據我的螢幕空間,我開發了一個新的UI腳本工具。如下圖所示,使用者可以透過UI編輯腳本,然後直接在FFXIV視窗中執行。
- 可透過UI拖曳改變執行順序,儲存腳本
- 若所選類型為 [Text],則訊息將傳送至遊戲對話框。
- 若所選類型為 [Button],則按鈕將被傳送至遊戲視窗。
- 設定執行次數
- 設定執行N次後中途插入額外腳本
這樣腳本工具更具有彈性了 後續只要透過UI修改腳本即可,小工具Repo如以下連結 FFXIVMacroController