|
|
|
Поиск числа с помощью Findimage, Готовый скрипт |
|
|
dron4938 |
15.4.2017, 20:23
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
Цитата(cirus @ 15.4.2017, 20:45) Если закрасить половину картинки в цвет фона, то придётся указывать точность поиска 50%.
Вроде как нет. Пример: Если закрасить картинку 50% фоном (IMG: https://i.yapx.ru/H5u6.png) То пилот будет искать 17 пикселей из всех 35. И если задать точность поиска 50%, то из этих 17 пикселей, достаточно будет найти 8, что-бы картинка нашлась. 50% от 17 = 50 х (1 / 100) х 17 = 8,5 (IMG: https://i.yapx.ru/H5wE.png) и соответственно может определить картинку не верно
|
|
|
|
dron4938 |
15.4.2017, 22:10
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
Небольшой пример, есть 2 картинки (8х12)=96px с 50% закрашенным фоном, если присмотреться то верхушки картинок абсолютно схожи и если ставить точность поиска 50%, то в одной картинке поиск находит сразу две. (IMG: https://i.yapx.ru/H55w.png) (IMG: https://i.yapx.ru/H55Y.gif) (IMG: https://i.yapx.ru/H55j.png) 96 пикселей из них 49 пикселей это фон и другие 47 картинка Пилот ищет по 47 пикселям 50% от 47 = 23,5 (50 × (1 / 100) × 47 = 23,5)т.е. найдя 23 пикселя, пилот скажет, что картинка найдена (IMG: https://i.yapx.ru/H56r.gif) код
init_arr %GetImage (1) 0, 0 200, 80 // координаты для поиска, StartX StartY EndX EndY
set linedelay 0 init_arr %picture 8 9 // имена картинок (0.bmp, 1.bmp и т. д.) init_arr %symbol 8 9 // символ соответствующий имени, т. е. картинка 0.bmp соответствует 0 set $path "C:\number" // папка с картинками set $bmp "*.bmp*" // формат картинок set #deltaY 8 // расстояние между строками (можно указать высоту картинок) set #deltaspace 12 // допустимое расстояние между цифрами, иначе будет считаться что это не одно число set #accuracy 50 // точность поиска для Findimage set #deviation 0 // погрешность оттенка для Findimage set #wait 1 // пауза между поиском картинок, если указать меньше искать будет быстрее, но нагрузит процессор set #timeproc 200 // время (в мсек) для поиска картинок, если 0 не выйдет из процедуры пока не найдётся хотя бы 1 картинка
dir (%path $path $bmp) set delimiter ' ' while 1 = 1 set size(%result) // уничтожить массив с предыдущими результатами call test %picture %symbol %GetImage %path #deltaY #deltaspace #accuracy #deviation #wait #timeproc // процедура поиска // 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 139, 33 ($str)) ///////////// else hint Картинки не найдены end_if end_while
// процедура поиска и сортировки 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
Прикрепленные файлы
number.rar ( 647 байт )
Кол-во скачиваний: 2196
|
|
|
|
dron4938 |
22.5.2017, 1:15
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
Можно ли как то прописать поиск не из заданной области экрана, а из картинки например: set %a GetImage (0 0 100 100) // сохранить в памяти часть экранной области set $bmp SaveImage (%a [1 1] C:\picture.bmp) // сохранить в файл на диск C:\ затем сделать поиск в этой сохраненной картинке типа как финдимидж, только вместо координат путь к картинке set #a FindImage (C:\picture.bmp ("C:\pilot\A.bmp") %arr 2 1 1 1) (IMG: style_emoticons/default/rolleyes.gif)
|
|
|
|
dron4938 |
23.5.2017, 20:18
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
Спасябки (IMG: style_emoticons/default/smile.gif) Кстати а изменения можно посредством пилота внести в сохраненное изображение? Сделать например изображение черно белым и уже потом поиск в нем произвести? И можно ли чтобы картинка сохранялась новая, а не заменялась старая set $bmp SaveImage (%a [1 1] C:\picture.bmp) // сохранить в файл на диск C:\ типа как picture1.bmp picture2.bmp picture3.bmp вернее даже не так) наверное будет правильнее, что если такая картинка существует уже, то прибавить +1 к имени файла получилось вот таким макаром set #th Hour set #tm Min set #ts Sec set $bm ".bmp" set $bmp SaveImage (%a [1 1] C:\#th#tm#ts$bm) // сохранить в файл на диск C:\
|
|
|
|
dron4938 |
24.5.2017, 13:40
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
так это-же для поиска чисел) цветных я тут подумал, что если картинку с цифрой перед поиском делать черно-белой, то можно будет более быстрее находить) Код set %a GetImage (0 0 100 100) // сохранить в памяти часть экранной области set $bmp SaveImage (%a [1 1] C:\picture.bmp) // сохранить в файл на диск C:\ [b]тут код преобразовывающий картинку в черно белую[/b] set %b [1] LoadImage (C:\picture.bmp) set #a FindImage (0 0 100 100 ("C:\pilot\A.bmp") %arr %b [1 1] 1 1 1) set $del DeleteImage (%b [1 1]) if #a = 100 end_if (IMG: https://i.yapx.ru/JSq8.png) (IMG: https://i.yapx.ru/JSrC.png) как видим черно-белая преобразованная цифра имеет 100% схожесть в пикселях Но скорее всего код будет огромным. наверно я ошибся) (IMG: style_emoticons/default/rolleyes.gif)
|
|
|
|
|
|
8 чел. читают эту тему (гостей: 8, скрытых пользователей: 0)
Пользователей: 0
|
|