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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QQ游戏 找茬脚本

發布時間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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。

img1 = pyautogui.screenshot(region=[541,468,380,285])img2 = pyautogui.screenshot(region=[x,y,length,height])

注:截下來的圖需要轉為數組才可提供處理。

三、圖片對比

這一項是關鍵,曾簡單認為圖片像素相減不就功到渠成?
但發現游戲提供的圖片在亮度和色調上有細微的不同,相減后呈現很詭異的顏色。
直到我在一篇博客上找到:圖片反色相合,差異會十分明顯。

img3 =ImageChops.invert(img2) img4 = Image.blend(img1,img3,0.5) img5 = np.array(img4) (網絡源碼)


這幅圖就是輔助器根本功能之一,代碼、邏輯簡單到我不敢相信,但肯定要補上自動點擊功能才能算較為圓滿。
canny邊緣提取 -->閉運算–>findcontours–>符合要求?–>改變閉運算參數–>…直到符合要求或者超出限制。

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)

findcontours 在opencv3中返回三個參數,其中首項輪廓點是我最為需要的。

counters = h[0] 第一個輪廓點集合 counters[1] 第一個輪廓的第一個點的信息 counters[1][0][0] 第一個輪廓的第一個點的橫坐標

以上做法是通過輪廓提取的,那么點集的中間點(鼠標需要點擊的點)應該囊括均值點。
模擬鼠標點擊

pyautogui.click(a,b,interval=0.5,clicks=1,button='left')

我還應該注意的是若識別輪廓過多,會喪失鼠標的控制權(預處理不合適),應該加以限制。

總結

當不同十分靠近的時候,膨脹可能會相連,識別出的點會小于五個,只能通過肉眼+輔助圖像完成挑戰。

打包 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_())

總結

以上是生活随笔為你收集整理的QQ游戏 找茬脚本的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。