Python图像识别及操作
导语
自动化测试实施过程中,由于Android或web部分控件和区域无法通过uiautomator或hierarchy、selenium等系统提供的方式获取相关区域属性,无法通过控件属性访问指定区域,实现操作和断言自动化动作。因此,集成截图查找功能,通过自动化脚本编写过程中,截取图片部分区域用于预操作或断言设置。在执行过程中,动态的从终端设备中截取当前屏幕截图进行对比,完成操作和断言自动化动作。
环境配置
安装环境
1.Python3.7+环境
2.OpenCV安装,打开CMD终端,使用pip install opencv-python安装OpenCV
3.Numpy安装,打开CMD终端,使用pip install numpy安装Numpy模块
截图查找功能可完成的自动化动作
点击操作(Click By Image)
在自动化脚本编写过程中,截取指定屏幕截图中的某一区域。在自动化脚本执行过程中,通过匹配该区域截图在当前屏幕截图中的坐标位置,计算区域截图中间点(或区域截图中任一点)的实际坐标值,通过uiautomator或webdriver提供的点击坐标方法进行模拟点击操作。
断言操作(Assert Image)
在自动化测试中,需要对自动化测试结果进行判断,由于部分控件或区域无法通过控件属性进行判断。因此,考虑到对上述点击操作的截图查找方法的扩展,截取指定屏幕截图中的某一区域用于断言。在自动化脚本执行过程中,可以通过匹配该区域截图是否在当前屏幕截图中进行判断,到达通过图片进行断言的功能。
截图查找功能的Demo实现(以Android为例)
截图方法
通过screencap方法进行截图:
1.终端设备操作跳转到指定界面
2.输入adb shell screencap /sdcard/test.png 进行截取当前界面截图
3.输入adb pull /sdcard/test.png . 将截图下载到本地
4.使用图片浏览工具,打开图片,使用微信截图或其他截图工具截取图片中想要点击或断言的部分,保存作为匹配截图。
Demo实现
1.导入cv2和numpy包
2.#!/bin/env python
# coding:utf-8import cv2import numpy as np
3.使用cv2读取匹配截图和目标匹配截图
1.1匹配截图(srcImage)
1.2 目标匹配截图(desImage)
desImage = cv2.imread(‘destination.png’) # 读入一副彩色图像,图像透明度会被忽略
srcImage = cv2.imread(‘source.png’, 0) # 单通道读取,即灰白图像
图片处理
img_gray = cv2.cvtColor(desImage, cv2.COLOR_BGR2GRAY) # 对目标截图进行色彩空间转换,RGB转换为GRAY
h, w = srcImage.shape[:2] # 读取srcImage 高度和宽度
模版匹配方法
res = cv2.matchTemplate(img_gray, srcImage, cv2.TM_CCOEFF_NORMED) # 对转换后的目标截图和匹配截图进行模版匹配
获取匹配度较高的图片位置属性
threshold = 0.97 # 匹配度值0.97, 匹配度最大值为1
loc = np.where(res >= threshold) # 筛选出匹配度大于0.97的图片位置属性
计算坐标值,并描画到目标匹配截图上
for pt in zip(*loc[::-1]): # *号表示可选参数right_bottom = (pt[0] + w, pt[1] + h) # 右下角位置坐标cv2.rectangle(desImage, pt, right_bottom, (0, 0, 255), 1) # 画出矩形位置print ((pt[0] + w + pt[0]) / 2, (pt[1] + h + pt[1]) / 2) # 打印图片中心点坐标值
计算出最后一个匹配结果的图片中心点坐标值,并实现点击操作
x, y = ((pt[0] + w + pt[0]) / 2, (pt[1] + h + pt[1]) / 2) # 计算最后一个匹配区域的中心点坐标值
import os
os.system("adb shell input tap {0} {1}".format(x, y)) # 执行点击操作
展示匹配结果
cv2.imshow("result", desImage) # 展示匹配结果图片
cv2.waitKey(0) # 等待关闭图片窗口
cv2.destroyAllWindows() # 销毁所有窗口
相关Demo源码
封装代码
截图点击方法
# DeviceMassage 设备号 获取方法:adb devices 必填项 否则会报错找不到要执行的设备
# destinationImage 大图位置+名字,代表要点击的界面格式 destination.png 或 D:\Pytest\Test\venv\destination.png
# sourceImage 小图位置+名字,代表被点击按钮,格式 source.png 或 D:\Pytest\Test\venv\source.png
# TypeNumber 属性值 1代表截图后对比,2代表直接按照传入的值对比,若选择2则需要预先准备好大图
# FileOkPath 成功会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ok/ 或 D:/Pytest/ok/
# FileNgPath 失败会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ng/ 或 D:/Pytest/ng/
# ScreenOkImage 成功会截图的名称 格式:_ImageClick_OK.png
# ScreenNgImage 失败会截图的名称 格式:_ImageClick_NG.png
执行成功返回 true 否则返回 false
# Test1._ImageClick("emulator-5554", "destination.png", "source2.png", 2, "aa/", "bb/", "_ImageClick_OK.png","_ImageClick_NG.png")
截图滑动方法
# DeviceMassage 设备号 获取方法:adb devices 必填项 否则会报错找不到要执行的设备
# intstartImage 起始 小图位置+名字,代表被滑动起始,格式 source.png 或 D:\Pytest\Test\venv\source.png
# intendImage 终止 小图位置+名字,代表被滑动终止,格式 source.png 或 D:\Pytest\Test\venv\source.png
# destinationImage 大图位置+名字,代表要点击的界面格式 destination.png 或 D:\Pytest\Test\venv\destination.png
# intduration 代表滑动速度,值必须为整数,例如 100
# TypeNumber 属性值 1代表截图后对比,2代表直接按照传入的值对比,若选择2则需要预先准备好大图
# FileOkPath 成功会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ok/ 或 D:/Pytest/ok/
# FileNgPath 失败会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ng/ 或 D:/Pytest/ng/
# ScreenOkImage 成功会截图的名称 格式:_ImageClick_OK.png
# ScreenNgImage 失败会截图的名称 格式:_ImageClick_NG.png
# 执行成功返回 true 否则返回 false
# Test1._ImageSwipe("emulator-5554","source2.png", "sourcew.png", "destination.png", 300, 2,"aa/","bb/","_ImageSwipe_OK.png","_ImageSwipe_NG.png")
截图判断是否存在
# destinationImage 大图位置+名字,代表要点击的界面格式 destination.png 或 D:\Pytest\Test\venv\destination.png
# sourceImageList 小图位置的List 可以为多个,最少为1个,若输入多个,则代表列表内的值均会与大图对比
# 若均存在则返回 true 否则返回 false
# sourceImageList = [ "sourcew.png"]
# print Test1._ImageExists("destination.png", sourceImageList, 2)
截图长按方法
# DeviceMassage 设备号 获取方法:adb devices 必填项 否则会报错找不到要执行的设备
# destinationImage 大图位置+名字,代表要点击的界面格式 destination.png 或 D:\Pytest\Test\venv\destination.png
# sourceImage 小图位置+名字,代表被点击按钮,格式 source.png 或 D:\Pytest\Test\venv\source.png
# TypeNumber 属性值 1代表截图后对比,2代表直接按照传入的值对比,若选择2则需要预先准备好大图
# FileOkPath 成功会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ok/ 或 D:/Pytest/ok/
# FileNgPath 失败会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ng/ 或 D:/Pytest/ng/
# ScreenOkImage 成功会截图的名称 格式:_ImageClick_OK.png
# ScreenNgImage 失败会截图的名称 格式:_ImageClick_NG.png
# 执行成功返回 true 否则返回 false
# Test1._ImageLongClick("emulator-5554","destination.png", "source2.png", 2, "aa/", "bb/", "_ImageLongClick_OK.png","_ImageLongClick_NG.png")
截图拖拽方法
# DeviceMassage 设备号 获取方法:adb devices 必填项 否则会报错找不到要执行的设备
# intstartImage 起始 小图位置+名字,代表被滑动起始,格式 source.png 或 D:\Pytest\Test\venv\source.png
# intendImage 终止 小图位置+名字,代表被滑动终止,格式 source.png 或 D:\Pytest\Test\venv\source.png
# destinationImage 大图位置+名字,代表要点击的界面格式 destination.png 或 D:\Pytest\Test\venv\destination.png
# intduration 代表拖拽速度,值必须为整数,例如 100
# TypeNumber 属性值 1代表截图后对比,2代表直接按照传入的值对比,若选择2则需要预先准备好大图
# FileOkPath 成功会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ok/ 或 D:/Pytest/ok/
# FileNgPath 失败会截图,输入截图位置,可以为空,若为空则代表存在当前文件所在目录下,若不为空格式为 ng/ 或 D:/Pytest/ng/
# ScreenOkImage 成功会截图的名称 格式:_ImageClick_OK.png
# ScreenNgImage 失败会截图的名称 格式:_ImageClick_NG.png
# 执行成功返回 true 否则返回 false
# Test1._ImageDrag("emulator-5554", "source2.png", "sourcew.png", "destination.png", 300, 2, "aa/", "bb/","_ImageDrag_OK.png", "_ImageDrag_NG.png")
截图方法
# DeviceMassage 设备号 获取方法:adb devices 必填项 否则会报错找不到要执行的设备
# destinationImage 为要截图 保存图片的位置+名称,格式 source.png 或 D:\Pytest\Test\venv\source.png
# Test1._screenshot("emulator-5554","destination.png")
# 执行成功返回 true 否则返回 false
代码源码
https://download.csdn.net/download/qq_36616956/87426577
参考文献
Python OpenCV入门: https://blog.csdn.net/fu6543210/article/details/80835280
Opencv中颜色控件转换: https://blog.csdn.net/u012193416/article/details/79312798
Python图像识别及操作相关推荐
- python图片识别-python图像识别
python图像识别一般基础到的就是tesseract了,在爬虫中处理验证码广泛使用. 安装 安装教程网上大都差不多,Windows下确实比较麻烦,涉及到各种路径.环境变量甚至与linux不同的路径分 ...
- python 图像识别实现四川麻将回放牌面数据
python 图像识别 自动获取麻将APP实时牌面数据 前面写了一篇文章,深度学习图像识别麻将APP数据,然后结合自己的算法实现自动打麻将demo!很多朋友感兴趣.最开始做这个也只是为了研究学习图像识 ...
- [Python图像识别] 五十.Keras构建AlexNet和CNN实现自定义数据集分类详解
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...
- 教你快速学习python图像识别入门
附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全: 书单导航页(点击右侧 极客侠栈 即可打开个人博客):极客侠栈 ①[Java]学习之路吐血整理技术书 ...
- Python模块MySQLdb操作mysql出现2019错误:Can't initialize character set utf-8
我使用python的MySQLdb模块实现了一个mysql client, 在测试时,出现了如下错误 Python模块MySQLdb操作mysql出现2019错误:Can't initialize c ...
- Python 炫技操作:合并字典的七种方法
来源 | Python编程时光(ID: Cool-Python) Python 语言里有许多(而且是越来越多)的高级特性,是 Python 发烧友们非常喜欢的.在这些人的眼里,能够写出那些一般开发者看 ...
- Python OpenCV像素操作
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 Python OpenCV像素操作 环 ...
- python 图像识别_python图像识别之图片相似度计算
作者 | a1131825850疯子 来源 | Python爬虫scrapy 原文 | python图像识别---------图片相似度计算 1.背景 要识别两张图片是否相似,首先我们可能会区分这两张 ...
- python列表字典操作_Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结...
创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_star ...
最新文章
- 欺诈网站都注重用户体验!你,还在等什么?!
- SQL Server 2005 Sa 用户的启用
- [JSP暑假实训] 二.JSP网站创建及Servlet实现注册表单提交、计算器运算
- [导入]关于谭浩强[上]
- 2021年3月15日_读书|总结笔记目录
- 支付宝上线“时间银行”:未来养老不用愁了
- osgi java web_在Tomcat中使用Java Web应用程序的OSGi软件包
- cad管线交叉怎么画_高效设计!多种方式进行管线连接、伸缩
- 化妆品行业组合解决方案
- excel 链接批量转图片
- 新买电脑编译运行dev c++慢的
- Django使用 celery发送邮件、Rabbitmq-AMQP
- TypeError: conv2d() received an invalid combination of arguments
- 拯救者笔记本ubuntu亮度调节
- 【JVM系列JKD8】参数参考表
- 各种音视频编解码学习详解之 编解码学习笔记(三):Mpeg系列——Mpeg 1和Mpeg 2
- 【Java力扣算法】LeetCode 309 Best Time to Buy and Sell Stock with Cooldown(动态规划)
- 行车记录仪开发方案比较--转载
- ACMCODER-股神
- iOS-Siri唤起银行类app (语音转账)