跳至主要內容

螢幕找圖 (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 模組
目前函式座標值參數及回傳值均受 screen.init 函式初始化的座標系影響
注意: 若需要做多分辨率兼容,建議在分辨率最小的裝置上截圖;大分辨率截圖無法在小分辨率裝置上匹配到

1.3.8 以上版本中增強

  • 允許使用 find_all 模式找到影像中所有超過可信度閾值的匹配項
  • 允許使用 downscale 字段設定將影像精度降低查找以提升找圖速度
  • 允許使用 mask 標注圖片中的有效區域以實現查找不規則形狀影像

範例

XXT 取色器 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