跳到主要内容

屏幕找图 (screen.find_image)

声明

横坐标, 纵坐标 = screen.find_image(图片 [, 可信度,,,,])
查找结果 = screen.find_image(图片 [, 选项,,,,])

参数

  • 图片
    字符串型,需要找的图片,可以是 png 或是 jpeg 格式的图片数据
    图片对象,或是一个图片对象 (可参考 图片对象模块 (image) )
    文本型,需要找的图片文件路径,如果不是合法路径则会以数据方式解析

  • 可信度
    整数型,可选参数,默认是数字 95,它表示找到的位置的可信度不小于 95 才会返回。可信度取值范围 0 ~ 100

  • 选项
    表型,可选参数

    参数结构
    {
    find_all = false | true, -- 可选参数,当该参数为 true 时,返回值为一个表。默认为 false
    confidence_threshold = number_value(0.0 ~ 100.0), -- 可选参数,可信度超过该值的结果视为有效。默认 95
    downscale = number_value(0.1 ~ 1.0), -- 可选参数,值越小速度越快精度越低。默认 1.0 精度优先
    mask = image_object, -- 可选参数,标注需要查找的图片都有效区域,是一张与 img 尺寸相同的二值化图片,白色为有效区域,黑色为无效区域。默认 img 所有区域都有效
    }
  • 左, 上, 右, 下
    整数型,可选参数,搜索区域,默认 全屏

返回值

  • 横坐标, 纵坐标
    整数型,当 选项.find_all 不为 true 时,返回仅返回符合要求的最可信的结果坐标。若未找到任何可信度满足的坐标,则返回 -1, -1

  • 查找结果
    表型

    当 选项.find_all 为 true 时,返回可信度不小于 选项.confidence_threshold 的多个值
    {
    {
    x = integer_value,
    y = integer_value,
    confidence = number_value(0.0 ~ 100.0),
    },
    ...
    }

说明

在屏幕上寻找一个图像的位置,该函数会引用 image.cv 模块
注意: 如果需要做多分辨率兼容,那么建议是于分辨率最小的设备上截图;大分辨率上的截图会无法在小分辨率设备上找到

1.3.8 以上版本中增强

  • 允许使用 find_all 模式找到图像中所有超过可信度阈值的匹配项
  • 允许使用 downscale 字段设置将图像精度降低查找以提升找图速度
  • 允许使用 mask 标注图片中的有效区域以实现查找不规则形状图像

示例

XXT 取色器 1.0.29 Windows 版.zip

-- 示例 1 (使用 XXT 取色器 Shift + 鼠标左键框选图像上的区域 可直接生成这样的代码) :
x, y = screen.find_image( -- 原图位置 左上: 354, 274 | 右下: 358, 284
"\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\x00\x00\x04\x00\x00\x00\x0a\x08\x02\x00\x00\x00\x1c\x99\x68\x59\x00\x00\x00\x61\x49\x44\x41\x54\x78\xda\x63\x78\xfd\xf4\xda\xff\xff\xff\xff\xfd\xfb\xf7\xed\xcb\x5b\x86\xf7\xaf\x1f\xfc\x87\x01\x86\x2f\x1f\x5f\x02\xa9\xef\xa7\xce\x7c\xdd\xb1\x9b\xe1\xe7\xf7\xcf\x40\xce\xeb\xb2\xea\x7b\xb2\x6a\x0c\x7f\xff\xfe\x01\x72\x9e\x78\x06\x82\x38\x20\xdd\xbf\x7e\xdd\x57\xd4\x82\x72\x7e\xdd\xba\x0d\x64\x41\x39\x08\xd3\x80\x38\x6b\xe3\x7f\x86\x2a\x30\x02\x72\x8c\xa6\x40\x39\x00\xd5\x7b\x5f\x2e\xfd\xba\xd5\x32\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"
, 95, 0, 0, 639, 1135)
--
-- 示例 2:
img = image.load_file("/var/mobile/1.png")
x, y = screen.find_image(img)
x, y = screen.find_image(img, 95)
--
-- 示例 4:
x, y = screen.find_image("/var/mobile/1.png", 95, 0, 0, 639, 1135)

-- 示例 5(1.3.8 新增)这是全屏找多个目标
img = image.load_file(XXT_SCRIPTS_PATH..'/1.png')
rets = screen.find_image(img, {
confidence_threshold = 90, -- 可信度大于这个值的结果有效
downscale = 0.5, -- 降低精度提速
find_all = true, -- 表示返回所有有效结果的一个表
}, 0, 0, 0, 0) -- 0, 0, 0, 0 区域表示全屏

说明:在 Lua 源码中,字符串中 \x 开头,后面跟两位 16 进制数表示以该数字编码的单个字节。例如:\x58 表示 X 这个字符,可打印字符部分参考《ASCII 编码》

复杂示例

-- 从网上下载个小图片 (一部分 XXTouch 图标) 然后从屏幕上找到它并点击
local c, h, r = http.get("https://www.xxtouch.app/img/find_image_test.png", 10)
if (c == 200) then
local img = image.load_data(r)
if img then
x, y = screen.find_image(img, 95)
if x~=-1 then
touch.tap(x, y)
else
sys.alert("没有在屏幕上找到 XXTouch 图标")
end
else
sys.alert("可能下载到了一个假图片")
end
else
sys.alert("下载失败")
end

:上述代码中使用了非本章函数 sys.alertimage.load_datatouch.taphttp.get