Pular para o conteúdo principal

Encontrar uma imagem na tela (screen.find_image)

Declaração

coordenada_x, coordenada_y = screen.find_image(imagem [, confiabilidade, esquerda, topo, direita, baixo ])
resultado_da_busca = screen.find_image(imagem [, opções, esquerda, topo, direita, baixo ])

Parâmetros

  • imagem
    String; imagem a ser encontrada, podendo ser dados de imagem no formato PNG ou JPEG.
    Objeto de imagem, ou um objeto de imagem (consulte o Módulo de objetos de imagem (image)).
    Texto; caminho do arquivo de imagem a ser encontrado. Se não for um caminho válido, será interpretado como dados.

  • confiabilidade
    Inteiro opcional; o padrão é 95 e a posição só será retornada quando sua confiabilidade for pelo menos 95. O intervalo é de 0 a 100.

  • opções
    Tabela opcional.

    Estrutura dos parâmetros
    {
    find_all = false | true, -- opção; quando true, encontra todos os itens correspondentes e retorna uma tabela. O padrão é false
    confidence_threshold = number_value(0.0 ~ 100.0), -- opção; resultados acima deste valor de confiabilidade são válidos. O padrão é 95
    downscale = number_value(0.1 ~ 1.0), -- opção; quanto menor o valor, maior a velocidade e menor a precisão. O padrão é 1.0, priorizando a precisão
    mask = image_object, -- opção; marca a área válida da imagem a ser encontrada. É uma imagem binarizada com o mesmo tamanho de img; branco é válido e preto é inválido. Por padrão, toda a área de img é válida
    }
  • esquerda, topo, direita, baixo
    Inteiros opcionais; área de busca. O padrão é a tela inteira.

Valores retornados

  • coordenada_x, coordenada_y
    Inteiros; quando opções.find_all não for true, retorna somente as coordenadas do resultado mais confiável que atende aos requisitos. Se nenhuma coordenada atingir a confiabilidade necessária, retorna -1, -1.

  • resultado da busca
    Tabela

    Quando opções.find_all for true, retorna vários valores cuja confiabilidade não seja menor que opções.confidence_threshold
    {
    {
    x = integer_value,
    y = integer_value,
    confidence = number_value(0.0 ~ 100.0),
    },
    ...
    }

Observações

Procura a posição de uma imagem na tela; esta função usa o módulo image.cv.
Os parâmetros de coordenadas e os valores retornados são afetados pelo sistema inicializado por screen.init.
Atenção: para compatibilidade com várias resoluções, recomenda-se capturar a tela no dispositivo com a menor resolução; uma captura de alta resolução não poderá ser correspondida em um dispositivo de baixa resolução.

Melhorias nas versões 1.3.8 e posteriores

  • permite usar o modo find_all para encontrar todas as correspondências da imagem acima do limite de confiabilidade
  • permite usar o campo downscale para reduzir a precisão da imagem e acelerar a busca
  • permite usar mask para marcar a área válida da imagem e encontrar imagens de formas irregulares

Exemplo

XXT Color Picker para Windows.zip

-- exemplo 1 (use Shift + botão esquerdo do mouse no XXT Color Picker para selecionar uma área da imagem e gerar diretamente um código como este):
x, y = screen.find_image( -- posição da imagem original: canto superior esquerdo 354, 274 | canto inferior direito 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)
--
-- exemplo 2:
img = image.load_file("/var/mobile/1.png")
x, y = screen.find_image(img)
x, y = screen.find_image(img, 95)
--
-- exemplo 4:
x, y = screen.find_image("/var/mobile/1.png", 95, 0, 0, 639, 1135)

-- exemplo 5 (adicionado na versão 1.3.8): encontra vários alvos na tela inteira
img = image.load_file(XXT_SCRIPTS_PATH..'/1.png')
rets = screen.find_image(img, {
confidence_threshold = 90, -- resultados com confiabilidade acima deste valor são válidos
downscale = 0.5, -- reduz a precisão para acelerar
find_all = true, -- encontra todos os itens correspondentes e retorna uma tabela com suas coordenadas
}, 0, 0, 0, 0) -- a área 0, 0, 0, 0 representa a tela inteira

Observação: no código-fonte Lua, \x seguido por dois dígitos hexadecimais em uma string representa um único byte codificado por esse número. Por exemplo, \x58 representa o caractere X; consulte codificação ASCII para a parte imprimível.

Exemplo complexo

-- baixa uma pequena imagem da internet (parte de um ícone do XXTouch), encontra-a na tela e toca nela
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

Observação: o código acima usa as funções sys.alert, image.load_data, touch.tap e http.get, que não pertencem a este capítulo.