Skip to content

Latest commit

 

History

History
140 lines (96 loc) · 4.08 KB

File metadata and controls

140 lines (96 loc) · 4.08 KB

前言

这是一个 uiautimator2 的一个插件,使得 uiautimator2 可以支持通过图像识别来对手机进行操作
代码集成了开源库: aircv

注意

  1. 只能支持常宽比为 16:9 的手机
  2. 截图是以 atx-agent 传过来的图像为基准,图片大小为 800*450
    因为分辨率小了,会有失真,所以匹配阈值可适当减小(下面有说明)
  3. 因为基准图为 800*450 分辨率,area 区域范围不能大于该分辨率(下面有说明)
  4. 有时候确实有但是查找不到,或者查找错误,可适当截图截的大一点

环境

opencv3.x

  1. 安装opencv3 支持py2和py3(测试环境 python2.7.15 和 python3.7.0)
    pip install opencv_python
  2. 安装 websocket
    pip install websocket
  3. 安装 numpy
    pip install numpy

设置

# 启用支持网络下载图片选项
Aircv.support_network = True  # 默认 False,不启用
# 设置 host,支持 http
Aircv.host = "127.0.0.1:8000"
# 请求路径,固定
Aircv.path = "/image_service/download/"
# 示例,图片请求地址
img_url = "http://127.0.0.1:8000/image_service/download/@img1"


# 全局设置操作的超时时间,大于该值时间没有找到图像,会报异常
# timeout 可以在每个函数调用时单独设置
Aircv.timeout = 30

# 全局设置操作的等待时间,该值为在查找到图像后,等待多久再操作(等待UI元素渲染完成)
# 例如点击操作,查找到图像后,等待 1秒,然后才点击
Aircv.wait_before_operation = 1

# 全局设置读取图像的频率,间隔几秒读取一张图像,默认为 2秒
# 手机端的服务会 atx-agent 会以较高频率不断发送 800*450 的图像过来,设置该值限制频率
Aircv.rcv_interval = 2

# 图像查找采用模板匹配的方式
# 该设置定义阈值,大于该阈值,则认为图像相同,即找到图像
# 一般来说大于0.999认为图像一样,阈值默认值为0.95
CVHandler.template_threshold = 0.95

图像传输

一般来说,图像传输会在连接上设备开始传输,程序结束会自动关闭传输 如果需要主动关闭,开启图像传输的话,可参考如下

import uiautomator2 as u2
from aircv import Aircv

u2.plugin_register('aircv', Aircv)
d = u2.connect()

# 关闭图像传输
d.ext_aircv.stop_get_scren()

# 开启图像传输
d.ext_aircv.start_get_screen()

示例

import uiautomator2 as u2
from aircv import Aircv

u2.plugin_register('aircv', Aircv)
d = u2.connect()


# 判断是否存在
d.ext_aircv.exists('tmp.jpg')
d.ext_aircv.exists('tmp.jpg', timeout=60)  # 设置超时时间


# 点击
d.ext_aircv.click('tmp.jpg')
d.ext_aircv.click('tmp.jpg', timeout=60)  # 设置超时时间


# 原图像中指定查找范围,安卓以左上角为原点即(0,0)
# 参数传入左上角坐标和右下角坐标(x1, y1, x2, y2)
d.ext_aircv.click('tmp.jpg', area=(100, 100, 300, 200))


# 长按
d.ext_aircv.long_click('tmp.jpg')
d.ext_aircv.long_click('tmp.jpg', duration=5)  # 设置长按时间
d.ext_aircv.long_click('tmp.jpg', timeout=60)  # 设置超时时间
d.ext_aircv.long_click('tmp.jpg', area=(100, 100, 300, 200))  # 设置查找范围


# 滑动
d.ext_aircv.swipe('tmp1.jpg', 'tmp2.jpg')

#设置持续时间,0.1 表示持续 1秒, 默认 1秒
d.ext_aircv.swipe('tmp1.jpg', 'tmp2.jpg', duration=0.1)
d.ext_aircv.swipe('tmp1.jpg', 'tmp2.jpg', timeout=60)  # 设置超时时间
d.ext_aircv.swipe('tmp1.jpg', 'tmp2.jpg', area=(100, 100, 300, 200))  # 设置查找范围


# 多点滑动
# duration 的值, 0.1 表示持续 1秒, 默认 1秒
img_list = ['tmp1.jpg', 'tmp2.jpg', 'tmp3.jpg']
d.ext_aircv.swipe_points(img_list, duration=0.5, timeout=60)


# 拖动(按住一会再滑动)
d.ext_aircv.drag('tmp1.jpg', 'tmp2.jpg', duration=0.1, timeout=60)
d.ext_aircv.drag('tmp1.jpg', 'tmp2.jpg', area=(100, 100, 300, 200))  # 设置查找范围


# 获取坐标(x, y)(返回查找到图像的中心坐标)
d.ext_aircv.get_point('tmp1.jpg', timeout=60, area=(100, 100, 300, 200))