QQ游戏 找茬脚本
前言
畢設干擾了前一段記錄筆記的進度,閑暇時刻用找茬消遣,但有時發現五處不同僅僅找出兩三處,這種呼之欲出卻無法求得的感覺非常難受。于是制作了適用于QQ游戲大廳–>大家一起來找茬 的輔助器,此篇博客的筆記由函數與打包組成。
思路
界面–>屏幕截取–>對比找出不同–>鼠標自動點擊
一、界面
運用最近接觸到的pyqt5,界面的設計要點:小巧。
class window(QMainWindow): def __init__(self):super().__init__()self.resize(300,50)self.move(100,100)self.setWindowTitle('連連看作弊器')#textself.text = QTextEdit(self)self.text.resize(150,25)self.text.setText('處理信息')#button startself.button = QPushButton('開始',self)self.button.clicked.connect(self.grabphoto)self.button.resize(150,25)self.button.move(150,0)#button stopself.button1 = QPushButton('停止',self)self.button1.clicked.connect(self.stop)self.button1.resize(150,25)self.button1.move(150,25)self.button.setShortcut('CTRL+C')#QComboBoxself.comboBox_1 = QComboBox(self)self.comboBox_1.resize(150,25)self.comboBox_1.move(0,25)self.comboBox_1.addItem("--請選擇--")self.comboBox_1.addItem("僅供提示")self.comboBox_1.addItem("機器暴力模式")self.comboBox_1.currentText()
combox的讀取 currentText和Index可以直接使用。
快捷鍵設置setShortcut,需要鼠標焦點于界面
二、屏幕截取
雖然有通過句柄獲取窗口信息的截圖方法,但是考慮到后序辨別效果不佳的時候還需有人操作,所以無法采用后臺掛機的方法。
Imagegrab截圖時間間隔長,不建議使用。
采用速度較快的屏幕截取的方式:PIL庫中pyautogui.screenshot。
注:截下來的圖需要轉為數組才可提供處理。
三、圖片對比
這一項是關鍵,曾簡單認為圖片像素相減不就功到渠成?
但發現游戲提供的圖片在亮度和色調上有細微的不同,相減后呈現很詭異的顏色。
直到我在一篇博客上找到:圖片反色相合,差異會十分明顯。
這幅圖就是輔助器根本功能之一,代碼、邏輯簡單到我不敢相信,但肯定要補上自動點擊功能才能算較為圓滿。
canny邊緣提取 -->閉運算–>findcontours–>符合要求?–>改變閉運算參數–>…直到符合要求或者超出限制。
findcontours 在opencv3中返回三個參數,其中首項輪廓點是我最為需要的。
counters = h[0] 第一個輪廓點集合 counters[1] 第一個輪廓的第一個點的信息 counters[1][0][0] 第一個輪廓的第一個點的橫坐標以上做法是通過輪廓提取的,那么點集的中間點(鼠標需要點擊的點)應該囊括均值點。
模擬鼠標點擊
我還應該注意的是若識別輪廓過多,會喪失鼠標的控制權(預處理不合適),應該加以限制。
總結
當不同十分靠近的時候,膨脹可能會相連,識別出的點會小于五個,只能通過肉眼+輔助圖像完成挑戰。
打包 pyinstaller
pip install pyinstaller命令行運行:
pyinstaller --version確認安裝成功。
我犯下錯誤原因是:僅僅在pycharm中刪除了3.6.6編譯器,但卻沒有在工作路徑path中刪除,以致于每次打包尋找依賴庫的時候錯誤尋址。
我的電腦–屬性–左側,高級系統設置–高級–環境變量–Path–上下移動改變路徑優先級–加入編譯器、編譯器庫路徑。
打包操作(細致參數調配百度 pyinstaller 第一條):
cmd – 轉到main.py路徑 – pyinstaller -F -w main.py – dist 中exe需要與mian.py相同的工作環境(圖片,音樂相對路徑相同),往上移一層即可。
源碼
from PyQt5.Qt import * import cv2 import pyautogui import sys import numpy as np from PIL import ImageChops,Imageclass window(QMainWindow):def __init__(self):super().__init__()self.resize(300,50)self.move(100,100)self.setWindowTitle('連連看作弊器')#textself.text = QTextEdit(self)self.text.resize(150,25)self.text.setText('處理信息')#button startself.button = QPushButton('開始',self)self.button.clicked.connect(self.grabphoto)self.button.resize(150,25)self.button.move(150,0)#button stopself.button1 = QPushButton('停止',self)self.button1.clicked.connect(self.stop)self.button1.resize(150,25)self.button1.move(150,25)self.button.setShortcut('CTRL+C')#QComboBoxself.comboBox_1 = QComboBox(self)self.comboBox_1.resize(150,25)self.comboBox_1.move(0,25)self.comboBox_1.addItem("--請選擇--")self.comboBox_1.addItem("僅供提示")self.comboBox_1.addItem("機器暴力模式")self.comboBox_1.currentText()# LU(541,468)RU(921,468) LD(541,753)RD(921,753) LU(998,468) RU(1378,468) (998,753) (1378,753) # img1 = pyautogui.screenshot(region=[541,468,380,285]) # img2 = pyautogui.screenshot(region=[998, 468, 380, 285]) # img3 =ImageChops.invert(img2) # Image.blend(img1,img3,0.5).show()def grabphoto(self):self.text.setText('正在進行處理')# img1 = pyautogui.screenshot(region=[541,468,380,285])# img2 = pyautogui.screenshot(region=[998,468,380,285])img1 = Image.open('1.png')img2 = Image.open('2.png')img3 =ImageChops.invert(img2)img4 = Image.blend(img1,img3,0.5)img5 = np.array(img4)#膨脹腐蝕做法'''kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) # 定義一個核dst = cv2.filter2D(img5, -1, kernel=kernel)dst = cv2.filter2D(dst, -1, kernel=kernel)cv2.imshow('1',dst)img3 =ImageChops.invert(img2)img4 = Image.blend(img1,img3,0.5)img5 = np.array(img4)kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) # 定義一個核dst = cv2.filter2D(img5, -1, kernel=kernel)dst = cv2.filter2D(dst, -1, kernel=kernel)cv2.imshow('1',dst)gray = cv2.cvtColor(dst, cv2.COLOR_RGB2GRAY) # 把輸入圖像灰度化cv2.imshow("binary2", gray)gray = np.array(gray)newgray = np.array(gray)allgray = gray.sum()/(380*285)for i in range(380):for j in range(285):if gray[j][i] < allgray+50:newgray[j][i] = 0else:newgray[j][i] = 255cv2.imshow("contours", newgray)kernel = np.ones((2,2),np.uint8)closing = cv2.morphologyEx(newgray,cv2.MORPH_CLOSE,kernel)kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, kernel1)kernel = np.ones((15,15),np.uint8)closing = cv2.morphologyEx(opening,cv2.MORPH_CLOSE,kernel)h = cv2.findContours(closing, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)contours = h[0]i = 5while len(contours) > 5 and i >0:kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, kernel1)print(i)i-=1xall = yall = 0for i1 in range(len(contours)):for i2 in range(len(contours[i1])):xall += contours[i1][i2][0][0]yall += contours[i1][i2][0][1]a = xall/len(contours[i1]) + 541b = yall/len(contours[i1]) + 468if self.comboBox_1.currentIndex() == 2:pyautogui.click(a,b,interval=0.5,clicks=1,button='left')xall = yall = 0'''img6 = cv2.Canny(img5,90,150)kernel = np.ones((20,20),np.uint8)closing = cv2.morphologyEx(img6,cv2.MORPH_CLOSE,kernel)self.h = cv2.findContours(closing, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)a = 18while len(self.h[0]) > 10 and a > 1 :kernel = np.ones((a, a), np.uint8)closing = cv2.morphologyEx(img6, cv2.MORPH_CLOSE, kernel)self.h = cv2.findContours(closing, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)self.text.setText(f'第{18-a}次處理')a -= 1counters = self.h[0]#五個輪廓xall = yall = 0if len(counters) < 15:for i1 in range(len(counters)):for i2 in range(len(counters[i1])):xall += counters[i1][i2][0][0]yall += counters[i1][i2][0][1]a = xall/len(counters[i1]) + 541b = yall/len(counters[i1]) + 468if self.comboBox_1.currentIndex() == 2:pyautogui.click(a,b,interval=0.5,clicks=1,button='left')xall = yall = 0cv2.imshow('heibai',closing)cv2.imshow('caise', img5)def stop(self):passif __name__ == '__main__':app = QApplication(sys.argv)a = window()a.show()sys.exit(app.exec_())總結
- 上一篇: python进程池pool_python
- 下一篇: 阿里巴巴优酷视频增强和超分辨率挑战赛-持