pyaotugui.locateOnScreen()找不到坐标的解决思路

出于解放双手的想法,使用pyautogui对品目软件进行操作,静态图片识别很准确,但是对于实时运动的界面,图片识别就不稳定了。

一、解决思路:

获取屏幕截图后,使用像素对比实现两个图片找出相同的坐标,然后返回中心坐标。

下面开始代码实现。

二、实现思路:

需要的库PIL以及pyautogui

安装教程网上都有。。。

举例图片:左图为原图,右图为需要找的动态运动的图:

pyaotugui.locateOnScreen()找不到坐标的解决思路pyaotugui.locateOnScreen()找不到坐标的解决思路

1.获取两张图的所有像素点的rgb

2.从左边途中找到右边图的左上角

3.以此为起点对比两张图的奇遇像素点是否相同(或者偏差在固定范围内)

4.完全符合条件返回中心坐标

代码如下:

import pyautogui
from PIL import Image
import timeit
  

def to_position():
    # 系统找图速率做对比
    res = pyautogui.locateCenterOnScreen(file_name2)
    time2 = time.time()

def get_position(self, file_name1, file_name2):
    """
    传入需要获得坐标的小图路径
    返回值为空表示没找到
    """

    im1 = Image.open(file_name1)
    im2 = Image.open(file_name2)
    pix1 = im1.load()
    pix2 = im2.load()
    width1 = im1.size[0]
    height1 = im1.size[1]
    width2 = im2.size[0]
    height2 = im2.size[1]

    rgb2 = pix2[0, 0][:3]  # 左上角起始点
    for x in range(width1):
        for y in range(height1):
            rgb1 = pix1[x, y][:3]
            if rgb1 == rgb2:
                # 判断剩下的点是否相同
                status = 0
                # 图二的坐标是(s, j) --- (s-x, j-y)
                for s in range(x, x + width2):
                    for j in range(y, y + height2):
                        # 设置阈值范围
                        if abs(pix2[s-x,j-y][0]-pix1[s,j][0]) > 60 and  abs(pix2[s-x,j-y][1]-pix1[s,j][:3][1]) > 60 and abs(pix2[s-x,j-y][1]-pix1[s,j][:3][1]) > 60:
                            status = 1
                if status:
                    continue
                else:
                    return x + round(0.5 * width2), y + round(0.5 * height2)

print(timeit.Timer(lambda :get_position()).timeit(5))
print("*****************")
print(timeit.Timer(lambda :to_posi()).timeit(5))

通过测试,发现动图可以精确的找到坐标,而且速度略胜与直接调用pyautogui的找坐标方法。

如果有更好的思路,希望可以一起交流~