там где написано Tier: 1 Tier: 2
мне нужно чтоб он мог найти цифры 1 и 2 , но шрифт очень неприглядный
есть вероятность что цифры имеют прозрачность или слегка меняют оттенок в зависимости от положения этого окошка на экране
возможно ли это при худшем раскладе или хотя бы если цифры всегда имеют одинаковые цвета во всех точках? Да и конечно чтоб он не путал их другими буквами и цифрами
https://imgbb.com/
// Поиск статичных точек на нескольких картинках
//Закидываете в папку несколько картинок одной цифры, например 1, 1a, 1b. Скрипт сравнит картинки. Пиксели, которые //присутствуют на всех картинках будут оставлены, остальные закрашены. Подберите погрешность по цвету, чтобы не //слишком много было закрашено. Попробуйте искать полученную картинку.
//Важно:
//1. Картинки 1, 1a, 1b должны быть одного размера.
//2. В скрипте поиска числа
set %path [1] "D:\image\Fin" // путь для сохранения готовой картинки
set $path "D:\\image" // путь к анализируемым картинкам
init_arr %rgb (1) 255 0 0 // цвет для закрашивания фона в формате RGB
set #deviat 0 // погрешность в цвете
// остальное не менять
dir(%picture $path *.bmp*)
for #i 1 size(%picture)
set %a [#i] Loadimage (%picture [#i 1])
end_for
set linedelay 0
set $imya prompt (Введите имя картинки)
set %imya [1] $imya
set workwindow windowhandle
set #r %rgb [1 1]
set #g %rgb [1 2]
set #b %rgb [1 3]
writemem #b %a [1 1] b
writemem #g eval(%a [1 1] + 1) b
writemem #r eval(%a [1 1] + 2) b
set #delta %a [1 4] - (%a [1 4] - %a [1 2] * 3 + 1)
for #j 0 eval(%a [1 3] - 1)
for #i 0 #delta 3
for #k 2 size(%a)
set #z %a [1 1] + %a [1 4] * #j + #i
set #z1 %a [1 1] + %a [1 4] * #j + #i + 1
set #z2 %a [1 1] + %a [1 4] * #j + #i + 2
readmem #b1 #z b
readmem #g1 #z1 b
readmem #r1 #z2 b
set #z3 %a [#k 1] + %a [#k 4] * #j + #i
set #z4 %a [#k 1] + %a [#k 4] * #j + #i + 1
set #z5 %a [#k 1] + %a [#k 4] * #j + #i + 2
readmem #b #z3 b
readmem #g #z4 b
readmem #r #z5 b
gosub rgb
if #rmin > #r1 or #rmax < #r1 or #gmin > #g1 or #gmax < #g1 or #bmin > #b1 or #bmax < #b1
set #rpaint %rgb [1 1]
set #gpaint %rgb [1 2]
set #bpaint %rgb [1 3]
writemem #bpaint #z b
writemem #gpaint #z1 b
writemem #rpaint #z2 b
break
end_if
end_for
end_for
end_for
hint (20 clRed 500 500 (Картинка сохранена))
wait 1000
hint (10 clblack 1920 1 (1))
set $bmp SaveImage (%a [1 1] %path [1]\%imya [1].bmp)
end_script
:rgb
set #rmin #r - 255 * #deviat / 100
set #rmax #r + 255 * #deviat / 100
set #gmin #g - 255 * #deviat / 100
set #gmax #g + 255 * #deviat / 100
set #bmin #b - 255 * #deviat / 100
set #bmax #b + 255 * #deviat / 100
set #dev 255 * #deviat / 100
set #bmin #b - #dev
set #bmax #b + #dev
if #bmax > 255
set #bmax 255
end_if
if #bmin < 0
set #bmin 0
end_if
set #gmin #g - #dev
set #gmax #g + #dev
if #gmax > 255
set #gmax 255
end_if
if #gmin < 0
set #gmin 0
end_if
set #rmin #r - #dev
set #rmax #r + #dev
if #rmax > 255
set #rmax 255
end_if
if #rmin < 0
set #rmin 0
end_if
return
ранее использовал этот скрипт и он хорошо работал, прошло 2 месяца и он мне снова понадобился, но почему то он ничего не находит. Ради эксперимента попробовал использовать картинки по которым ранее уже создавал готовую картинку, но в этот раз он ничего не нашел, потом просто в пэинте нарисовал квадрат и сохранил под разными именами - результат тот же. Пилот не менял, скрипт заново скопировал отсюда. Погрешность никакая не помогает.В чем может быть проблема?
я разобрался - нельзя чтоб в папке с анализируемыми изображениями кроме этих изображений были папки с другими изображениями, он проверяет все что вложено в папку для анализа
dir(%picture $path "*.bmp" norecursion)
спасибо
еще вопрос - я раньше все делал на пилотовском языке, теперь начал на луа и мне не дает покоя одна вещь, а именно отсутствие goto. У меня задача найти на экране цвет или картинку, которые постоянно перемещаются при выполнении действий связанных с появлением этого объекта на экране, раньше я просто писал например
:box
set #a findcolor
if #a > 0
move
kleft
end_if
goto box
local loot = findcolor ([[85, 75, 1909, 1062, 1, 1 (10025624) %ex 2 1]])
if loot > 0 then
repeat
local loot = findcolor ([[85, 75, 1909, 1062, 1, 1 (10025624) %ex 2 1]])
if loot > 0 then
move(ex[1][1], ex[1][2])
wait (50)
kleft(ex[1][1], ex[1][2])
wait (200)
end
until loot == 0
end
while 1 = 1
set #a findcolor
if #a > 0
move
kleft
end_if
end_while
все понятно, значит надо просто вписать break если условие не выполняется
set #a 0
while #a = 0
set #a findcolor
if #a > 0
move
kleft
end_if
wait 1
end_while
set #a 0
while #a = 0
set #a findcolor
if #a > 0
move
kleft
end_if
wait 1
end_while
set #a 1
while #a > 0
set #a findcolor
if #a > 0
move
kleft
end_if
wait 1
end_while
По идее можно даже и еще короче =)
set #a 1
while #a > 0
set #a findcolor
move
kleft
end_while
set #a findcolor
while #a > 0
move
kleft
set #a findcolor
wait 1
end_while
я в начале написал не то что имел в виду поэтому меня не совсем так поняли, там где goto он должен быть внутри if
:box
set #a findcolor
if #a > 0
move
kleft
goto box
end_if
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)