教你一个UI自动化框架图像识别原理,知识点最全!
2023-07-02 13:01:32发布 浏览470次 信息编号:61598
友情提醒:凡是以各种理由向你收取费用,均有骗子嫌疑,请提高警惕,不要轻易支付。
教你一个UI自动化框架图像识别原理,知识点最全!
是游戏和应用程序的跨平台编辑器。
·自动脚本录制、一键回放、报表查看,轻松实现流程
·支持基于图像识别的框架,适合所有游戏
·支持基于Poco框架的UI控件搜索,适合,以及App
一句话总结:我们推出了两款基于UI的自动化测试框架(使用截图编写脚本)和Poco(使用界面UI元素编写脚本),您可以使用我们提供的工具快速编写您的自动化测试脚本~
本文重点是对国内图像识别进行代码阅读,加深对图像识别原理的理解
1.准备工作,下载源码
2、我们从最简单的触摸方式开始,就是点击传入的图片。 源代码在api.py中
@
def touch(v, times=1, **):
”“”
触摸
:param v: 触摸,a 或 (x, y)
:param times: 多少次
:param : ``,请参阅文档
:: 成为
::,,iOS
”“”
如果 (v, ):
pos = (v, =ST.)
别的:
()
位置 = v
对于 _ 在范围内(次):
G..触摸(位置,**)
时间。 睡眠(0.05)
n()
位置
click = touch # click是touch的别名
该函数执行点击操作是G..touch(pos, **)
而pos是图片匹配返回的坐标位置,我们重点关注这个函数
@
def(查询,=ST.,=无,=0.5,=无):
”“”
对于图像中的直到
参数:
查询:要在其中找到的图像
: 寻找图像的时间
: 没有
: 睡觉旁边找图片
: 就是找到图片之后
:
:当找不到图像时
:
如果找不到图像,则图像在哪里
被发现于
”“”
(“尝试:\n%s”,查询)
=时间。 时间()
而真实:
= G..(=无)
如果没有:
G..(“没有,可能是”)
别的:
如果 :
询问。 =
= 查询.()
如果 :
()
如果不是无:
()
# 如果超时则引发,如果没有超时则进入下一个循环:
if (time.time() - ) > :
()
raise('%s在'%查询中未找到)
别的:
时间。 睡觉()
首先会获取到截图,然后与脚本传入的图像进行比较,得到匹配的位置
= 查询.()
在cv.py中找到类的方法
def(自身,):
= 自我.()
G..debug("匹配:%s", )
如果不 :
没有任何
= ().getXY(, self.)
重要的是自己。()
@
def(自身,):
# 如果图像文件不存在于:
图像=自我。()
图像 = self.(图像, , ST.)
ret = 无
对于 ST:
如果==“tpl”:
ret = self.(self., 图像, )
elif ==“筛选”:
ret = self.(self., 图像, )
如果不转:
ret = self.(self., 图像, )
别的:
G..(“在:%s”,)
如果返回:
休息
雷特
这里导入的图片需要进行缩放和更改。 编写用例时的屏幕截图进行转换,然后转换为运行用例时的屏幕截图,以提高匹配成功率
图像 = self.(图像, , ST.)
这里的匹配方法会遍历ST中的方法。 该定义位于 .py 文件中,默认包含两个方法。
= [“tpl”,“筛选”]
如果某个方法匹配了,就会返回匹配结果,所以下一步就是弄清楚这些方法是如何实现的。
也会被调用,所以接下来要分析的就是这两个方法
在cv.py中
def(自身,图像,):
aircv.(, 图像, =self., rgb=self.rgb)
def(自身,图像,):
aircv.(, 图像, =self., rgb=self.rgb)
3.先看
空气CV. 具体实现在.py中
def (, , =0.8, rgb=False):
"""函数功能:求最优结果。"""
# 第 1 步:验证图像输入
(,)
# 第二步:计算模板匹配的结果矩阵res
分辨率 = (, )
# 第三步:依次获取匹配结果
, , , = cv2.(res)
h, w = .shape[:2]
# 寻找可信度:
= (, , , , w, h, rgb)
# 求识别位置:目标中心+目标区域:
, = e(, w, h)
= (, , )
.debug("=%s, =%s" % (, ))
if >= else 无
专注于
定义 (, ):
"""获取模板匹配的结果矩阵。"""
# 灰度识别:cv2.( ) 只能处理灰度图像参数
, = (), ()
简历2.(,,简历2。)
这里可以看到,我自己并没有研究一套非常强大的算法,直接使用了模板匹配的方法。
4.然后看另外一个方法
筛选.py
def (, , =0.8, rgb=True, =):
"""基于sift的图像识别,只过滤掉最优区域。"""
# 步骤1:验证图像是否正常:
如果不 (, ):
没有任何
# 第二步:获取特征点集并匹配特征点对:返回值good, pypts, ,
, , 好= (, , )
# 步骤3:根据匹配点对(好),提取并识别区域:
如果 len(好) == 0:
# 匹配点对为0,无法提取识别区域:
没有任何
elif len(好)== 1:
# 匹配点对为1,可信度赋值一个设定值,直接返回:
nts(, 好, ) if >= else None
elif len(好)== 2:
# 匹配点对为2,根据点对计算目标区域,并据此计算可信度:
= nts(,,,,,好)
如果(,字典):
if >= else 无
别的:
, pypts, = nts(, , , , 好)
elif len(好)== 3:
# 匹配点对为3,取出点对,找到目标区域,据此计算可信度:
= 分(, , , , 好)
如果(,字典):
if >= else 无
别的:
, pypts, = 点(, , , , 好)
别的:
# 匹配点对>= 4,使用单矩阵映射找到目标区域,并计算相应的可靠性:
, pypts, = (, , , , 好)
# 第四步:根据识别区域计算结果的可信度,并返回结果:
# 检查识别结果的合理性:如果尺寸小于5像素,或者缩放超过5倍,将被视为非法,直接提出。
()
# 将截图和识别结果缩放到相同大小,准备计算可信度
x_min、x_max、y_min、y_max、w、h =
= [y_最小值:y_最大值, x_最小值:x_最大值]
= cv2.(, (w, h))
= (, , rgb=rgb)
= (, pypts, )
print("[aircv][sift] =%s, =%s" % (, ))
if >= else 无
重点关注如何找到特征点集
定义 (, , ):
"""根据传入的图像,计算图像的所有特征点,得到匹配的特征点对。"""
# 准备工作:初始化sift算子
筛选 = ()
# 步骤1:获取特征点集并匹配特征点对:返回值good, pypts, ,
, = 筛选。(, 无)
, = 筛选。(, 无)
# 应用时,请确保 test 和
# 查询图像大于或等于 knn 匹配中的 of。
如果 len() < 2 或 len() < 2:
raise r("不在输入中!")
# 匹配两张图片中的特征点集,k=2表示每个特征点取出2个最匹配的对应点:
= 弗兰恩.(, , k=2)
好=[]
# good是特征点初选的结果,前两个匹配太紧密的特征点被淘汰,不独特、不优秀的特征点直接筛选掉(直接不适用于多目标识别)
对于 m、n 中的:
如果米。 < * 编号:
好的。 (米)
# 好的点需要去除重复的部分,(源图像不能有重复的点)去重时,找出src图像中的重复点
# 去重策略:允许搜索图像到源图像的特征点一对多映射,不允许多对一重复(即源图像上的一个点不能对应多个点)搜索图像)
, = [], [[]]
对于善中的 m:
= [int([m.].pt[0]), int([m.].pt[1])]
如果不在:
.(米)
.()
好=
, , 好的
至于这个筛子是什么物体
定义():
"""确保 中有 SIFT。"""
如果 cv2..("3."):
#.x,sift 已在,你需要它。
尝试:
筛选 = cv2..(=10)
:
print("要使用 SIFT,您需要使用 .0 进行构建")
raise (“你的系统中没有 SIFT!”)
别的:
#.x,就用它吧。
筛选 = cv2.SIFT(=10)
筛
可见使用的方法也是方法,如果是的话,求图像特征点集的方法就是
CV2..(=10).()
5.总结一下,最终使用的两种方法是模板匹配和特征匹配
模板匹配 cv2。
特征匹配 cv2.(,).(des1,des2,k=2)
以先匹配为准,直接返回结果
六、总结
图像识别,利用图像识别来定位ui控件无法定位的地方,支持部分自定义控件、H5、小程序、游戏;
它支持多种终端。 如果使用图像识别,一套代码就可以兼容ios。 如果使用ui控件进行定位,则需要兼容。
缺点:对于透明背景的按钮或者控件,识别起来比较困难
本文内容请勿用于商业用途。 若涉及知识产权问题,请联系博维丰小编(-8017),我们将立即处理
提醒:请联系我时一定说明是从星空网上看到的!