SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

pip安装时,注意一下windows的权限,我系统是win10,安装的时候提示文件夹没有权限无法写入,我重新跟文件夹设置过权限的,先更改文件夹的所有者,然后改的权限

 

 

pip安装:

1、首先

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pywin32
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pillow

 

2、然后,升级一下pip,然后再安装pyHook

  pyHook下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

python -m pip install --upgrade pip
pip install pyHook-1.5.1-cp37-cp37m-win_amd64.whl

 

3、接着

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyuserinput

 

 

用到的工具:

  窗口查找工具 WinSpy-1.0.3:用来查找窗口的信息

 

 

 优化:

  用一张模板来匹配,正确率不是很高,准备改为用一个数据集(多张模板)来进行多次匹配,然后对匹配到的坐标进行去重(去相似点)

  截图:以前的截图方法不知道怎么的在win10上很慢,并且有时候打开是黑屏图片,所以就换了一个

 

 

截屏代码:

from PIL import ImageGrab

im = ImageGrab.grab() #可以添加一个坐标元组进去
im.save('1.jpg')

 

 

 

代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt

import win32gui, win32ui, win32con
from ctypes import windll
from PIL import Image

import time
from pymouse import PyMouse






# 全局变量
left_top=(0, 0)# 窗口左上角的坐标
arr=[]# 图像匹配到的点
arr_res=[]# 已去相似点




# 截图
def getScreenshots():
    #获取后台窗口的句柄,注意后台窗口不能最小化
    #窗口的类名可以用Visual Studio的SPY++工具获取
    className = "Photo_Lightweight_Viewer"
    titleName = "game-big.jpg - Windows 照片查看器"
    hWnd = win32gui.FindWindow(className, titleName) 
    #获取句柄窗口的大小信息
    left, top, right, bot = win32gui.GetWindowRect(hWnd)
    left_top=(left,top)# 全局变量赋值
    width = right - left
    height = bot - top
    #返回句柄窗口的设备环境,覆盖整个窗口,包括非客户区,标题栏,菜单,边框
    hWndDC = win32gui.GetWindowDC(hWnd)
    #创建设备描述表
    mfcDC = win32ui.CreateDCFromHandle(hWndDC)
    #创建内存设备描述表
    saveDC = mfcDC.CreateCompatibleDC()
    #创建位图对象准备保存图片
    saveBitMap = win32ui.CreateBitmap()
    #为bitmap开辟存储空间
    saveBitMap.CreateCompatibleBitmap(mfcDC,width,height)
    #将截图保存到saveBitMap中
    saveDC.SelectObject(saveBitMap)
    #保存bitmap到内存设备描述表
    saveDC.BitBlt((0,0), (width,height), mfcDC, (0, 0), win32con.SRCCOPY)
    #保存图像 保存bitmap到文件
    saveBitMap.SaveBitmapFile(saveDC,"img_screenshots.jpg")    




# 图片识别返回坐标
def getCoordinates():
    arr=[]
    
    # 截屏保存
    getScreenshots()
    
    # 1. 读入原图和模板    
    img_rgb=cv2.imread('img_screenshots.jpg')            
    img_gray=cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
    template=cv2.imread('game-smart.jpg', 0)
    h, w=template.shape[:2]

    # 归一化平方差匹配
    res=cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
    threshold=0.5

    # 返回res中值大于0.8的所有坐标
    # 返回坐标格式(col,row) 注意:是先col后row 一般是(row,col)!!!
    loc=np.where(res >= threshold)

    # loc:标签/行号索引 常用作标签索引
    # iloc:行号索引
    # loc[::-1]:取从后向前(相反)的元素
    # *号表示可选参数
    for pt in zip(*loc[::-1]):
        right_bottom=(pt[0] + w, pt[1] + h)
        cv2.rectangle(img_rgb, pt, right_bottom, (0, 0, 255), 2)
        # 中心点
        center_point=(int(pt[0]+w/2), int(pt[1]+h/2))
        arr.append(center_point)       
        left2=(center_point[0]-2,center_point[1]-2)
        right2=(center_point[0]+2,center_point[1]+2)
        cv2.rectangle(img_rgb, left2, right2, (0, 255, 0), 2)
        
    # 保存处理后的图片
    cv2.imwrite('img_screenshots_res.png', img_rgb)
    
    # 显示图片 参数:(窗口标识字符串,imread读入的图像)
    #cv2.imshow("test_image", img_rgb)
    return arr




# 判断坐标是否相似
def isLike(arr, obj):
    for item in arr:
        if (abs(item[0]-obj[0])<5) and (abs(item[1]-obj[1])<5):
            return True
    return False



# 坐标数组
arr=getCoordinates()
arr_res=[]





# 去相似坐标
for item in arr:
    if isLike(arr_res, item)==False:
        # 转换为真实坐标
        x=item[0]+left_top[0]
        y=item[1]+left_top[1]
        arr_res.append((x,y))
        
                

# 模拟点击
mouse = PyMouse()
for item in arr_res:    
    time.sleep(5) # 休眠1秒
    print(item)
    mouse.click(item[0], item[1])  #移动并且在(x,y)位置左击







# 窗口等待任意键盘按键输入 0为一直等待 其他数字为毫秒数
cv2.waitKey(0)

# 销毁窗口 退出程序
cv2.destroyAllWindows()

 

 

game-smart.jpg

Python 辅助 测试版1 随笔 第1张

 

 

game-big.jpg

Python 辅助 测试版1 随笔 第2张

 

 

 

 

未完。。。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄