Author Topic: Сохранять не весь скриншот а область поиска-анализа  (Read 17529 times)

0 Members and 1 Guest are viewing this topic.

LipsInc

  • Освоившийся
  • **
  • Posts: 21
    • View Profile
Столкнулся с ситуацией, когда в процессе действия область которая визуально не меняется на самом деле имеет разные значения количества пикселов искомого цвета.
Хотелось бы для анализа иметь воззможность сохранять не весь скриншот а только ту его часть, которая анализируется, например для
$count = PXLCOUNT (1088,232,1491,486, 2368548)
сохранять только область 1088,232,1491,486

и так далее

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Тебе надо использовать цветокоррекцию чтоб привести множественные оттенки к единому.

LipsInc

  • Освоившийся
  • **
  • Posts: 21
    • View Profile
вопрос не в цветокорекции, меняются не цвета а число пикселов одного цвета
конкретный пример - есть полоска здоровья,  вырезал ее верхнюю часть по всей длине, определил наиболее часто встречающийся пиксель, сосчитал его количество при полном здоровье
далее планировался анализ здоровья  по числу этих пикселов, но, как оказалось, при полном здоровье число пикселов в первом раунде всегда 70, а в последующих 100,  ходы делаются достаточно быстро, примерно 10 раз в секунду
но у меня нет полной  уверенности что это именно так, ибо обновление полоски здоровья происходит спустя некоторое время после хода, и есть шанс, что я анализирую еще не обновленную полоску, а увеличивать задержку между ходами нежелательно
да, можно сохранять скрины каждые 50 мсек, но скрины всего экрана имеют значительный вес, в отличии от веса полоски 100 х 7 пикселов, да и анализировать полный скрин не так удобно
в общем, думаю, функция была бы полезна, да и реализовать ее, как мне думается, не так уж сложно

заодно неплохо бы добавить функцию анализа картинок а не только областей экрана

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

« Last Edit: January 03, 2014, 05:11:55 PM by LipsInc »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Какая у тебя версия кликера?

GETSCREEN можно вызывать и совсем без задержек, это приводит к увеличенной нагрузки на процессор.

LipsInc

  • Освоившийся
  • **
  • Posts: 21
    • View Profile
4.5, и кстати, она работает быстрее чем 4.8 - возможно я не изучил доки, возможно, есть нюансы, но меня 4.5 вполне устраивает

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

проблема в том, что изменение картинки здоровья после нанесения удара происходит с некоторой задержкой,  которая может быть от десятков миллисекунд до секунды и более (при лагах)
я наношу удар, через некоторое время делаю скриншот, чтобы проанализировать число оставшегося здоровья после нанесения удара и принять решение о нанесении или не нанесении следующего, но из за задержек сервера я могу заскринить картинку не изменившуюся, соответственно, принять ошибочное решение

увеличивать задержку с сотни миллисекунд до единиц секунд, чтобы перекрыть все возможные лаги я не хочу, хочу сделать серию скринов для анализа, чтобы узнать наиболее ожидаемый диапазон задержек сервера, для этого мне и нужна возможность сохранять не весь скриншот а только область анализа, ибо:

а) полный скриншот много весит
б) анализировать область на полном скриншоте неудобно из за несоответствия координат в игре и в редакторе, а также из за возможных искажений - я играю на виртуалках, а анализировать скорее всего буду на основной оси - а там возможно иксажения из за разности осей, настроек шрифтов и прочей лабуды


« Last Edit: January 03, 2014, 04:28:23 PM by LipsInc »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Есть функция PXLXOR складывающая пикселы, в зоне, в некое контрольное число, что можно использовать для анализа, изменилась ли картинка или нет.
Но она неидеальна, так как неучитывает положение пикселов.
По моему с 4.6 версии введена более надежная PXLCRC.

Code: (clickermann) [Select]
GETSCREEN
$count = PXLCRC (10,20, 100, 40) // получаем хеш сумму области
logwrite("Hash: ", $count)

По моему это то что тебе нужно.

LipsInc

  • Освоившийся
  • **
  • Posts: 21
    • View Profile
хм
еще раз
есть полоска здоровья, при полном здоровье она полностью красно коричневого цвета, расцветка ее равномерная и не меняется в процессе боя, меняется лишь процент заполнения, при нанесении урона часть полоски становится белой у трупа она полностью белая
в ней есть доминирующие пикселы с цветом (условно) 123
когда полоска здоровья полная, этих пикселов (условно) 100 штук
если здоровье неполное, пикселов меньше, причем поскольку расцветка полоски не меняется, логично предположить, что при половине здоровья пикселов будет вдвое меньше,  но эксперименты показали что это не так
с функцией PXLXOR я прекрасно знаком и ее часто использую, но в данном случае используется функция  подсчета пикселов одного цвета в заданной области PXLCOUNT
у меня нет задачи определять изменилась ли картинка (после нанесения удара здоровье может не измениться из за промаха или попадания в блок) , но есть задача определять насколько она изменилась, а также выяснить, прямопропорционально ли число пикселей длине полоски / количеству здоровья, кроме того, есть интересный нюанс - при полном здоровье в первом раунде число пикселей в полоске меньше (примерно на 15%) чем при полном же здоровье во втором и последующих раундах
вот для этого мне и нужен анализ сохраненных скриншотов, и лучше не скриншотов по GETSCREEN а скриншотов области анализа
« Last Edit: January 03, 2014, 06:06:15 PM by LipsInc »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Тогда может тебе лучше анализировать белую полоску!

LipsInc

  • Освоившийся
  • **
  • Posts: 21
    • View Profile
угу, пока писал предыдущий пост, эта мысль тоже мне пришла в голову )
но остается проблема с необновлением полоски из за задержек, поэтому анализ скриншотов был бы нелишним
« Last Edit: January 03, 2014, 08:56:51 PM by LipsInc »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Какая то надуманная проблема. Используй любую программу скриншотер. Я использую просмотрщик xnviеw. Можно задать область и снимать горячей клавишей.
Но на самом деле подход не правильный. Как это поможет учесть задержку? Ну высчитаешь среднюю, наступит выходной и нагрузка на сервера возрастет... Может ещё какой элемент меняется и его можно учитывать?
С подобными полосками обычно не всё сложно и достаточно проверять определенные пикселы, например соответствующие 50% или 30%. Не нужно было ни разу знать точное значение. И да, чаще удобней анализировать фон, а не саму полоску. Она часто с плавным изменением цвета. Хорошо если ещё цвет фиксирован в пространстве, а то ещё ползет вместе со значением.


LipsInc

  • Освоившийся
  • **
  • Posts: 21
    • View Profile
Quote
Я использую просмотрщик xnviеw. Можно задать область и снимать горячей клавишей.
ух ты, круто, не знал про такие
она умеет сохранять скриншоты в области х1,у1, х2,у2  с перидичностью 50 мсек?
по крайней мере, я не нашел где можно задавать область захвата

Quote
Но на самом деле подход не правильный. Как это поможет учесть задержку? Ну высчитаешь среднюю, наступит выходной и нагрузка на сервера возрастет... Может ещё какой элемент меняется и его можно учитывать?
на самом деле не все так плохо, задержка как правило стабильная, равна десяткам или сотням миллисекунд, но желательно определиться, делать  ее 100 мсек или 500
хотя конечно, согласен что лагнуть может в любой момент, но другого способа определения я пока не вижу, а точнее его просто нет, если, конечно, не использовать чистое програмирование
Quote
Не нужно было ни разу знать точное значение
точное значение мне и  не нужно, точность условная, плюс минус 15%
к примеру, при полном здоровье число пикселей с цветом  10197915  в этой полоске 80, но беда в том, что почему то в первом раунде это число не 80 а 65, хотя полоска точно такая же визуально, и вообще непонятно, прямопропорциональна ли зависимость числа пикселов от заполненности полоски/числа хп

вот эта полоска
цифры здоровья могут быть разные, в зависимости от типа бота-персонажа
цифры нельзя выделить и скопировать, это графика
а также  та часть, которую я пытался анализировать, цвет 10197915
« Last Edit: January 04, 2014, 04:02:59 PM by LipsInc »

Крис Тинка

  • Активный участник
  • ***
  • Posts: 171
    • View Profile
Столкнулась с такой ситуацией. Необходимо сделать 170 скриншотов через кликерманн, потом в сторонней программе распознать текст, но не на всем снимке, а в определенной области. Вот тут как раз бы и пригодился
Code: (clickermann) [Select]
SCREENSHOT($x1, $y1, $x2, $y2)

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Это у тебя скрипт такой или ты просто используешь кликерманн как скриншот-программу?

Крис Тинка

  • Активный участник
  • ***
  • Posts: 171
    • View Profile
Небольшой скрипт, который перелистывает в окне страницы и делает снимки. В принципе объединив "Clickermann" и "Gadwin PrintScreen" задачу выполнила

LipsInc

  • Освоившийся
  • **
  • Posts: 21
    • View Profile
Вот тут как раз бы и пригодился
Code: (clickermann) [Select]
SCREENSHOT($x1, $y1, $x2, $y2)
да, именно такой оператор и нужен