|
|
|
Поиск числа с помощью Findimage, Готовый скрипт |
|
|
DarkMaster |
5.9.2017, 15:25
|
Модератор UOPilot
Сообщений: 9.468
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27737
Пользователь №: 11.279
|
Цитата Вообще на луа надо написать, но в нём не работали getimage и loadimage. Ну как бы в этом и дело) Меня прижало, собрался переписывать, а судя по теме что-то править вроде собирался. Ну и чтобы мне потом не искать что правилось, решил сначала спросить. Если правка мелкая, сделай, если не сложно, в ближайшее время, т.к. ждать до выходных я не буду точно и перепишу "как есть". По поводу переписки есть пара идей, как сделать чуть более удобно по части вызова и доп параметров необязательных. Сообщение отредактировал DarkMaster - 5.9.2017, 15:33
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
cirus |
6.9.2017, 4:01
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26746
Пользователь №: 16.971
Возраст: 29
|
Цитата еще бы кто-то с goto не позорился))) (IMG: style_emoticons/default/smile.gif) Сначала был костыль для отладки, потом так и остался. Исправил несколько косяков с возвращением координат чисел. код
Код // Поиск числа с помощью FindImage init_arr %GetImage (1) 0 0 245, 98 // координаты для поиска, 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:\Users\abc\Desktop\result111.txt // массив с результатами поиска // save_array %coord C:\Users\abc\Desktop\coord111.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] set %coord_tmp [#z1] %tmp [2 1], %tmp [3 1] set %coord.#current_script [#z1] %tmp [2 #z], %tmp [3 #z] 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] set %coord.#current_script [#z1] %tmp [2 #z], %tmp [3 #z] 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 #size_coord 1 while %coord_tmp[#z1 #size_coord] != "" set #size_coord #size_coord + 1 end_while set %coord_tmp [#z1 #size_coord] %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 Тестил только в блокноте. Вроде работает.
|
|
|
|
cirus |
7.9.2017, 3:13
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26746
Пользователь №: 16.971
Возраст: 29
|
ivanTu, пробуй. Нацарапал чего-то. На скринах работает. код
Код // Поиск числа с помощью FindImage init_arr %GetImage (1) 0 0 268, 184 // координаты для поиска, StartX StartY EndX EndY log clear log mode compact
set $path_star_purple C:\Users\abc\Desktop\star_purple.bmp // путь к картинке фиолетовой звезды set $path_star_yellow C:\Users\abc\Desktop\star_yellow.bmp // путь к картинке жёлтой звезды
set linedelay 0 init_arr %picture 0 1 2 3 4 5 8 // имена картинок (0.bmp, 1.bmp и т. д.) init_arr %symbol 0 1 2 3 4 5 8 // символ соответствующий имени, т. е. картинка 0.bmp соответствует 0 set $path "C:\Users\abc\Desktop\пилот тест\картинки" // папка с картинками set $bmp "*.bmp*" // формат картинок set #deltaY 11 // расстояние между строками (можно указать высоту картинок) set #deltaspace 12 // допустимое расстояние между цифрами, иначе будет считаться что это не одно число set #accuracy 100 // точность поиска для Findimage set #deviation 7 // погрешность оттенка для Findimage set #wait 2 // пауза между поиском картинок, если указать меньше искать будет быстрее, но нагрузит процессор set #timeproc 2000 // время (в мсек) для поиска картинок, если 0 не выйдет из процедуры пока не найдётся хотя бы 1 картинка set #repeatimage 2 // допустимое смещение координат, если используется несколько видов одной картинки
set %star [1] LoadImage ($path_star_purple) // загрузка картинок звёзд в память set %star [2] LoadImage ($path_star_yellow) 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:\Users\abc\Desktop\result111.txt // массив с результатами поиска // save_array %coord C:\Users\abc\Desktop\coord111.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)) /////////////
// поиск звёзд и проверка достиг ли моб максимального уровня for #i 1 size(%result) for #j 1 size(%result[]) if %result [#i #j] != "" set $coord %coord [#i #j] gosub find_star // подпрограмма поиска звёзд end_if end_for end_for
end_script // убрать else hint Картинки не найдены end_if
end_while
:find_star init_arr %tmp (1) $coord set #mindistX 5 set #mindistY 5 set #startX %tmp[1 1] - 50 set #startY %tmp[1 2] - 60 set #endX %tmp[1 1] + 30 set #endY %tmp[1 2] - 30 set #a Findimage(#startX #startY #endX #endY (%star[1 1]) %arr 2 90 -1 10) // фиолетовые звёзды if #a > 0 gosub del_double // удаление лишних картинок gosub level // проверка уровня моба в зависимости от количества звёзд end_if set #a Findimage(#startX #startY #endX #endY (%star [2 1]) %arr 2 90 -1 12) // жёлтые звёзды if #a > 0 gosub del_double // удаление лишних картинок gosub level // проверка уровня моба в зависимости от количества звёзд end_if return
:del_double set #ii -1 while #ii < size(%arr) set #ii #ii + 1 set #double 1 while #double = 1 set #double 0 set #iii #ii + 1 set #jj #iii while #jj < size(%arr) set #jj #jj + 1 set #distX abs(eval(%arr [#iii 1] - %arr [#jj 1])) set #distY abs(eval(%arr [#iii 2] - %arr [#jj 2])) if #distX < #mindistX and #distY < #mindistY delete_array %arr -#jj set #jj #jj - 1 set #double 1 end_if end_while end_while end_while return
:level switch size(%arr) case 2: log Количество звёзд 2 if %result [#i #j] = 20 log Моб достиг максимального уровня log Уровень моба: %result [#i #j] log move %coord [#i #j] wait 500 else log Моб не достиг максимального уровня log Уровень моба: %result [#i #j] log end_if break case 3: log Количество звёзд 3 if %result [#i #j] = 25 log Моб достиг максимального уровня log Уровень моба: %result [#i #j] log move %coord [#i #j] wait 500 else log Моб не достиг максимального уровня log Уровень моба: %result [#i #j] log end_if break case 4: log Количество звёзд 4 if %result [#i #j] = 30 log Моб достиг максимального уровня log Уровень моба: %result [#i #j] log move %coord [#i #j] wait 500 else log Моб не достиг максимального уровня log Уровень моба: %result [#i #j] log end_if break case 5: log Количество звёзд 5 if %result [#i #j] = 35 log Моб достиг максимального уровня log Уровень моба: %result [#i #j] log move %coord [#i #j] wait 500 else log Моб не достиг максимального уровня log Уровень моба: %result [#i #j] log end_if break case 6: log Количество звёзд 6 if %result [#i #j] = 40 log Моб достиг максимального уровня log Уровень моба: %result [#i #j] log move %coord [#i #j] wait 500 else log Моб не достиг максимального уровня log Уровень моба: %result [#i #j] log end_if end_switch return
// процедура поиска и сортировки 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] set %coord_tmp [#z1] %tmp [2 1], %tmp [3 1] set %coord.#current_script [#z1] %tmp [2 #z], %tmp [3 #z] 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] set %coord.#current_script [#z1] %tmp [2 #z], %tmp [3 #z] 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 #size_coord 1 while %coord_tmp[#z1 #size_coord] != "" set #size_coord #size_coord + 1 end_while set %coord_tmp [#z1 #size_coord] %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
star_purple.bmp ( 236 байт )
Кол-во скачиваний: 360
star_yellow.bmp ( 248 байт )
Кол-во скачиваний: 386
|
|
|
|
DarkMaster |
21.9.2017, 17:10
|
Модератор UOPilot
Сообщений: 9.468
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27737
Пользователь №: 11.279
|
Бетка распознавания текста. Буду благодарен за тесты и багрепорты, т.к. времени катастрофически не хватает. Распознавание текста
Код do -- Символы для поиска. -- Возможно указать в двух вариантах синтаксиса: упрощенном и полном. -- Упрощенный синтаксис: -- В упрощенном варианте синтаксиса допускается не указывать -- соответствие имен файлов и строке/символу, -- который они обозначают: считается, что они идентичны. -- Пример упрощенного синтаксиса: -- local symbols = {"0", "1", "2", "3", "a", "b", "c", "test"} -- Полный синтаксис: -- Полный синтаксис бывает необходим при использовании -- нескольких изображений соответсвующих одной и той же строке/символу. -- Допускаются переносы строк: -- local symbols = { -- "0" = {"zero1", "zero2"}, -- "1" = {"1a", "1b"}, -- "2" = {"two", "second"} -- } -- Оба варианта синтаксиса можно сочетать: -- local symbols = {"0", "1", "2" = {"two", "second"}, "3"}
local default = {} -- набор стандартных символов default.symbols = {["0"]={"0"}, ["1"]={"1"}, ["2"]={"2"}, ["3"]={"3"}, ["4"]={"4"}, ["5"]={"5"}, ["6"]={"6"}, ["7"]={"7"}, ["8"]={"8"}, ["9"]={"9"}} default.crds = {0, 0, 1920, 1080} -- Координаты поиска default.path = "c:\\image" -- Папка с картинками default.ext = ".bmp" -- Расширение картинок default.deltaY = 8 -- Расстояние между строками (можно указать высоту картинок) default.deltaSpace = 12 -- Допустимое расстояние между цифрами, иначе будет считаться что это не одно число default.accuracy = 95 -- Точность поиска для Findimage default.deviation = 3 -- Погрешность оттенка для Findimage default.wait = 2 -- Пауза между поиском картинок, если указать меньше искать будет быстрее, но нагрузит процессор default.timeProc = 2000 -- Время в секундах (может быть не целым) для поиска картинок, если -1 не выйдет из процедуры пока не найдётся хотя бы 1 картинка default.repeatImage = 2 -- Допустимое смещение координат, если используется несколько видов одной картинки default.window = "workwindow" -- Метод|хендл_окна в котором происходит поиск (если указан источник изображения(source), то параметр будет проигнорирован) default.abs = 0 -- Использовать abs координаты. default.source = nil -- Изображение в котором производится поиск. nil приведет к захвату изображения с экрана. default.bufferAddNew = 1 -- Добавлять изображения в буфер default.bufferIgnore = 0 -- Игнорировать изображения находящиеся в буфере default.bufferUpdate = 1 -- Обновить изображения содержащиеся в буфере. default.loadPath = nil -- Путь по которому будут загружены все изображения с указанными расширением. Имя файла будет соответсвовать имени символа.
-- Буфер -- Буфер -- Буфер
local buffer = {} -- Массив с загруженными картинками. imageToStringBuffer = {} -- набор функций по управлению буфером. -- Полностью очищаем массив. function imageToStringBuffer.flush() for k,_ in pairs(buffer) do buffer[v] = nil end end -- Удаляем элемент из буфера function imageToStringBuffer.flush(element) buffer[element] = nil end -- Добавляем изображение в буфер function imageToStringBuffer.flush(element, val) buffer[element] = val end
-- Поиск -- Поиск -- Поиск
function imageToString(options)
-- Проверяем переданные параметры. Если они отсутствуют - подставляем параметры по умолчанию. if options == nil then options = {} end if options.symbols == nil then options.symbols = default.symbols end if options.crds == nil then options.crds = default.crds end if options.path == nil then options.path = default.path end if options.ext == nil then options.ext = default.ext end if options.deltaY == nil then options.deltaY = default.deltaY end if options.deltaSpace == nil then options.deltaSpace = default.deltaSpace end if options.accuracy == nil then options.accuracy = default.accuracy end if options.deviation == nil then options.deviation = default.deviation end if options.wait == nil then options.wait = default.wait end if options.timeProc == nil then options.timeProc = default.timeProc end if options.repeatImage == nil then options.repeatImage = default.repeatImage end if options.window == nil then options.window = default.window end if options.abs == nil then options.abs = default.abs end if options.source == nil then options.source = default.source end if options.bufferAddNew == nil then options.bufferAddNew = default.bufferAddNew end if options.bufferIgnore == nil then options.bufferIgnore = default.bufferIgnore end if options.bufferUpdate == nil then options.bufferUpdate = default.bufferUpdate end if options.loadPath == nil then options.loadPath = default.loadPath end
--Добавляем при необходимости обратный слэш в путь. if string.sub(options.path, -1) ~= "\\" then options.path = options.path .. "\\" end
-- Преобразуем урощенный синтаксис в полноценный. for symbolName, imageName in pairs(options.symbols) do if type(options.symbols[symbolName]) ~= "table" then options.symbols[imageName] = {imageName} end end
-- Преобразуем ссылку на папку с изображениями -- в полноценный синтаксис. --local fileList = {} --log (options.path, options.ext) --fileList = dir(options.path, options.ext) --table.show(fileList, "fileList")
-- Удаляем параметры переданные, как упрощенные (теперь уже содежатся в полном виде) for i=1, #options.symbols do table.remove(options.symbols, i) end
-- Приводим options.abs к виду пригодному для финдимиджа. if options.abs == 1 then options.abs = "abs" elseif options.abs == 0 then options.abs = "" end --table.show(options)
-- Загрузка картинок local images={} --Загружает в память изображения {имя символа, {адреса в памяти}} local loadError = 0 for symbolName, fileList in pairs(options.symbols) do images[symbolName] = {} for i=1, #fileList, 1 do -- Загружен ли файл в буфер, если нет, то подгружаем. local filePath = options.path..fileList[i]..options.ext if options.bufferIgnore == 0 and options.bufferUpdate == 0 and buffer[filePath] == nil then images[symbolName][i] = buffer[filePath] else -- В буфере изображения нет, загружаем с диска. --log(filePath.."В буфере изображения нет, загружаем с диска.") images[symbolName][i] = loadimage(filePath) -- Обновляем загруженное в буфер изображение if buffer[filePath] ~= nil then DeleteImage(buffer[filePath]) buffer[filePath] = images[symbolName][i] elseif options.bufferAddNew == 1 and options.bufferIgnore == 0 then -- Добавляем в буфер новое изображение. buffer[filePath] = images[symbolName][i] end end -- Поиск ошибок загрузки. if images[symbolName][i] < 0 then loadError = loadError + 1 log("Image loading fail. Error file: "..filePath..'.') end end end -- При загрузке изображений произошли ошибки. Останавливаем скрипт. if loadError > 0 then log("Error loading count: "..loadError..'.') stop_script() end --table.show(images)
local timeout = os.clock() + options.timeProc crdsRaw={} -- Массив со всеми найденными изображениями, возможны дубли, не сортированный. repeat -- Повторяем пока что-то не найдем или не выйдет время на поиск (options.timeProc). -- Получаем изображение с экрана, если источник не указан. local screenshot = nil if options.source == nil then screenshot = getimage(options.crds[1],options.crds[2],options.crds[3],options.crds[4], options.window) else screenshot = options.source end --log(screenshot) for symbolName, imageAddress in pairs(images) do tmp = {} findResult = findimage( options.crds[1] .. " " .. options.crds[2] .. " " .. options.crds[3] .. " " .. options.crds[4] .. " " .. "(" .. options.path .. symbolName .. options.ext .. ") " .. "%tmp " .. screenshot .. " " .. options.accuracy .. " -1 " .. options.deviation .. " " .. options.abs) --log("symoblName: ".. symbolName .. " findResult: " .. findResult) -- проверяем на возрват нуля или ошбики, со стрингом нормально не сравнить. if findResult ~= "0" and not string.find(findResult, "-") then -- Добавляем найденные значения в общий результат поисков. --table.show(tmp,"tmp") for i = 1, #tmp, 1 do -- Напрямую вернуть таблицу в функцию нельзя из-за синтаксиса. -- FIX. Нужен фикс функции findimage пилота (возвращает координаты стрингом) -- после фикса просто удалить "tonumber(parm)" оставив parm. table.insert(crdsRaw,{x=tonumber(tmp[i][1]),y=tonumber(tmp[i][2]),symbolName=symbolName}) end end end
-- Удаляем изображение, если делали скриншот. if options.source ~= nil then deleteimage(screenshot) end
--table.show(images, "images") --log (#crdsRaw, timeout, os.clock(), options.timeProc) --log ("until") local clock = os.clock() until not ((#crdsRaw == 0) and (timeout > clock or options.timeProc == -1)) --table.show(crdsRaw, "crdsRaw")
-- Изображения не были найдены, выходим из поиска. if #crdsRaw < 1 then return nil end -- Удаляем дубли. crdsClear={} -- Массив без дублей. for i=1, #crdsRaw, 1 do local catch = 0 -- Флаг найденного дубля. for n=i+1, #crdsRaw, 1 do --log( -- crdsRaw[i].symbolName.." == "..crdsRaw[n].symbolName.." and ".. -- math.abs(crdsRaw[i].x - crdsRaw[n].x).." <= "..options.repeatImage.." and ".. -- math.abs(crdsRaw[i].y - crdsRaw[n].y).." <= "..options.repeatImage --) if crdsRaw[i].symbolName == crdsRaw[n].symbolName and math.abs(crdsRaw[i].x - crdsRaw[n].x) <= options.repeatImage and math.abs(crdsRaw[i].y - crdsRaw[n].y) <= options.repeatImage then catch = 1 break end end --log(catch) if catch == 0 then -- не дубль, копируем значение в чистый массив. table.insert(crdsClear,crdsRaw[i]) end end
-- Сортируем элементы. -- Сортировка происходит, как по X координате, -- так и по Y учитывая возможность нескольких строк. -- Межстрочный интервал задается с помощью options.deltaY. -- Для уплотнения поиска options.deltaY может быть отрицательным. -- Отрицательный options.deltaY в первую очередь необходим, -- если изображения символов содержат сверху и снизу от символа фон. -- crdsClear был предварительно очищен от дублей, теперь сортируется.
--table.show(crdsClear,"crdsClear") --table.toInit(crdsClear) table.sort(crdsClear, function(a,b) if math.abs(a.y - b.y) <= options.deltaY then if a.x < b.x then return true else return false end else if a.y < b.y then return true else return false end end end ) --table.show(crdsClear,"crdsClear")
-- Собираем строку --log(#crdsClear) local result = {{crdsClear[1].symbolName}} local resultX, resultY = 1, 1 for i=2, #crdsClear, 1 do -- Добавляем перенос и символ, возрващем каретку. if crdsClear[i-1].y + options.deltaY < crdsClear[i].y then resultX = resultX + 1 resultY = 1 -- возврат картеки result[resultX]={crdsClear[i].symbolName} -- Добавляем пробел и символ elseif crdsClear[i-1].x + options.deltaSpace < crdsClear[i].x then resultY = resultY + 1 result[resultX][resultY] = crdsClear[i].symbolName -- Добавляем символ else result[resultX][resultY] = result[resultX][resultY].. crdsClear[i].symbolName end --table.show(result,"result") end --table.show(result,"result") return result end end Пример вызова: Код result = imageToString{path="img", timeProc=0, crds={0,0,110,150}} Может пригодится при тестах: Вывод таблицы в лог
Код do local tab = "" local deep = 0 function table.show(t, comment) -- Пишем в лог комментарий. deep = deep + 1 -- Уровень вложенности вызовов функции. --log(comment .. commentSended .. deep) if comment ~= nil and deep == 1 then log(comment) end
if type(t) == "nil" then log("table is nil") elseif type(t) == "string" then log('table is string: "'..t..'"') elseif type(t) == "number" then log('table is number: '..t) elseif type(t) == "table" then local elementsInTable = 0 for k,v in pairs(t) do if type (v) == "table" then log(tab.."table: "..k) tab = tab .. " " table.show(v) tab = string.sub(tab, 1, -5) elementsInTable = elementsInTable + 1 else elementsInTable = elementsInTable + 1 if type(v) == "string" then v = '"'..v..'"' end if type(k) == "string" then k = '"'..k..'"' end log(tab..""..k.." = "..v) end end if elementsInTable == 0 then log("table is empty") end else log('table is unknow data type') end -- Пишем в лог комментарий. deep = deep - 1 -- Уровень вложенности вызовов функции. end end Вывод таблицы в лог в формате инициализации
Код function table.toInit(t) log("mode compact") log('table_name={') for k,v in pairs (t) do local str = " {" for k2,v2 in pairs(v) do str = str .. k2.. "=" .. v2 .. "," end str = str .. "}," log(str) end log("}") end
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
cirus |
22.9.2017, 4:08
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26746
Пользователь №: 16.971
Возраст: 29
|
Цитата Буду благодарен за тесты и багрепорты Лучше в отдельную тему, чтобы эту не засорять. Если используется getimage, то в findimage указываются координаты 0, 0, ширина, высота. Где ширина и высота это размер изображения полученного getimage. Т. е. при crds={100,100,250,350}, getimage(100,100,250,350) , а findimage не (100,100,250,350), а (0, 0, 151, 251). Код -- Вместо этого: screenshot = getimage(options.crds[1],options.crds[2],options.crds[3],options.crds[4], options.window) -- Это: screenshot, options.crds[3], options.crds[4] = getimage(options.crds[1], options.crds[2], options.crds[3],options.crds[4], options.window) options.crds[1], options.crds[2] = 0, 0
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|