|
|
|
Поиск числа с помощью Findimage, Готовый скрипт |
|
|
dron4938 |
24.5.2017, 19:34
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
Консольное изменение изображений (консольный фотошоп)1. Скачиваем программу ImageMagick http://www.imagemagick.org/script/download.phpКрутим страницу в самый низ и скачиваем по последней ссылке ImageMagick-7.0.5-7-portable-Q16-x64.zip (для 64 винды) это версия в архиве, не требующая установки- другие версии не заработали у меня чет) 2. Для удобства распаковываем в папку C:\Magic 3. Готово (IMG: style_emoticons/default/smile.gif) теперь в пилоте вместо обычного поиска картинки: Код set timer set #a FindImage (0 0 300 300 ("C:\Users\Andrey\Desktop\Pil3\1.bmp") %arr 2 80 1 1) if #a > 0 hint #a end_if log timer end_script поиск можно делать так: Код set timer set %a GetImage (0 0 300 300) // сохранить в памяти часть экранной области set $bmp SaveImage (%a [1 1] C:\picture.bmp) // сохранить в файл exec C:\Magic\convert.exe "C:\picture.bmp" -colorspace gray "C:\picture.bmp" wait 100 set %b [1] LoadImage (C:\picture.bmp) set #a FindImage (0 0 300 300 ("C:\Users\Andrey\Desktop\Pil3\2.bmp") %arr %b [1 1] 80 1 1) set $del DeleteImage (%b [1 1]) if #a > 0 hint #a end_if log timer end_script ----------------------------------------------- после изменения изображения приходится ставить паузу.Методом научного тыка выяснилось, что если: картинка 10х10pix то хватит паузы в ~40мс картинка 100х100pix то хватит паузы в ~60мс картинка 500х500pix то хватит паузы в ~90мсвозможно если сохранять картинку на SSD, то будет в пару раз быстрее Соответственно поиск будет дольше, чем обычный. Но может пригодится в некоторых случаях, по этому оставлю здесь статью, чтоб не забыть) -------------------------------------------------- Некоторые команды ImageMagick:convert.exe img.png img.jpg (преобразует любые расширения изображений в другие jpg bmp png и т.д)-colorspace gray (делает изображение черно-белым)-resize 100×150 (изменяет размер изображения)-resize 200% (изменяет размер изображения)-rotate +20 (поворачивает изображение на указанный угол по часовой стрелке)-rotate -20 (поворачивает изображение на указанный угол против часовой стрелки)-normalize -posterize 3 (постеризация- число оттенков)-gamma 0.1 (гамма)-sepia-tone 80% (сепия)-negate (негатив)-brightness-contrast -20% (контраст меньше)-brightness-contrast 20% (контраст больше)-monochrome -normalize (монохромность)Применять можно сразу несколько команд, напрмер: exec C:\Magic\convert.exe "C:\picture.bmp" -resize 200% -colorspace gray -gamma 0.1 "C:\picture.bmp" так же существует еще множество команд, которые можно найти в инете. ----------------------------------------------------- Пример что можно получить, прогнав картинку через несколько фильтров:Код exec C:\Magic\convert.exe "C:\Users\andrey\Desktop\111\1.bmp" -resize 300% "C:\Users\andrey\Desktop\111\2.bmp" wait 40 exec C:\Magic\convert.exe "C:\Users\andrey\Desktop\111\2.bmp" -colorspace gray "C:\Users\andrey\Desktop\111\3.bmp" wait 40 exec C:\Magic\convert.exe "C:\Users\andrey\Desktop\111\3.bmp" -normalize -posterize 3 "C:\Users\andrey\Desktop\111\4.bmp" wait 40 exec C:\Magic\convert.exe "C:\Users\andrey\Desktop\111\4.bmp" -gamma 0.1 "C:\Users\andrey\Desktop\111\5.bmp" wait 40 exec C:\Magic\convert.exe "C:\Users\andrey\Desktop\111\5.bmp" -resize 33% "C:\Users\andrey\Desktop\111\6.bmp" wait 100 (IMG: https://i.yapx.ru/JTog.png) 1 (IMG: https://i.yapx.ru/JToj.png) 2 -resize 300% (IMG: https://i.yapx.ru/JTon.png) 3 -colorspace gray (IMG: https://i.yapx.ru/JTqS.png) 4 -normalize -posterize 3 (IMG: https://i.yapx.ru/JTqQ.png) 5 -gamma 0.1 (IMG: https://i.yapx.ru/JTow.png) 6 -resize 33% пример для наглядности, весь кодд можно прописать 1 строкой: Код exec C:\Magic\convert.exe "C:\Users\andrey\Desktop\111\1.bmp" -resize 300% -colorspace gray -normalize -posterize 3 -gamma 0.1 -resize 33% "C:\Users\andrey\Desktop\111\1.bmp" wait 100 Можно применять для поиска цветных и изменяющихся цифр к примеру, дабы не делать 100500 картинок с цифрами разного цвета
|
|
|
|
dron4938 |
25.5.2017, 3:12
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
filedelete (С:\picture2.bmp) // удалить файл exec C:\Magic\convert.exe "C:\picture.bmp" -colorspace gray "С:\picture2.bmp" // сохранить с нужными изменениями while fileexists (С:\picture2.bmp) = 0 // ждать пока файл не сохранится wait 1 end_while не работает, файлделет не удаляет файл и из цикла не выходит, хотя файл существует странно чета копирую файл на рабочий стол и пробую от туда удалить и удаляет) filedelete ("C:\Users\andrey\Desktop\picture2.bmp") а с диска С не хочет удалять пилот от админа запущен, но походу всеравно прав не хватает на удаление ----------------------------------------------------------- заработало, когда на рабочий стол перенес Код set timer set %a GetImage (0 0 300 300) // сохранить в памяти часть экранной области set $bmp SaveImage (%a [1 1] C:\Users\andrey\Desktop\picture.bmp) // сохранить в файл filedelete ("C:\Users\andrey\Desktop\picture2.bmp") exec C:\Magic\convert.exe "C:\Users\andrey\Desktop\picture.bmp" -colorspace gray "C:\Users\andrey\Desktop\picture2.bmp" // сохранить с нужными изменениями while fileexists (C:\Users\andrey\Desktop\picture2.bmp) = 0 // ждать пока файл не сохранится wait 1 end_while set %b [1] LoadImage (C:\Users\andrey\Desktop\picture2.bmp) set #a FindImage (0 0 300 300 ("C:\Users\Andrey\Desktop\2.bmp") %arr %b [1 1] 80 1 1) set $del DeleteImage (%b [1 1]) if #a > 0 hint время- timer мс Картинка найдена #a end_if end_script
|
|
|
|
dron4938 |
9.6.2017, 21:46
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
Поиск числа с помощью Findimage 3.0
Код // Поиск числа с помощью FindImage init_arr %GetImage (1) 0 0 99, 58 // координаты для поиска, StartX StartY EndX EndY
set linedelay 0 init_arr %picture 0 1 2 3 4 5 6 7 8 9 // имена картинок (0.bmp, 1.bmp и т. д.) init_arr %symbol 0 1 2 3 4 5 6 7 8 9 // символ соответствующий имени, т. е. картинка 0.bmp соответствует 0 set $path "C:\Number2" // папка с картинками set $bmp "*.bmp*" // формат картинок set #deltaY 8 // расстояние между строками (можно указать высоту картинок) set #deltaspace 12 // допустимое расстояние между цифрами, иначе будет считаться что это не одно число set #accuracy 90 // точность поиска для Findimage set #deviation 3 // погрешность оттенка для Findimage set #wait 2 // пауза между поиском картинок, если указать меньше искать будет быстрее, но нагрузит процессор set #timeproc 2000 // время (в мсек) для поиска картинок, если 0 не выйдет из процедуры пока не найдётся хотя бы 1 картинка set #repeatimage 2 // допустимое смещение координат, если используется несколько видов одной картинки
dir (%path $path $bmp) set delimiter ' ' while 1 = 1 set size(%result) // уничтожить массив с предыдущими результатами call test %picture %symbol %GetImage %path #deltaY #deltaspace #accuracy #deviation #wait #timeproc #repeatimage // процедура поиска // save_array %result C:\resultarr.txt // массив с результатами поиска
if size(%result) > 0 // если размер массива больше 0 // ТУТ НУЖНЫЕ ДЕЙСТВИЯ ///////////// для примера вывод в hint того что нашлось (можно убрать) set $str set %z [1] \n for #i 1 size(%result) set $str $str%result[#i] if #i != size(%result) set $str $str%z [1] end_if end_for hint (14 clBlue 409, 265 ($str)) ///////////// else hint Картинки не найдены end_if end_while
// процедура поиска и сортировки proc test %picture %symbol %GetImage %path #deltaY #deltaspace #accuracy #deviation #wait #timeproc #repeatimage set #GetStartX %GetImage [1 1] set #GetStartY %GetImage [1 2] set #GetEndX %GetImage [1 3] set #GetEndY %GetImage [1 4] set #current_script current_script // загрузка картинок в память if size(%path) > 0 // если картинки найдены for #i 1 size(%path) for #j 1 size(%picture) if %path [#i 3] = %picture [#j] set #n #n + 1 set %image [#n] LoadImage(%path [#i 1]) set %number [#n] %symbol [#j] break end_if end_for end_for else log Картинки в: $path не найдены log Скрипт остановлен stop_script #current_script end_if // поиск картинок и их сортировка set size(%result1) while size(%result1) = 0 and (#timeproc > timer or #timeproc = 0) set #z 0 set %get GetImage(#GetStartX #GetStartY #GetEndX #GetEndY) // сохранить часть экрана в память set #v %get [1 1] for #i 1 size(%number) set #a Findimage(0 0 %get [1 2] %get [1 3] (%image[#i 1]) %a #v #accuracy -1 #deviation) // поиск if #a < 0 log Ошибка поиска картинки. Код ошибки: #a log Скрипт остановлен stop_script #current_script end_if if #a > 0 for #j 1 size(%a) set #z #z + 1 init_arr %result1 (1 1 #z) %number[#i] %a[#j 1] %a[#j 2] // запись результатов поиска в массив end_for end_if wait #wait end_for if size(%result1) > 0 gosub sortY // сортировка по Y и X end_if set $b DeleteImage(%get[1 1]) // удалить изображение, полученное GetImage end_while goto end // выйти из процедуры
:sortY ///// удаление повторных координат, если используется несколько видов одной картинки set #size 0 set %tmp %result1 set size(%result1) for #i 1 size(%tmp[1]) set #break 0 for #n 1 #size set #xrepeat %tmp[2 #i] - %result1[2 #n] set #yrepeat %tmp[3 #i] - %result1[3 #n] if abs(#xrepeat) <= #repeatimage and abs(#yrepeat) <= #repeatimage set #break 1 break end_if end_for if #break = 0 set #size #size + 1 init_arr %result1 (1 1 #size) %tmp [1 #i] %tmp [2 #i] %tmp [3 #i] end_if end_for ///////
set #z 0 set #z1 0 set #z2 1 set #z4 0 sort_array %result1 -3 while 1 = 1 set #z 0 set size(%tmp) for #i #z2 eval(size(%result1 [1]) - 1) set #j #i + 1 set #x %result1 [3 #i] - %result1 [3 #j] if abs(#x) < #deltaY set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #i] %result1 [2 #i] %result1 [3 #i] else set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #i] %result1 [2 #i] %result1 [3 #i] break end_if end_for set #z2 #z2 + #z if #z2 = size(%result1[]) set #x %result1 [3 #i] - %result1 [3 #j] if abs(#x) > #deltaY set #jj #j sort_array %tmp -2 set #z1 #z1 + 1 init_arr %result (#z1) %tmp [1] gosub space set size(%tmp) set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #jj] %result1 [2 #jj] %result1 [3 #jj] set #z1 #z1 + 1 set %result.#current_script [#z1] %tmp [1] gosub end end_if set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #j] %result1 [2 #j] %result1 [3 #j] sort_array %tmp -2 set #z1 #z1 + 1 init_arr %result (#z1) %tmp [1] gosub space break else sort_array %tmp -2 set #z1 #z1 + 1 init_arr %result (#z1) %tmp [1] gosub space end_if end_while return
:space set #z3 0 set size(%space) set #z4 #z4 + 1 //посчитать где нужны пробелы for #i 1 eval(size(%tmp[]) - 1) set #j #i + 1 set #space %tmp [2 #i] - %tmp [2 #j] if abs(#space) > #deltaspace set #z3 #z3 + 1 set %space[#z3] #j end_if end_for // вставить пробелы for #i 1 size(%space) set $str %result [#z4] set $str insert(" " $str %space[#i]) set #j #i + 1 set %space[#j] %space[#j] + #i set %result [#z4] $str end_for // сохранение массива в основном скрипте for #i 1 size(%result) set size(%tmp1) init_arr %tmp1 (1) %result [#i] for #j 1 size(%tmp1[1]) set %result.#current_script [#i #j] %tmp1 [1 #j] end_for end_for return
:end end_proc как в этом коде сделать чтобы использовался поиск workwindow
|
|
|
|
ivanTu |
1.9.2017, 10:16
|
Apprentice
Сообщений: 128
Регистрация: 2.2.2015 Группа: Пользователи Наличность: 0
Пользователь №: 17.276
Возраст: 27
|
Уважаемый cirus , Не могли бы Вы мне помочь с кодом, у меня в игре есть 4ре ячейки с мобами, и я хотел последовательно проверять уровень мобов в каждой из ячеек, верхнюю правую нижнюю левую, картинки с цифрами все подготовил, а вот код не могу сформулировать в голове, и самое печально то, что для каждой ячейки с мобами идут свои картинки с цифрами, т.е у меня сейчас 4ре папки с картинками, собственно сам вопрос заключается в том, как мне прописать допустим в общем скрипте проверку всех четырёх ячеек с мобами и если к примеру моб достиг 25 лвла кликнуть по нему, ну с кликами я сам разберусь, самое главное проверку сделать, прилагаю скриншот для наглядности, спасибо за ранее если сможете мне помочь. Извиняюсь если не по теме написал.
Эскизы прикрепленных изображений
|
|
|
|
cirus |
1.9.2017, 12:24
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26845
Пользователь №: 16.971
Возраст: 29
|
Теоретически можно искать все числа сразу, но надо тестить. Скиньте мне все картинки с цифрами и несколько картинок в bmp с мобами. В выходные гляну. Пока делать 4 отдельных поиска, как-то так: код
Код set linedelay 0 init_arr %picture 0 1 2 3 4 5 6 7 8 9 // имена картинок (0.bmp, 1.bmp и т. д.) init_arr %symbol 0 1 2 3 4 5 6 7 8 9 // символ соответствующий имени, т. е. картинка 0.bmp соответствует 0 set $bmp "*.bmp*" // формат картинок set #deltaY 8 // расстояние между строками (можно указать высоту картинок) set #deltaspace 12 // допустимое расстояние между цифрами, иначе будет считаться что это не одно число set #accuracy 90 // точность поиска для Findimage set #deviation 3 // погрешность оттенка для Findimage set #wait 2 // пауза между поиском картинок, если указать меньше искать будет быстрее, но нагрузит процессор set #timeproc 2000 // время (в мсек) для поиска картинок, если 0 не выйдет из процедуры пока не найдётся хотя бы 1 картинка
// 4 папки с картинками, цифры во всех папках назвать одинаково 0.bmp, 1.bmp и т. д. set $path1 "C:\l2number1" // папка с картинками верхнего числа set $path2 "C:\l2number2" // папка с картинками левого set $path3 "C:\l2number3" // папка с картинками правого set $path4 "C:\l2number4" // папка с картинками нижнего
// 4 массива с координатами init_arr %GetImage1 (1) 132, 54 167, 83 // координаты для поиска верхнего числа init_arr %GetImage2 (1) 50, 100 82, 126 // координаты для поиска левого init_arr %GetImage3 (1) 229, 105 248, 124 // координаты для поиска правого init_arr %GetImage4 (1) 142, 148 167, 171 // координаты для поиска нижнего
dir (%path1 $path1 $bmp) dir (%path2 $path2 $bmp) dir (%path3 $path3 $bmp) dir (%path4 $path4 $bmp)
while 1 = 1 // тут ваш скрипт gosub find // переход к подпрограмме поиска цифр end_while
// подпрограмма поиска цифр :find // поиск картиноки из папки C:\l2number1, координаты %GetImage1 set size(%result) // уничтожить массив с предыдущими результатами call test %picture %symbol %GetImage1 %path1 #deltaY #deltaspace #accuracy #deviation #wait #timeproc // процедура поиска if size(%result) > 0 // если размер массива больше 0 // ТУТ НУЖНЫЕ ДЕЙСТВИЯ, например if %result [1 1] = 25 // если число равно 25 log Число равно 25 !!!!!! else // иначе log Число равно %result [1 1] end_if end_if
// поиск картиноки из папки C:\l2number2, координаты %GetImage2 set size(%result) // уничтожить массив с предыдущими результатами call test %picture %symbol %GetImage2 %path2 #deltaY #deltaspace #accuracy #deviation #wait #timeproc // процедура поиска, ищутся картинки из папки C:\l2number2 if size(%result) > 0 // если размер массива больше 0 if %result [1 1] = 25 // если число равно 25 log Число равно 25 !!!!!! end_if end_if
// для остальных дописать return
// процедура поиска и сортировки proc test %picture %symbol %GetImage %path #deltaY #deltaspace #accuracy #deviation #wait #timeproc set #GetStartX %GetImage [1 1] set #GetStartY %GetImage [1 2] set #GetEndX %GetImage [1 3] set #GetEndY %GetImage [1 4] set #current_script current_script // загрузка картинок в память if size(%path) > 0 // если картинки найдены for #i 1 size(%path) for #j 1 size(%picture) if %path [#i 3] = %picture [#j] set #n #n + 1 set %image [#n] LoadImage(%path [#i 1]) set %number [#n] %symbol [#j] break end_if end_for end_for else log Картинки в: $path не найдены log Скрипт остановлен stop_script #current_script end_if // поиск картинок и их сортировка set size(%result1) while size(%result1) = 0 and (#timeproc > timer or #timeproc = 0) set #z 0 set %get GetImage(#GetStartX #GetStartY #GetEndX #GetEndY) // сохранить часть экрана в память set #v %get [1 1] for #i 1 size(%number) set #a Findimage(0 0 %get [1 2] %get [1 3] (%image[#i 1]) %a #v #accuracy -1 #deviation) // поиск if #a < 0 log Ошибка поиска картинки. Код ошибки: #a log Скрипт остановлен stop_script #current_script end_if if #a > 0 for #j 1 size(%a) set #z #z + 1 init_arr %result1 (1 1 #z) %number[#i] %a[#j 1] %a[#j 2] // запись результатов поиска в массив end_for end_if wait #wait end_for if size(%result1) > 0 gosub sortY // сортировка по Y и X end_if set $b DeleteImage(%get[1 1]) // удалить изображение, полученное GetImage end_while goto end // выйти из процедуры
:sortY set #z 0 set #z1 0 set #z2 1 set #z4 0 sort_array %result1 -3 while 1 = 1 set #z 0 set size(%tmp) for #i #z2 eval(size(%result1 [1]) - 1) set #j #i + 1 set #x %result1 [3 #i] - %result1 [3 #j] if abs(#x) < #deltaY set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #i] %result1 [2 #i] %result1 [3 #i] else set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #i] %result1 [2 #i] %result1 [3 #i] break end_if end_for set #z2 #z2 + #z if #z2 = size(%result1[]) set #x %result1 [3 #i] - %result1 [3 #j] if abs(#x) > #deltaY set #jj #j sort_array %tmp -2 set #z1 #z1 + 1 init_arr %result (#z1) %tmp [1] gosub space set size(%tmp) set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #jj] %result1 [2 #jj] %result1 [3 #jj] set #z1 #z1 + 1 set %result.#current_script [#z1] %tmp [1] gosub end end_if set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #j] %result1 [2 #j] %result1 [3 #j] sort_array %tmp -2 set #z1 #z1 + 1 init_arr %result (#z1) %tmp [1] gosub space break else sort_array %tmp -2 set #z1 #z1 + 1 init_arr %result (#z1) %tmp [1] gosub space end_if end_while return
:space set #z3 0 set size(%space) set #z4 #z4 + 1 //посчитать где нужны пробелы for #i 1 eval(size(%tmp[]) - 1) set #j #i + 1 set #space %tmp [2 #i] - %tmp [2 #j] if abs(#space) > #deltaspace set #z3 #z3 + 1 set %space[#z3] #j end_if end_for // вставить пробелы for #i 1 size(%space) set $str %result [#z4] set $str insert(" " $str %space[#i]) set #j #i + 1 set %space[#j] %space[#j] + #i set %result [#z4] $str end_for // сохранение массива в основном скрипте for #i 1 size(%result) set size(%tmp1) init_arr %tmp1 (1) %result [#i] for #j 1 size(%tmp1[1]) set %result.#current_script [#i #j] %tmp1 [1 #j] end_for end_for return
:end end_proc Можете попробовать искать сразу все картинки: Все картинки закинуть в одну папку, имена картинок: 0.bmp, 0a.bmp, 0b.bmp, 0c.bmp, 1.bmp, 1a.bmp, 1b.bmp, 1c.bmp и т. д код
Код // Поиск числа с помощью FindImage init_arr %GetImage (1) 0 0 99, 58 // координаты для поиска, StartX StartY EndX EndY
set linedelay 0 init_arr %picture 0 1 2 3 4 5 6 7 8 9 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a 0b 1b 2b 3b 4b 5b 6b 7b 8b 9b 0c 1c 2c 3c 4c 5c 6c 7c 8c 9c // имена картинок (0.bmp, 1.bmp и т. д.) init_arr %symbol 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 // символ соответствующий имени, т. е. картинка 0.bmp соответствует 0 set $path "C:\Number2" // папка с картинками set $bmp "*.bmp*" // формат картинок set #deltaY 8 // расстояние между строками (можно указать высоту картинок) set #deltaspace 12 // допустимое расстояние между цифрами, иначе будет считаться что это не одно число set #accuracy 90 // точность поиска для Findimage set #deviation 3 // погрешность оттенка для Findimage set #wait 2 // пауза между поиском картинок, если указать меньше искать будет быстрее, но нагрузит процессор set #timeproc 2000 // время (в мсек) для поиска картинок, если 0 не выйдет из процедуры пока не найдётся хотя бы 1 картинка set #repeatimage 2 // допустимое смещение координат, если используется несколько видов одной картинки
dir (%path $path $bmp) set delimiter ' ' while 1 = 1 set size(%result) // уничтожить массив с предыдущими результатами call test %picture %symbol %GetImage %path #deltaY #deltaspace #accuracy #deviation #wait #timeproc #repeatimage // процедура поиска // save_array %result C:\resultarr.txt // массив с результатами поиска
if size(%result) > 0 // если размер массива больше 0 // ТУТ НУЖНЫЕ ДЕЙСТВИЯ ///////////// для примера вывод в hint того что нашлось (можно убрать) set $str set %z [1] \n for #i 1 size(%result) set $str $str%result[#i] if #i != size(%result) set $str $str%z [1] end_if end_for hint (14 clBlue 409, 265 ($str)) ///////////// else hint Картинки не найдены end_if end_while
// процедура поиска и сортировки proc test %picture %symbol %GetImage %path #deltaY #deltaspace #accuracy #deviation #wait #timeproc #repeatimage set #GetStartX %GetImage [1 1] set #GetStartY %GetImage [1 2] set #GetEndX %GetImage [1 3] set #GetEndY %GetImage [1 4] set #current_script current_script // загрузка картинок в память if size(%path) > 0 // если картинки найдены for #i 1 size(%path) for #j 1 size(%picture) if %path [#i 3] = %picture [#j] set #n #n + 1 set %image [#n] LoadImage(%path [#i 1]) set %number [#n] %symbol [#j] break end_if end_for end_for else log Картинки в: $path не найдены log Скрипт остановлен stop_script #current_script end_if // поиск картинок и их сортировка set size(%result1) while size(%result1) = 0 and (#timeproc > timer or #timeproc = 0) set #z 0 set %get GetImage(#GetStartX #GetStartY #GetEndX #GetEndY) // сохранить часть экрана в память set #v %get [1 1] for #i 1 size(%number) set #a Findimage(0 0 %get [1 2] %get [1 3] (%image[#i 1]) %a #v #accuracy -1 #deviation) // поиск if #a < 0 log Ошибка поиска картинки. Код ошибки: #a log Скрипт остановлен stop_script #current_script end_if if #a > 0 for #j 1 size(%a) set #z #z + 1 init_arr %result1 (1 1 #z) %number[#i] %a[#j 1] %a[#j 2] // запись результатов поиска в массив end_for end_if wait #wait end_for if size(%result1) > 0 gosub sortY // сортировка по Y и X end_if set $b DeleteImage(%get[1 1]) // удалить изображение, полученное GetImage end_while goto end // выйти из процедуры
:sortY ///// удаление повторных координат, если используется несколько видов одной картинки set #size 0 set %tmp %result1 set size(%result1) for #i 1 size(%tmp[1]) set #break 0 for #n 1 #size set #xrepeat %tmp[2 #i] - %result1[2 #n] set #yrepeat %tmp[3 #i] - %result1[3 #n] if abs(#xrepeat) <= #repeatimage and abs(#yrepeat) <= #repeatimage set #break 1 break end_if end_for if #break = 0 set #size #size + 1 init_arr %result1 (1 1 #size) %tmp [1 #i] %tmp [2 #i] %tmp [3 #i] end_if end_for ///////
set #z 0 set #z1 0 set #z2 1 set #z4 0 sort_array %result1 -3 while 1 = 1 set #z 0 set size(%tmp) for #i #z2 eval(size(%result1 [1]) - 1) set #j #i + 1 set #x %result1 [3 #i] - %result1 [3 #j] if abs(#x) < #deltaY set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #i] %result1 [2 #i] %result1 [3 #i] else set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #i] %result1 [2 #i] %result1 [3 #i] break end_if end_for set #z2 #z2 + #z if #z2 = size(%result1[]) set #x %result1 [3 #i] - %result1 [3 #j] if abs(#x) > #deltaY set #jj #j sort_array %tmp -2 set #z1 #z1 + 1 init_arr %result (#z1) %tmp [1] gosub space set size(%tmp) set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #jj] %result1 [2 #jj] %result1 [3 #jj] set #z1 #z1 + 1 set %result.#current_script [#z1] %tmp [1] gosub end end_if set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #j] %result1 [2 #j] %result1 [3 #j] sort_array %tmp -2 set #z1 #z1 + 1 init_arr %result (#z1) %tmp [1] gosub space break else sort_array %tmp -2 set #z1 #z1 + 1 init_arr %result (#z1) %tmp [1] gosub space end_if end_while return
:space set #z3 0 set size(%space) set #z4 #z4 + 1 //посчитать где нужны пробелы for #i 1 eval(size(%tmp[]) - 1) set #j #i + 1 set #space %tmp [2 #i] - %tmp [2 #j] if abs(#space) > #deltaspace set #z3 #z3 + 1 set %space[#z3] #j end_if end_for // вставить пробелы for #i 1 size(%space) set $str %result [#z4] set $str insert(" " $str %space[#i]) set #j #i + 1 set %space[#j] %space[#j] + #i set %result [#z4] $str end_for // сохранение массива в основном скрипте for #i 1 size(%result) set size(%tmp1) init_arr %tmp1 (1) %result [#i] for #j 1 size(%tmp1[1]) set %result.#current_script [#i #j] %tmp1 [1 #j] end_for end_for return
:end end_proc
|
|
|
|
ivanTu |
1.9.2017, 13:59
|
Apprentice
Сообщений: 128
Регистрация: 2.2.2015 Группа: Пользователи Наличность: 0
Пользователь №: 17.276
Возраст: 27
|
Искать сразу все очень долго, картинок очень много просто около 50ти., да и действия требуются для каждого моба отдельно, к примеру не достиг максимального уровня, пропускаем его, если прокачался максимально, ткнуть на моба, он автоматически убирается, и на его нужно будет впихнуть другого моба, ну это уже будет другая подпрограмма )
|
|
|
|
cirus |
3.9.2017, 2:13
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26845
Пользователь №: 16.971
Возраст: 29
|
Цитата Искать сразу все очень долго, картинок очень много просто около 50ти Искать сразу быстрее и достаточно по 1 картинке каждого числа, хоть они и отличаются. В архиве видео и картинки, которые использовались для поиска:
Поиск_чисел.zip ( 2,13 мегабайт )
Кол-во скачиваний: 437Картинки для поиска сохранялись скриптом Поиск статичных точек на нескольких картинкахСкрипт сохраняет картинку с теми пикселями, которые присутствуют на всех анализируемых картинках. Оставшийся фон закрашен вручную. Цитата да и действия требуются для каждого моба отдельно %result [1 1] - уровень верхнего моба %result [2 1] - уровень левого моба %result [2 2] - уровень правого моба %result [3 1] - уровень нижнего моба
|
|
|
|
ivanTu |
4.9.2017, 16:26
|
Apprentice
Сообщений: 128
Регистрация: 2.2.2015 Группа: Пользователи Наличность: 0
Пользователь №: 17.276
Возраст: 27
|
Цитата %result [1 1] - уровень верхнего моба %result [2 1] - уровень левого моба %result [2 2] - уровень правого моба %result [3 1] - уровень нижнего моба Что то не совсем понимаю, как это работает, делаю проверку типа: Код if %result [2 2] = 25 left Кординаты правого моба end_if
но если моба справа нет, а есть снизу к примеру, он по прежнему клацает правого Я наверное что то не понял...
|
|
|
|
cirus |
5.9.2017, 3:58
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26845
Пользователь №: 16.971
Возраст: 29
|
Числа расположены по строкам и столбцам. [1 1] - первая строка, первое число [2 1] - вторая строка, первое число [2 2] - вторая строка, второе число [3 1] - третья строка, первое число Попробуй этот скрипт. код
Код // Поиск числа с помощью FindImage init_arr %GetImage (1) 0 0 99, 58 // координаты для поиска, StartX StartY EndX EndY
set linedelay 0 init_arr %picture 0 1 2 3 4 5 6 7 8 9 // имена картинок (0.bmp, 1.bmp и т. д.) init_arr %symbol 0 1 2 3 4 5 6 7 8 9 // символ соответствующий имени, т. е. картинка 0.bmp соответствует 0 set $path "C:\Image3" // папка с картинками set $bmp "*.bmp*" // формат картинок set #deltaY 8 // расстояние между строками (можно указать высоту картинок) set #deltaspace 12 // допустимое расстояние между цифрами, иначе будет считаться что это не одно число set #accuracy 90 // точность поиска для Findimage set #deviation 3 // погрешность оттенка для Findimage set #wait 2 // пауза между поиском картинок, если указать меньше искать будет быстрее, но нагрузит процессор set #timeproc 2000 // время (в мсек) для поиска картинок, если 0 не выйдет из процедуры пока не найдётся хотя бы 1 картинка set #repeatimage 2 // допустимое смещение координат, если используется несколько видов одной картинки
dir (%path $path $bmp) set delimiter ' ' while 1 = 1 set size(%result) // уничтожить массив с предыдущими результатами set size(%coord) // уничтожить массив с предыдущими координатами call test %picture %symbol %GetImage %path #deltaY #deltaspace #accuracy #deviation #wait #timeproc #repeatimage // процедура поиска // save_array %result C:\resultarr.txt // массив с результатами поиска // save_array %coord C:\coordarr.txt // массив с координатами чисел if size(%result) > 0 // если размер массива больше 0 // ТУТ НУЖНЫЕ ДЕЙСТВИЯ ///////////// для примера вывод в hint того что нашлось (можно убрать) set $str set %z [1] \n for #i 1 size(%result) set $str $str%result[#i] if #i != size(%result) set $str $str%z [1] end_if end_for hint (14 clBlue 409, 265 ($str)) ///////////// else hint Картинки не найдены end_if end_while
// процедура поиска и сортировки proc test %picture %symbol %GetImage %path #deltaY #deltaspace #accuracy #deviation #wait #timeproc #repeatimage set #GetStartX %GetImage [1 1] set #GetStartY %GetImage [1 2] set #GetEndX %GetImage [1 3] set #GetEndY %GetImage [1 4] set #current_script current_script // загрузка картинок в память if size(%path) > 0 // если картинки найдены for #i 1 size(%path) for #j 1 size(%picture) if %path [#i 3] = %picture [#j] set #n #n + 1 set %image [#n] LoadImage(%path [#i 1]) set %number [#n] %symbol [#j] break end_if end_for end_for else log Картинки в: $path не найдены log Скрипт остановлен stop_script #current_script end_if // поиск картинок и их сортировка set size(%result1) set size(%coord_tmp) while size(%result1) = 0 and (#timeproc > timer or #timeproc = 0) set #z 0 set %get GetImage(#GetStartX #GetStartY #GetEndX #GetEndY) // сохранить часть экрана в память set #v %get [1 1] for #i 1 size(%number) set #a Findimage(0 0 %get [1 2] %get [1 3] (%image[#i 1]) %a #v #accuracy -1 #deviation) // поиск if #a < 0 log Ошибка поиска картинки. Код ошибки: #a log Скрипт остановлен stop_script #current_script end_if if #a > 0 for #j 1 size(%a) set #z #z + 1 init_arr %result1 (1 1 #z) %number[#i] %a[#j 1] %a[#j 2] // запись результатов поиска в массив end_for end_if wait #wait end_for if size(%result1) > 0 gosub sortY // сортировка по Y и X end_if set $b DeleteImage(%get[1 1]) // удалить изображение, полученное GetImage end_while goto end // выйти из процедуры
:sortY ///// удаление повторных координат, если используется несколько видов одной картинки set #size 0 set %tmp %result1 set size(%result1) for #i 1 size(%tmp[1]) set #break 0 for #n 1 #size set #xrepeat %tmp[2 #i] - %result1[2 #n] set #yrepeat %tmp[3 #i] - %result1[3 #n] if abs(#xrepeat) <= #repeatimage and abs(#yrepeat) <= #repeatimage set #break 1 break end_if end_for if #break = 0 set #size #size + 1 init_arr %result1 (1 1 #size) %tmp [1 #i] %tmp [2 #i] %tmp [3 #i] end_if end_for ///////
set #z 0 set #z1 0 set #z2 1 set #z4 0 sort_array %result1 -3 while 1 = 1 set #z 0 set size(%tmp) for #i #z2 eval(size(%result1 [1]) - 1) set #j #i + 1 set #x %result1 [3 #i] - %result1 [3 #j] if abs(#x) < #deltaY set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #i] %result1 [2 #i] %result1 [3 #i] else set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #i] %result1 [2 #i] %result1 [3 #i] break end_if end_for set #z2 #z2 + #z if #z2 = size(%result1[]) set #x %result1 [3 #i] - %result1 [3 #j] if abs(#x) > #deltaY set #jj #j sort_array %tmp -2 set #z1 #z1 + 1 init_arr %result (#z1) %tmp [1] gosub space set size(%tmp) set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #jj] %result1 [2 #jj] %result1 [3 #jj] set #z1 #z1 + 1 set %result.#current_script [#z1] %tmp [1] gosub end end_if set #z #z + 1 init_arr %tmp (1 1 #z) %result1 [1 #j] %result1 [2 #j] %result1 [3 #j] sort_array %tmp -2 set #z1 #z1 + 1 init_arr %result (#z1) %tmp [1] set %coord_tmp [#z1] %tmp [2 1], %tmp [3 1] gosub space break else sort_array %tmp -2 set #z1 #z1 + 1 init_arr %result (#z1) %tmp [1] set %coord_tmp [#z1] %tmp [2 1], %tmp [3 1] gosub space end_if end_while return
:space set #z3 0 set size(%space) set #z4 #z4 + 1 //посчитать где нужны пробелы for #i 1 eval(size(%tmp[]) - 1) set #j #i + 1 set #space %tmp [2 #i] - %tmp [2 #j] if abs(#space) > #deltaspace set #z3 #z3 + 1 set %space[#z3] #j set %coord_tmp [#z1 #i] %tmp [2 #j], %tmp [3 #j] end_if end_for // вставить пробелы for #i 1 size(%space) set $str %result [#z4] set $str insert(" " $str %space[#i]) set #j #i + 1 set %space[#j] %space[#j] + #i set %result [#z4] $str end_for // сохранение массива в основном скрипте for #i 1 size(%result) set size(%tmp1) init_arr %tmp1 (1) %result [#i] for #j 1 size(%tmp1[1]) set %result.#current_script [#i #j] %tmp1 [1 #j] set %coord.#current_script [#i #j] %coord_tmp [#i #j] end_for end_for return
:end end_proc Кроме массива с числами создаётся массив %coord (с теми же индексами что и %result) с координатами чисел. Получится: Код %result [1 1] - уровень верхнего моба %coord [1 1] - координаты чисел у верхнего моба %result [2 1] - уровень левого моба %coord [2 1] %result [2 2] - уровень правого моба %coord [2 2] %result [3 1] - уровень нижнего моба %coord [3 1] Условие так: Код if %result [1 1] = 25 left %coord [1 1] end_if if %result [2 1] = 25 left %coord [2 1] end_if if %result [2 2] = 25 left %coord [2 2] end_if if %result [3 1] = 25 left %coord [3 1] end_if // Или циклом проверять все элементы массива. Допустим, верхнего моба нет, тогда верхним будет левый. Хотя это уже не имеет значения, координаты будут правильные. Скрипт не тестил. Могут быть косяки. Будет время подправлю.
|
|
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|