Python辅助-找图功能(你还在用pyautogui?)

前言

在游戏的脚本类辅助中,避免不了一个功能,那就是找图返回图像在屏幕上的坐标,对于找图功能,现成的方法,现成的脚本工具数不胜数,但是至于精度那就不好说了。举个现成方法的例子,在python自动化中,pyautogui有个方法为locateOnScreen(image="图片路径"),其作用为在桌面上找到路径中设置的图片,并返回坐标元组,这个方法能找到图的前提是所传路径图和桌面图完全一致,即必须100%匹配,这是一个缺点也是优点,例如找桌面图标,我图标换个地方摆,它可能就找不到了,因为背景变了。另外举个现成工具例子,在按键精灵中自带找图功能,而且很方便,一般的找图完全适用,且可以设置图像匹配率,但是在某些情况下他还是无法胜任,也是因为某些游戏背景是处于一个动态变换的原因。这里分享一个通过python完成一个可多参数控制的识图功能。

涉及的算法

不要怕,最后我会将自己封装的工具方法发出来,直接复制粘贴传参就行,要传的参数见下方可控参数。

本文章的图像识别主要用到的是基于SIFT检测算法,在图像识别这块,浅度的识别比较知名的有SIFT、SURF、ORB,而SIFT是精度最高的一种,他能在不同尺度、旋转、光照变化和视角变化的情况下都能保持较好的检测性能。

可控参数

max_init_num:最大搜索系数,范围0.1~1,系数越小精度越高,建议不要高于0.5(我给你建议那就是因为自己测试过),当然我们这里会做成一个从0.1循环搜索图片,自增到我们设置的最大系数。

trees:索引树数量,数量越大,精度越高,但相应的耗时越高,建议100

checks:索引树遍历次数,数量越大,精度越高,但相应耗时越高,建议1000

img_url:即要匹配的图像的路径(注意路径不可含有中文,图片名也不可含有中文)

功能目的

即在屏幕上找到我们期望的图片,并返回位置信息

所需库

import os
import cv2
import pyautogui

正文

第一步:获取两张图片数据

因为是要在屏幕找图,所以直接用pyautogui直接全屏截图对比即可,截下来的图会自动保存到当前目录,最后面用os删掉就行了

语句解释:通过screenshot截取了全屏图片命名为screen.png并放在当前目录下,然后通过cv2.imread分别读取截取的屏幕图的图像数据和我们期望寻找的图像的数据,返回的数据是一个numpy数组,若为彩色图像则是一个三维的numpy数组。

pyautogui.screenshot(imageFilename="screen.png")
screenPic=cv2.imread("screen.png")
img_url=r"C:\testpic\wx.png"
myPic=cv2.imread(img_url)

第二步:获取两张图关键点和描述符

要获取图像的关键点和描述符就需要SIFT对象,通过cv2创建即可,然后经过sift对象的检测和计算获取到两张图的监测点和描述符。

sift=cv2.SIFT_create()
screenPicKP,screenPicDES=sift.detectAndCompute(screenPic,None)
myPicKP,myPicDES=sift.detectAndCompute(myPic,None)

第三步:准备匹配器

这里就用到了我们所说的可控参数,索引树数量,索引树遍历次数。

这里我选择了Flann匹配器,因为简单且直接,对于小型数据集或实时应用运算速度较快。

语句解释:

如下indexParams表示定义索引数量,searcheParams表示定义单个索引遍历次数,这两个参数是构成Flann匹配器的基本条件,因此再通过cv2.FlannBasedMatcher传入参数就得到了flann匹配器了。

trees=100
checks=1000
indexParams=dict(algorithm=0,trees=int(trees))
searcheParams=dict(checks=int(checks))
flann=cv2.FlannBasedMatcher(indexParams,searcheParams)

第四步:开始匹配获取匹配结果集

解释:调用flann匹配器的knn匹配法,传入两张图的描述符数据,k表示要返回的最近邻的数量。然后通过sorted方法根据描述符中特征点的距离distance进行一个排序,因为后面会取中位数作为最优匹配

matches=flann.knnMatch(screenPicDES,myPicDES,k=2)
matches=sorted(matches,key=lambda x:x[0].distance)

第五步:筛选最优匹配输出坐标

解释:

x,y用于存放最后找到图返回的坐标,没找到就是None

max_init_num是我们的可控参数,表示期望最大的匹配率,建议0.3~0.5,过小会找不到,过大会找错。

如下定义的循环条件是当初始匹配系数小于我们设置的最大系数时,就不断进行循环查找最优匹配并填充坐标值

最后我们通过os移除了截屏的图片

x, y = None, None
max_init_num=0.4
init_num=0.1
init_num=float(init_num)
while init_num<=max_init_num:
    goodMatches=[]
    for m,n in matches:
        if m.distance<init_num*n.distance:
            goodMatches.append(m)
    index=int(len(goodMatches)/2)
    try:
        x,y=screenPicKP[goodMatches[index].queryIdx].pt
        break
    except:
        init_num=init_num+0.1
os.remove("screen.png")
print("图像在屏幕上的x坐标为:"+str(x))
print("图像在屏幕上的y坐标为:"+str(y))

测试:

初步测试

首先测试能否找图,可以看到找到图并获取到了坐标,然后用pyautogui.moveTo将鼠标自动移上去了。

模糊测试

我向图片添加了三次马赛克进行了模糊处理,这种识图方法依旧能够识别到,可见其识别能力还是很不错的,这里用的最大搜索系数为0.1

封装为方法:

import os
import cv2
import pyautogui

"""
全屏幕找图,返回图坐标x,y,没找到图则返回None,None
    max_init_num:最大搜索系数,0.1~1.0,越低越精确,建议不要高于0.5,
    trees:索引树数量,建议100
    checks:索引树遍历次数,建议1000
    img_url:要找的图的文件路径(路径不能含有中文,图片名不能含有有中文)
"""
def FindImgOnScreen(max_init_num,trees,checks,img_url):
    init_num=0.1
    #截取屏幕图
    pyautogui.screenshot(imageFilename="screen.png")
    #读取屏幕图
    screenPic=cv2.imread("screen.png")
    #要匹配的图
    myPic=cv2.imread(img_url)

    #获取两图关键点和描述符
    sift=cv2.SIFT_create()
    screenPicKP,screenPicDES=sift.detectAndCompute(screenPic,None)
    myPicKP,myPicDES=sift.detectAndCompute(myPic,None)

    #获取FLANN匹配器
    indexParams=dict(algorithm=0,trees=int(trees))
    searcheParams=dict(checks=int(checks))
    flann=cv2.FlannBasedMatcher(indexParams,searcheParams)

    #FLANN匹配器进行KNN匹配
    matches=flann.knnMatch(screenPicDES,myPicDES,k=2)
    #根据描述符距离排序
    matches=sorted(matches,key=lambda x:x[0].distance)


    #筛选优秀匹配
    x, y = None, None
    init_num=float(init_num)
    while init_num<=max_init_num:
        goodMatches=[]
        for m,n in matches:
            if m.distance<init_num*n.distance:
                goodMatches.append(m)
        #获取最佳坐标
        index=int(len(goodMatches)/2)
        try:
            x,y=screenPicKP[goodMatches[index].queryIdx].pt
            return x,y
        except:
            init_num=init_num+0.1

    os.remove("screen.png")
    return x,y

附上自己的资源站

源码资源尽在https://www.tbszyw.com 

  • 30
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 这是一个名为"python-doipclient-main.zip"的文件。根据文件名可以猜测,它可能是一个Python脚本或程序的压缩文件。其中的"doipclient"可能代表了一个特定的功能或用途。 根据我的理解,这个压缩文件可能包含一些用于构建或扩展DOIP(诊断超过IP)客户端的Python代码。DOIP是一种基于TCP/IP的通信协议,用于在汽车电子系统之间进行诊断和通信。DOIP客户端是一个用于与DOIP服务器进行通信、发送和接收诊断请求和响应的软件。 这个压缩文件可以用于安装、配置和使用DOIP客户端。要使用这个文件,我们需要将其解压缩到我们选择的目标文件夹中。解压后,我们可以查看里面的文件和文件夹,可能包括Python脚本、模块、文档或其他必需的资源。我们可以根据提供的文档或说明来了解如何正确配置和运行DOIP客户端。 为了正确运行DOIP客户端,可能需要安装Python解释器和其他可能的依赖项。这些信息可能包含在压缩文件中的文档中,或者可以在DOIP客户端项目的官方网站或资源库中找到。 总之,"python-doipclient-main.zip"是一个用于构建和扩展DOIP客户端的Python代码的压缩文件。通过解压缩、配置和运行其中包含的文件,我们可以使用该客户端与DOIP服务器进行通信和诊断汽车电子系统。 ### 回答2: "python-doipclient-main.zip" 是一个压缩文件,其中包含了一个 Python 软件包。这个软件包是用于创建和管理 DOIP(Diagnostic over Internet Protocol)客户端的。 DOIP 是一种基于 Internet 的诊断协议,主要用于汽车行业中的诊断工具和服务。在汽车维修和诊断过程中,DOIP 协议允许诊断工具通过互联网与车辆的电子系统进行通信,以便进行故障排除、参数设置和软件更新等操作。 "python-doipclient-main.zip" 这个压缩文件提供了一个 Python 软件包,该软件包可以帮助开发人员快速搭建和部署 DOIP 客户端。使用这个软件包,开发人员可以轻松地创建一个连接到 DOIP 服务器的客户端,并实现与车辆电子系统的通信。 该软件包还提供了一些常见的 DOIP 客户端功能,例如建立和维护 DOIP 会话的能力,发送和接收 DOIP 消息的功能,以及处理 DOIP 协议中的各种数据单元的功能。 开发人员可以解压 "python-doipclient-main.zip" 文件,并按照软件包中的说明进行安装和使用。这个软件包提供了一些示例代码和文档,有助于开发人员理解和使用这个 DOIP 客户端软件包。 总之,"python-doipclient-main.zip" 是一个 Python 软件包的压缩文件,用于创建和管理 DOIP 客户端。它为开发人员提供了方便快捷的方式来开发与车辆电子系统进行通信的应用程序。 ### 回答3: python-doipclient-main.zip 是一个文件夹压缩包,其中包含了一个名为"python-doipclient-main"的文件夹。 这个文件夹是一个Python实现的DOIP(Diagnostics over Internet Protocol)客户端。DOIP是一种用于诊断汽车电子控制单元(ECU)的协议,通过互联网进行诊断和通信。 在这个文件夹中,我们可以找到数个Python文件和文件夹。其中最重要的是"doip_client.py"文件。这个文件通过使用Python编写的DOIP客户端来实现与ECU的通信。 其他一些辅助文件和文件夹可能包含一些配置文件、日志文件或测试脚本。这些文件和文件夹可以帮助我们配置和调试DOIP客户端。 使用这个Python DOIP客户端,我们可以连接到目标ECU,发送诊断请求并接收诊断响应。这个客户端提供了丰富的功能和API,使得与ECU进行诊断和通信变得更加简单和便捷。 通过使用Python编程语言,我们可以根据自己的需求对这个DOIP客户端进行二次开发和定制。这样我们就可以根据实际情况进行扩展和改进,以满足特定的诊断需求。 总之,python-doipclient-main.zip 是一个包含Python实现的DOIP客户端的文件夹压缩包。通过这个客户端,我们可以方便地进行汽车电子控制单元的诊断和通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值