|
|
|
Поиск числа с помощью Findimage, Готовый скрипт |
|
|
cirus |
7.4.2017, 1:25
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 27333
Пользователь №: 16.971
Возраст: 29
|
Цитата set #a Findimage(0 0 %get [1 2] %get [1 3] (%image[#i 1]) %a #v #accuracy -1 #deviation) #accuracy -1 #deviation вместо -1, надо 1 кстати, а зачем -1, так же поиск будет дольше А если надо найти число, например, 33? Будет найдена первая 3 и поиск остановится. Цитата Собственно вопрос: как прописать, чтобы если поиск нашел 2 совпадения, то в итоге 1 число подставлял? Если время будет допишу в выходные. Пока попробуйте скриптом сделать картинку. код
Код // Поиск статичных точек на нескольких картинках
set %path [1] "C:\Users\abc\Desktop" // путь для сохранения готовой картинки set $path "C:\Users\abc\Desktop\22" // путь к анализируемым картинкам init_arr %rgb (1) 255 0 0 // цвет для закрашивания фона в формате RGB set #deviat 5 // погрешность в цвете
// остальное не менять 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 Закидываете в папку несколько картинок одной цифры, например 1, 1a, 1b. Скрипт сравнит картинки. Пиксели, которые присутствуют на всех картинках будут оставлены, остальные закрашены. Подберите погрешность по цвету, чтобы не слишком много было закрашено. Попробуйте искать полученную картинку. Важно:1. Картинки 1, 1a, 1b должны быть одного размера. 2. В скрипте поиска числа Код set #deviation 3 // указывать ту же (или больше) погрешность что и при сравнении картинок 3. Попробуйте уменьшить точность поиска.
|
|
|
|
cirus |
7.4.2017, 2:26
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 27333
Пользователь №: 16.971
Возраст: 29
|
Цитата Собственно вопрос: как прописать, чтобы если поиск нашел 2 совпадения, то в итоге 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:\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 Добавлен поиск и удаление лишних координат, если для поиска цифры используется несколько видов этой цифры. Особо не тестил.
|
|
|
|
dron4938 |
7.4.2017, 16:20
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
Цитата(cirus @ 7.4.2017, 2:26) Попробуй этот: код
Код // Поиск числа с помощью 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 Добавлен поиск и удаление лишних координат, если для поиска цифры используется несколько видов этой цифры. Особо не тестил. Да, то что нужно, вроде работает отлично, буду дальше тестить. С меня пивасик (IMG: style_emoticons/default/rolleyes.gif)
|
|
|
|
dron4938 |
7.4.2017, 21:00
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
скрипт
Код // Поиск числа с помощью FindImage init_arr %GetImage (1) 939, 512 1115, 524 // координаты для поиска, StartX StartY EndX EndY
set linedelay 0 init_arr %picture 0a 0b 0c 1a 1b 2a 2b 2c 2d 2e 3a 3b 4a 4b 4c 5a 5b 5c 6a 6b 7a 7b 7c 8a 8b 8c 9a 9b 9c 9d 9e // имена картинок (0.bmp, 1.bmp и т. д.) init_arr %symbol 0 0 0 1 1 2 2 2 2 2 3 3 4 4 4 5 5 5 6 6 7 7 7 8 8 8 9 9 9 9 9 // символ соответствующий имени, т. е. картинка 0.bmp соответствует 0 set $path "C:\Users\Andrey\Desktop\Pil\ica\a" // папка с картинками set $bmp "*.bmp*" // формат картинок set #deltaY 8 // расстояние между строками (можно указать высоту картинок) set #deltaspace 12 // допустимое расстояние между цифрами, иначе будет считаться что это не одно число set #accuracy 94 // точность поиска для Findimage set #deviation 22 // погрешность оттенка для Findimage set #wait 0 // пауза между поиском картинок, если указать меньше искать будет быстрее, но нагрузит процессор set #timeproc 500 // время (в мсек) для поиска картинок, если 0 не выйдет из процедуры пока не найдётся хотя бы 1 картинка set #repeatimage 2 // допустимое смещение координат, если используется несколько видов одной картинки
dir (%path $path $bmp) set delimiter ' '
while 1 = 1 :aaa ////////// ПОИСК 1 set $path "C:\Users\Andrey\Desktop\Pil\ica\a" dir (%path $path $bmp) set size(%result) // уничтожить массив с предыдущими результатами call test %picture %symbol %GetImage %path #deltaY #deltaspace #accuracy #deviation #wait #timeproc #repeatimage if size(%result) > 0 // если размер массива больше 0 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 else set $str 00 end_if
:bbb ///////// ПОИСК 2 set $path "C:\Users\Andrey\Desktop\Pil\ica\b" dir (%path $path $bmp) set size(%result) call test %picture %symbol %GetImage %path #deltaY #deltaspace #accuracy #deviation #wait #timeproc #repeatimage if size(%result) > 0 // если размер массива больше 0 set $str2 set %z [1] \n for #i 1 size(%result) set $str2 $str2%result[#i] if #i != size(%result) set $str2 $str2%z [1] end_if end_for else set $str2 00 end_if
:ccc ///////// ПОИСК 3 set $path "C:\Users\Andrey\Desktop\Pil\ica\c" dir (%path $path $bmp) set size(%result) call test %picture %symbol %GetImage %path #deltaY #deltaspace #accuracy #deviation #wait #timeproc #repeatimage if size(%result) > 0 // если размер массива больше 0 set $str3 set %z [1] \n for #i 1 size(%result) set $str3 $str3%result[#i] if #i != size(%result) set $str3 $str3%z [1] end_if end_for hint (14 clBlue 409, 265 ($str $str2 $str3)) // РЕЗУЛЬТАТ 3 ПОИСКОВ = 3 ЧИСЛА else set $str3 00 hint (14 clBlue 409, 265 ($str $str2 $str3)) // РЕЗУЛЬТАТ 3 ПОИСКОВ = 3 ЧИСЛА 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
//////////////////////////////////////////////////
Сделал 3 последовательных поиска. Работает, но долго ищет, примерно за 3 секунды находятся все 3 числа, можно ускорить немного?))) hint (14 clBlue 409, 265 ($str $str2 $str3)) // РЕЗУЛЬТАТ 3 ПОИСКОВ = 3 ЧИСЛА set #timeproc 500 выставил 180 по логу через таймер все 3 числа находит за 1400мс, все равно долговато(
|
|
|
|
dron4938 |
7.4.2017, 21:23
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
Цитата(cirus @ 7.4.2017, 22:18) Уменьшить, это слишком много.
Если уменьшить, то бывает не находит числа( Я игрался с разными значениями set #accuracy 94 set #deviation 22 такое вышло оптимальным.если уменьшать и то и то, то другие цифры бывает находит Слежение за ходом- это что?
|
|
|
|
FREEON |
9.4.2017, 10:57
|
Journeyman
Сообщений: 365
Регистрация: 14.2.2017 Группа: Пользователи Наличность: 1060
Пользователь №: 18.346
Возраст: 25
|
Цитата(cirus @ 7.4.2017, 1:25) код
Код // Поиск статичных точек на нескольких картинках
set %path [1] "C:\Users\abc\Desktop" // путь для сохранения готовой картинки set $path "C:\Users\abc\Desktop\22" // путь к анализируемым картинкам init_arr %rgb (1) 255 0 0 // цвет для закрашивания фона в формате RGB set #deviat 5 // погрешность в цвете
// остальное не менять 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 Закидываете в папку несколько картинок одной цифры, например 1, 1a, 1b. Скрипт сравнит картинки. Пиксели, которые присутствуют на всех картинках будут оставлены, остальные закрашены. Подберите погрешность по цвету, чтобы не слишком много было закрашено. Попробуйте искать полученную картинку. Важно:1. Картинки 1, 1a, 1b должны быть одного размера. 2. В скрипте поиска числа Код set #deviation 3 // указывать ту же (или больше) погрешность что и при сравнении картинок 3. Попробуйте уменьшить точность поиска. А есть скрипт для закраски фона? Что бы в ручную не красить а то мне нуно в ручную 600 картинок перекрашивать. Желательно, что бы моно было задавать несколько цветов фона (2-4 ЦВЕТА)
|
|
|
|
FREEON |
9.4.2017, 14:00
|
Journeyman
Сообщений: 365
Регистрация: 14.2.2017 Группа: Пользователи Наличность: 1060
Пользователь №: 18.346
Возраст: 25
|
Цитата(cirus @ 9.4.2017, 12:02) код
Код // Закрашивание фона set %path [1] "C:\Users\abc\Desktop\567" // путь для сохранения картинок, сохранятся с теми же именами что и были set $path "C:\Users\abc\Desktop\22" // путь к анализируемым картинкам init_arr %rgb (1) 255 0 0 // цвет для закрашивания фона в формате RGB
// цвета фона в формате RGB, указывать можно любое количество init_arr %fon (1) 10 25 31 init_arr %fon (2) 26 37 34 //init_arr %fon (3) 45 52 37 //init_arr %fon (4)
set #deviat 5 // погрешность в цвете // остальное менять не нужно dir(%picture $path *.bmp*) for #i 1 size(%picture) set %a [#i] Loadimage (%picture [#i 1]) end_for
set linedelay 0 set workwindow windowhandle
set #delta %a [1 4] - (%a [1 4] - %a [1 2] * 3 + 1) for #k 1 size(%a) set #r %rgb [1 1] set #g %rgb [1 2] set #b %rgb [1 3] writemem #b %a [#k 1] b writemem #g eval(%a [#k 1] + 1) b writemem #r eval(%a [#k 1] + 2) b for #j 0 eval(%a [1 3] - 1) for #i 0 #delta 3 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
for #l 1 size(%fon) if #rmin <= %fon [#l 1] and #rmax >= %fon [#l 1] and #gmin <= %fon [#l 2] and #gmax >= %fon [#l 2] and #bmin <= %fon [#l 3] and #bmax >= %fon [#l 3] set #rpaint %rgb [1 1] set #gpaint %rgb [1 2] set #bpaint %rgb [1 3] writemem #rpaint #z5 b writemem #gpaint #z4 b writemem #bpaint #z3 b break end_if end_for end_for end_for set $bmp SaveImage (%a [#k 1] %path [1]\%picture [#k 3].bmp) end_for
hint (20 clRed 500 500 (Картинки сохранены)) wait 1000 hint (10 clblack 1920 1 (1)) 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 Накидал, пробуйте что получилось. Подправил немного. Благодарю, работает. Но есть маленький нюанс - Скрипт закрашивает по размеру пикселей первого изображения. Поэтому, что бы закрашивало всё изображения первое должно быть больше размером чем все остальные, либо все должны быть равными.
|
|
|
|
FREEON |
9.4.2017, 22:07
|
Journeyman
Сообщений: 365
Регистрация: 14.2.2017 Группа: Пользователи Наличность: 1060
Пользователь №: 18.346
Возраст: 25
|
Цитата(cirus @ 9.4.2017, 14:24) Исправил. Теперь можно указывать цвет фона в десятичном формате.
Извиняюсь может я не так пользуюсь. Но разницы не вижу. Цвет в десятичном коде у меня не задается и размер обработки изображения прежний (IMG: style_emoticons/default/sad.gif) Цитата(FREEON @ 9.4.2017, 22:05) Извиняюсь может я не так пользуюсь. Но разницы не вижу. Цвет в десятичном коде у меня не задается и размер обработки изображения прежний (IMG: style_emoticons/default/sad.gif) ой сори я рачело, случайно код из своего спойлера вставил (IMG: style_emoticons/default/laugh.gif)
|
|
|
|
dron4938 |
15.4.2017, 13:59
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
Можете чуть пояснить как set #accuracy работает. Пример 1. картинка 10х10- содержит 100 пикселей set #accuracy 100 set #deviation 0 (IMG: https://i.yapx.ru/H5J9.png) если #accuracy 100 , то в этой картинке должны совпасть все 100 пикселей. если #accuracy 89, то в этой картинке должны совпасть любых 89 пикселей. Правильно я понимаю? Пример 2. картинка 9х10 - содержит 90 пикселей (IMG: https://i.yapx.ru/H5LK.png) если #accuracy 100 , то в этой картинке должны совпасть все 90 пикселей. если #accuracy 89, то в этой картинке должны совпасть 89% от 90 = 89 х (1 / 100) Ч 90 = 80,1 пикселей. Пример 3. картинка 5х7 - содержит 35 пикселей (IMG: https://i.yapx.ru/H5LR.png) если #accuracy 100 , то в этой картинке должны совпасть все 35 пикселей. если #accuracy 89, то в этой картинке должны совпасть 89% от 35 = 89 х (1 / 100) Ч 35 = 31,15 пикселей. Правильно я понимаю? Или немного не так? Далее в картинке есть фон, который пилот вырезает и не учитывает. (IMG: https://i.yapx.ru/H5Le.png) минусуем 6 пикселей фона 35-6= 29 в итоге если #accuracy 89, то в этой картинке должны совпасть 89% от 29 = 89 Ч (1 / 100) Ч 29 = 25,81 округлим = 26 пикселей Чтобы картинка нашлась в ней должно совпасть 26 пикселей из 29 и вывод: для мелких картинок можно ставить set #accuracy 100, ибо 2-3 пикселя погоды не сделают, скорость поиска от этого не упадет ------------------------------------------------------------------------------------ #accuracy 89 (IMG: https://i.yapx.ru/H5QR.png) 26 пикселей из 29 - картинка найдена ------------------------------------------------ #accuracy 89 (IMG: https://i.yapx.ru/H5QZ.png) 26 пикселей из 29 - картинка найдена в данном случае пилот проходит по в 28 пикселям в картинке, а это тоже самое, что #accuracy 97-99 ------------------------------------------------ #accuracy 89 (IMG: https://i.yapx.ru/H5Qn.png) 26 пикселей из 29 - картинка НЕ найдена (найдено всего 25 пикселей) в данном случае пилот проходит по всем 29 пикселям в картинке, а это тоже самое, что #accuracy 100
|
|
|
|
|
|
10 чел. читают эту тему (гостей: 10, скрытых пользователей: 0)
Пользователей: 0
|
|