|
Screen Scanner, аналог findcolor и findimage |
|
|
avgur |
13.6.2011, 16:02
|
  
Novice
Сообщений: 94
Регистрация: 15.8.2010 Группа: Пользователи Наличность: 0
Пользователь №: 12.926
Возраст: 25

|
Спасибо за труд, теперь у меня относительные координаты точно совпадают с пилотовскими. Программа очень нравится и поражает скоростью работы и точностью определения цветов, про файндколор теперь и не вспомню (IMG: style_emoticons/default/smile.gif) Вот еще вопрос по поводу: " - можно изменять порядок проверки пикселей по осям X и Y (указывая -dx или -dy меньше нуля);" В прямоугольнике в котором я ищу цвет, чаще всего поиск будет заканчиваться быстрее, если поиск будет проходить сначало по оси Y, а потом по Х. Мне не понятно что указывать меньше нуля, а что больше в моем примере: Код exec cscan.exe -x1=360 -y1=2 -x2=557 -y2=57 -dx=1 -dy=1 -hw= #handleWin -c=(3832214) -f=( E:\arr1test.txt )
|
|
|
|
Denker |
15.8.2011, 15:37
|
 
Neophyte
Сообщений: 46
Регистрация: 28.10.2010 Группа: Пользователи Наличность: 0
Пользователь №: 13.148
Возраст: 30

|
Здравствуйте. Очень нравится ваша прога, пользуюсь как альтернтива findcolor -- работает значительно быстрее, что для меня очень важно. В коде пользуюсь вашей процедурой для неё: код процедуры
Код :cscan set $a findcolor (0, 0 1, 1 1 1 88888888 %stone 2) exec e:\resurs\cscan $cscanparam -file= (e:\resurs\stone.txt) :waiting2 wait 200 load_array %stone e:\resurs\stone.txt set #wcscan size (%stone) if #wcscan < 2 goto waiting2 end_if set $a %stone [#wcscan 1] if ($a <> endcscan) goto waiting2 end_if set #dcscan #wcscan - 1 set #zcscan %krets [#dcscan 3] set #a 0 if #zcscan <> -1000 if #zcscan = -2000 set #a %krets [1 1] else set #a #dcscan end_if end_if set $a #a return
Поскольку полностью в её работе так и не разобрался, пользуюсь "как есть". Не периодически выдаёт ошибку в строке Код load_array %stone e:\resurs\stone.txt
но это в последних версиях пилота поправили, зато теперь скрипт намертво зацикливается на строках Код :waiting2 wait 200 load_array %stone e:\resurs\stone.txt set #wcscan size (%stone) if #wcscan < 2 goto waiting2 end_if
На версиях пилота 2.18.8 и 2.19 всё работает правильно, а в версиях 2.20 и 2.21 зацикливается. Это особенность скрипта или в баг пилота? Если проблемма в скрипте, то как это можно решить? В крайнем случаю придётся переделывать под findcolor, благо его значительно улучшили.
|
|
|
|
Denker |
15.8.2011, 19:52
|
 
Neophyte
Сообщений: 46
Регистрация: 28.10.2010 Группа: Пользователи Наличность: 0
Пользователь №: 13.148
Возраст: 30

|
Спасибо. Задержку увеличивал вплоть до 500, но тут уже скорости скрипта не хватало. К моменту, когда надо кликнуть в найденой точке, эта точка уже уползала. А ошибку выдаёт если долгое время, больше минуты, не находит заданый цвет или изначально файла нет и не находит цвет. Причём, как я уже писал, ошибка возникает не периодически. Проверку на количество циклов и сам могу. Хоть через обычный счётчик с условием на goto, хоть через timer. Буду пробовать переделать на findcolor. Можно подробнее объяснить принцип работы приведённого куска? Код :waiting2 wait 200 load_array %stone e:\resurs\stone.txt // это массиву присваиваем содержимое файла set #wcscan size (%stone) // определяем размерность массива, что равно количество строк в файле if #wcscan < 2 // проверка. но если #wcscan < 2, то где и как изменяется файл, чтобы #wcscan стало >= 2? goto waiting2 // учитывая, что мы зацикливаем этот кусок end_if
|
|
|
|
Denker |
16.8.2011, 8:48
|
 
Neophyte
Сообщений: 46
Регистрация: 28.10.2010 Группа: Пользователи Наличность: 0
Пользователь №: 13.148
Возраст: 30

|
Цитата(Zeleax @ 15.8.2011, 20:19)  когда screenscanner завершает работу , то в файле должно получится не менее двух строк (последняя = endcscan). В этом куске и проверяется: если число строк меньше двух, значит поиск еще не завершен.
В том-то и дело, что не зависимо от результата поиска, в файле всегда 2 строки, Цитата(Zeleax @ 15.8.2011, 20:19)  Системная ошибка в строке load_array %stone e:\resurs\stone.txt происходила ранее из-за того, что совпадал момент времени когда cscan пишет в файл, и в этот же момент времени пилот пытался прочитать информацию.
После выхода новых вресий пилота (>=2.20) пилот не выдает сообщение об ошибке чтения, а просто работает далее, возвращая массив длиной 0 (вроде бы). Потому и происходит зацикливание.
а значит, даже если массив длиной 0, т.е. файл ещё занат системой, то при повторной проверке, когда файл уже освободится, условие должно выполниться. Upd: проверка показала, что всегда #wcscan = 0. Поставил вместо проверки "set #wcscan 2", выдаёт ошибку на строке "set $a %krets [#wcscan 1]". Скорее всего, причина тут "load_array %stone e:\resurs\stone.txt"
|
|
|
|
Zeleax |
3.1.2012, 8:25
|
        
ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010 Группа: Пользователи Наличность: 0 Из: Киев
Пользователь №: 13.093

|
Цитата Ищу на экране небольшие изображения - типа 20-21, 20-22, 20-23.. фон не однотонный но правда не переливается и не меняется, но все равно находит через раз, пробовал в шопе избавится от фона, но тогда еще реже находит (( и как допустим привязать и заменить set $d FindImage (616 387 653 405 (D:\l22-23.bmp) %arr 2 80 1 ) if $d > 0 ... ... ... на cscan? команда пилота findimage почти полностью заменяет собой cscan, поэтому проще и лучше использовать её. Качество работы этих команд сравнить сложно, поскольку используются разные алгоритмы и средства. Кроме того, для использования cscan нужно иметь установленную на компьютере библиотеку Net Framework 3.5 (см. 1-й пост темы) Если всё же хотите использовать cscan - нужно взять процедуру из первого поста этой темы и поместить её в конец вашего скрипта. Кроме того, исправить внутри процедуры строку exec g:\cscan $cscanparam -file= (g:\1.txt) указать путь к временному файлу - где он должен у вас размещаться на компе. Потом для поиска изображения в своём скрипте просто пишите где нужно: Код set $cscanparam 616 387 653 405 -hw= #workwindow -img=( D:\l22-23.bmp ) gosub cscan if #a > 0 msg Изображение найдено в координатах %arr [1 1] %arr [1 2] else msg Изображение не найдено end_if
Понятно, что в #workwindow нужно записать хендл рабочего окна (где искать). Если нужно искать без привязки к окну - просто не пишите этот параметр (-hw= #workwindow) А вообще, создайте новую тему в соответствующем разделе, выложите туда картинки игры (сделанные в формате PNG). Можно закрасить имя перса и что еще нужно спрятать. Тогда будет о чём говорить
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|