メインコンテンツまでスキップ

画面上で画像を検索 (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 を使用しています