Здравствуйте, гость ( Вход | Регистрация )

11 страниц V < 1 2 3 4 5 > »   
Ответить в эту темуОткрыть новую тему
> Поиск числа с помощью Findimage, Готовый скрипт
Cockney
сообщение 15.4.2017, 15:10
Сообщение #41


********

Master
Сообщений: 1.394
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20893
Пользователь №: 16.156



Кто-то писал когда-то :

Код
Точность = (количество_совпавших_точек)/(sizeX*sizeY - 1)
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 15.4.2017, 19:45
Сообщение #42


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
и вывод: для мелких картинок можно ставить set #accuracy 100, ибо 2-3 пикселя погоды не сделают, скорость поиска от этого не упадет

Область поиска влияет на скорость. Всё остальное не существенно. Если конечно картинка не 200*200 пикселей.
Цитата
Точность = (количество_совпавших_точек)/(sizeX*sizeY - 1)

Если закрасить половину картинки в цвет фона, то придётся указывать точность поиска 50%.
Предположу что так:
Код
Точность = (количество_совпавших_точек)/(sizeX*sizeY - количество_пикселей_фона)

Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dron4938
сообщение 15.4.2017, 20:23
Сообщение #43


****

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)
и соответственно может определить картинку не верно
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 15.4.2017, 20:48
Сообщение #44


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
Вроде как нет.

Если дочитать мой пост до конца, то там написана правильная формула.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dron4938
сообщение 15.4.2017, 21:15
Сообщение #45


****

Apprentice
Сообщений: 256
Регистрация: 20.3.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.395



Цитата(cirus @ 15.4.2017, 21:48) *

Если дочитать мой пост до конца, то там написана правильная формула.

а как эту формулу разобрать? что ставить вместо вопросов?
Точность = (количество_совпавших_точек)/(sizeX*sizeY - количество_пикселей_фона)
50 = (???) / (5x7 - 18)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 15.4.2017, 22:02
Сообщение #46


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Картинка 5*7, 35 пикселей, 17 закрашиваем, значит 18 остаётся.
По идее так:
Код
18 * 100 / (5 * 7 - 17) - 100%, если нашлось 18 из 18 не закрашенных пикселей.
9 * 100 / (5 * 7 - 17) - 50%, если нашлось 9 из 18 не закрашенных пикселей.

Как на самом деле у Кнайта надо узнавать.


Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dron4938
сообщение 15.4.2017, 22:10
Сообщение #47


****

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 байт ) Кол-во скачиваний: 1779
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 15.4.2017, 22:42
Сообщение #48


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
и если ставить точность поиска 50%

А зачем ставить 50?
Цитата
Пилот ищет по 47 пикселям
50% от 47 = 23,5
(50 × (1 / 100) × 47 = 23,5)
т.е. найдя 23 пикселя, пилот скажет, что картинка найдена

Всё правильно.
Про закрашенные пиксели можно вообще забыть. Считайте что их нет. Учитываются только те, что не являются цветом фона.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dron4938
сообщение 15.4.2017, 22:58
Сообщение #49


****

Apprentice
Сообщений: 256
Регистрация: 20.3.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.395



Прогнал через поиск 100 раз картинку 180х280px с разными параметрами и немного удивился.
Оказывается точность вообще на время поиска не влияет.

(IMG:https://i.yapx.ru/H6AP.png)

а вот #deviation (IMG:style_emoticons/default/cool.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 15.4.2017, 23:05
Сообщение #50


********

Master
Сообщений: 1.394
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20893
Пользователь №: 16.156



а где написано было ,что точность влияет на поиск ? Точность вообще ,грубо говоря, производная поиска. И к нему вообще не имеет отношения.

отклонение цвета же имеет прямое отношение к поиску и от него зависит кол-во цветов для сравнения.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 15.4.2017, 23:08
Сообщение #51


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
Оказывается точность вообще на время поиска не влияет.

Точность найденного изображения вычисляется после поиска, а не во время. При любой точности будут проверены все пиксели.

Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dron4938
сообщение 15.4.2017, 23:13
Сообщение #52


****

Apprentice
Сообщений: 256
Регистрация: 20.3.2017
Группа: Пользователи
Наличность: 0
Пользователь №: 18.395



Цитата(cirus @ 16.4.2017, 0:08) *

Точность найденного изображения вычисляется после поиска, а не во время. При любой точности будут проверены все пиксели.

А всё) теперь дошло как оно работает (IMG:style_emoticons/default/smile.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 16.4.2017, 9:33
Сообщение #53


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Цитата
При любой точности будут проверены все пиксели.

насколько я помню - это не так. По крайней мере в сложных случаях с большим deviation приходилось увеличивать минимальную точность, чтобы понять с какой именно точностью находится изображение. Возможно это тонкости deviation.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
WKnight
сообщение 16.4.2017, 9:52
Сообщение #54


********

Разработчик UO Pilot'а
Сообщений: 1.639
Регистрация: 9.1.2006
Группа: Пользователи
Наличность: 0
Пользователь №: 4.688



Точность = (количество_совпавших_точек*100)/(sizeX*sizeY - количество_пикселей_фона)
Цитата
Точность найденного изображения вычисляется после поиска, а не во время. При любой точности будут проверены все пиксели.

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 16.4.2017, 11:04
Сообщение #55


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Ок. Как тогда объяснить, что при больших значениях deviation, здоровых изображениях с большим фоном и малой точности % совападения зависит от выставленного минимального?
т.е. берем некторое изображение и ищем его 2 50 1 20
результат точности: 54%
увеличиваем минимальную точность 2 75 1 20
результат точности: 76%
увеличиваем еще 2 80 1 20
результат точности: не нашло.

Это ситуация встречалась на практике у меня не 1 и не 2 раза. Проявляется она в тяжелых случаях, как правило при поиске изображений обезображенных переливами jpg.

Сообщение отредактировал DarkMaster - 16.4.2017, 11:05


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dron4938
сообщение 22.5.2017, 1:15
Сообщение #56


****

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)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 22.5.2017, 1:55
Сообщение #57


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Без сохранения в файл:
Код
set %a GetImage (0 0 100 100)
set #a FindImage (0 0 100 100 ("C:\pilot\A.bmp") %arr %a [1 1] 1 1 1)  // вместо типа поиска - адрес в памяти
if #a > 0

end_if
set $del DeleteImage  (%a [1 1])  // удалить изображение из памяти

Поиск на картинке из файла:
Код
set %a GetImage (0 0 100 100) // сохранить в памяти часть экранной области
set $bmp SaveImage (%a [1 1] C:\picture.bmp) // сохранить в файл на диск C:\
   // тут возможно нужен wait чтоб картинка успела сохраниться/перезаписаться
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)
if #a > 0

end_if
set $del DeleteImage  (%b [1 1])

Не забываем удалять из памяти сохранённые через GetImage изображения , иначе пилот сожрёт 2гб памяти и будет ошибка.

Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dron4938
сообщение 23.5.2017, 20:18
Сообщение #58


****

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:\


Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 24.5.2017, 2:26
Сообщение #59


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Вопросы не касающиеся поиска числа задавайте в другой теме, лучше новой.
Цитата
Кстати а изменения можно посредством пилота внести в сохраненное изображение?

Пример
Код
set %a getimage (402, 395 442, 438)

set workwindow windowhandle
// закрасить первый пиксель в белый цвет
set #blue %a [1 1]
set #green %a [1 1] + 1
set #red %a [1 1] + 2
writemem 255 #blue b
writemem 255 #green b
writemem 255 #red b

// закрасить второй пиксель в чёрный цвет
set #blue %a [1 1] + 3
set #green %a [1 1] + 4
set #red %a [1 1] + 5
writemem 0 #blue b
writemem 0 #green b
writemem 0 #red b
// сохранить изменённую картинку
set $bmp SaveImage (%a[1 1] C:\qqq.bmp)
end_script

Цитата
наверное будет правильнее, что если такая картинка существует уже, то прибавить +1 к имени файла

Через dir находим сколько картинок уже есть, прибавляем 1.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dron4938
сообщение 24.5.2017, 13:40
Сообщение #60


****

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)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

11 страниц V < 1 2 3 4 5 > » 
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 28.3.2024, 13:18
Designed by Nickostyle