Author Topic: Поиск изменяющейся картинки  (Read 2704 times)

0 Members and 1 Guest are viewing this topic.

Gluecat21

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Поиск изменяющейся картинки
« on: January 25, 2020, 05:29:29 PM »
Прошу помочь ответом. Автоматизирую одну игру. Суть заключается в том, чтобы кликать по одной кнопке до тех пор пока не найдешь золотой камень ( как указано на скрине). Вероятность встретить его крайне мала ( около 0.05%) поэтому скипать без автомата приходится долго.
 
Непосредственно к скрипту, пробовал поиск по картинке и пришел к нулевым результатам, потому что при обновлении страницы такая же картинка не хочет находиться, не знаю почему, она не должна была меняться ведь, причем так получается и с colormode и без. Пробовал условие внутри условия. Тоже не помогло.
 Сейчас пробую найти такой золотой камень по уникальным пикселям, но из за того что игра достаточно красочная  скрипт постоянно останавливается. Есть идеи как можно решить такую задачку?

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Поиск изменяющейся картинки
« Reply #1 on: January 25, 2020, 06:39:16 PM »


+ UniqueColorsSearch
С помощью всего этого можно найти почти что угодно.
« Last Edit: January 26, 2020, 12:14:06 AM by Hito »
Я не ду... Потому и не бу...

Bitya

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Поиск изменяющейся картинки
« Reply #2 on: February 04, 2020, 06:49:11 PM »
2 Gluecat21
По картинке не находит вероятней всего потому, что либо сам камень немного меняет форму, либо меняется его фон. В любом случае - 100%-ого совпадения не получаем.
Кодом не помогу, но могу подсказать примерный алгоритм:
1) Скриним требуемый камень через colormod с нужной цветокоррекцией(тут только на практике подбирать), сохраняем скрин
2) Далее работаем уже со скрином. Через лупу выбираем цвет пикселей и их количество, которые одновременно:
а). Наиболее точно и полно характеризуют данный камень
б). Как можно меньше коррелируют(совпадают\попадаются) со всей остальной картинкой, дабы избежать ложных обнаружений
3). Таким образом мы получаем "цветовую характеристику" этого камня - например 150 желтых пикселей, 73 зелёных и 230 красных.
4). Всё что выше - подготовка и просто сбор данных, далее уже код в итоговом скрипте
5). Во время игры сканируем экран на наличие тех самых ранее отобранных цветных пикселей
6). В случае нахождения требуемых цветов расчитываем область, относительно найденного пикселя, скажем 100*100 пикселей(по размеру того самого нужного камня)
7). В этой области, 100*100, посчитываем количество наших характеризующих цветных пикселей. Далее варианты:
а). Если количество пикселей совпадает с тем что мы заранее насчитали в шаге 2), не точно конечно, а скажем +-10% - 144 желтых, 77 зелёных и 217 красных, то с больной доле вероятности можно сказать, что в нашей области 100*100 реально находится нужный камень, кликаем по нему и т.д.
б). Если количество пикселей не совпадает, то мы просто попали на пиксели такого же цвета, относящиеся к другим элементам картинки. Ничего не делаем, продолжаем поиск\другие_действия и т.д.

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

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Поиск изменяющейся картинки
« Reply #3 on: February 04, 2020, 10:57:45 PM »
Помимо способа Bitya, поделюсь одним немного муторным (муторный для тех, кто все изменяющиеся картинки для заготовок будет отлавливать вручную), но быстро работающим способом. Предположим, что у нас есть некая картинка камня, которая изменяется. Все изменяющиеся картинки, как правило, имеют свой диапазон изменений. То бишь - в игре есть 5-7-10 заготовленных картинок, похожих друг на друга в общем, но разных в мелочах. И эти картинки быстро подменяют друг друга, создавая видимость (например) сияния какого-нибудь объекта, при этом сохраняя визуальность этого объекта так, чтобы можно было различить, что это именно он. Так вот... Если это к примеру какой-нибудь камень, то создаем в проекте скрипта (в директории скринов) папку - "камень". Далее пишем скрипт:
Code: (clickermann) [Select]
GETSCREEN($x1,$y1, $x2,$y2) // Скриним координаты камня
COLORMODE(6, $x1,$y1, $x2,$y2) // Если нужно, "колормодим".
$count = PXLCRC ($x1,$y1, $x2,$y2)  // Подсчитываем контрольную сумму пикслей
if (FExists(STRCONCAT("screens\камень\",$count,".bmp"))) // Проверяем - есть ли у нас уже такой вариант камня в скринах
else // И если такого варианта у нас нет, то...
   SCREENSHOTFIX($x1,$y1, $x2,$y2, STRCONCAT("screens\камень\",$count,".bmp")) // Сохроняем скрин камня с контрольной суммой пикслей в названии картинки.
end_if
Этим скриптом отлавливаем все варианты этого камня, а потом ищем его практически тем же скриптом:
Code: (clickermann) [Select]
GETSCREEN($x1,$y1, $x2,$y2) // Скриним координаты камня
COLORMODE(6, $x1,$y1, $x2,$y2) // Если нужно, "колормодим".
$count = PXLCRC ($x1,$y1, $x2,$y2)  // Подсчитываем контрольную сумму пикслей
if (FExists(STRCONCAT("screens\камень\",$count,".bmp"))) // Проверяем - есть ли у нас в папке "камни" скрин с такой контрольной суммой в названии.
   // Ну и как бы, если есть, то камень найден.
end_if
Скрины камней мы в приципе делаем для себя, чтобы визуально понимать - какой скрин потом в какую папку пихать. Просто чаще искать приходится не один камень и папок с камнями может быть не мало. Нам важны не скрины, а их названия.
Я не ду... Потому и не бу...

Shada

  • Освоившийся
  • **
  • Posts: 24
    • View Profile
Re: Поиск изменяющейся картинки
« Reply #4 on: February 05, 2020, 02:59:46 PM »
Ещё вариант обучаемого скрипта.
http://crapware.aidf.org/forum/index.php?topic=4249.msg28951#msg28951

Gluecat21

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Re: Поиск изменяющейся картинки
« Reply #5 on: February 18, 2020, 09:08:54 PM »
Помимо способа Bitya, поделюсь одним немного муторным (муторный для тех, кто все изменяющиеся картинки для заготовок будет отлавливать вручную), но быстро работающим способом. Предположим, что у нас есть некая картинка камня, которая изменяется. Все изменяющиеся картинки, как правило, имеют свой диапазон изменений. То бишь - в игре есть 5-7-10 заготовленных картинок, похожих друг на друга в общем, но разных в мелочах. И эти картинки быстро подменяют друг друга, создавая видимость (например) сияния какого-нибудь объекта, при этом сохраняя визуальность этого объекта так, чтобы можно было различить, что это именно он. Так вот... Если это к примеру какой-нибудь камень, то создаем в проекте скрипта (в директории скринов) папку - "камень". Далее пишем скрипт:
Code: (clickermann) [Select]
GETSCREEN($x1,$y1, $x2,$y2) // Скриним координаты камня
COLORMODE(6, $x1,$y1, $x2,$y2) // Если нужно, "колормодим".
$count = PXLCRC ($x1,$y1, $x2,$y2)  // Подсчитываем контрольную сумму пикслей
if (FExists(STRCONCAT("screens\камень\",$count,".bmp"))) // Проверяем - есть ли у нас уже такой вариант камня в скринах
else // И если такого варианта у нас нет, то...
   SCREENSHOTFIX($x1,$y1, $x2,$y2, STRCONCAT("screens\камень\",$count,".bmp")) // Сохроняем скрин камня с контрольной суммой пикслей в названии картинки.
end_if
Этим скриптом отлавливаем все варианты этого камня, а потом ищем его практически тем же скриптом:
Code: (clickermann) [Select]
GETSCREEN($x1,$y1, $x2,$y2) // Скриним координаты камня
COLORMODE(6, $x1,$y1, $x2,$y2) // Если нужно, "колормодим".
$count = PXLCRC ($x1,$y1, $x2,$y2)  // Подсчитываем контрольную сумму пикслей
if (FExists(STRCONCAT("screens\камень\",$count,".bmp"))) // Проверяем - есть ли у нас в папке "камни" скрин с такой контрольной суммой в названии.
   // Ну и как бы, если есть, то камень найден.
end_if
Скрины камней мы в приципе делаем для себя, чтобы визуально понимать - какой скрин потом в какую папку пихать. Просто чаще искать приходится не один камень и папок с камнями может быть не мало. Нам важны не скрины, а их названия.


А что делать, если координаты камня предварительно не определены. Придется работать целым экраном, но пошагово приходить к координатам камня не получится, потому что все остальные цвета предметов на экране так же могут быть динамическими.

Gluecat21

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Re: Поиск изменяющейся картинки
« Reply #6 on: February 18, 2020, 09:38:28 PM »
2 Gluecat21
По картинке не находит вероятней всего потому, что либо сам камень немного меняет форму, либо меняется его фон. В любом случае - 100%-ого совпадения не получаем.
Кодом не помогу, но могу подсказать примерный алгоритм:
1) Скриним требуемый камень через colormod с нужной цветокоррекцией(тут только на практике подбирать), сохраняем скрин
2) Далее работаем уже со скрином. Через лупу выбираем цвет пикселей и их количество, которые одновременно:
а). Наиболее точно и полно характеризуют данный камень
б). Как можно меньше коррелируют(совпадают\попадаются) со всей остальной картинкой, дабы избежать ложных обнаружений
3). Таким образом мы получаем "цветовую характеристику" этого камня - например 150 желтых пикселей, 73 зелёных и 230 красных.
4). Всё что выше - подготовка и просто сбор данных, далее уже код в итоговом скрипте
5). Во время игры сканируем экран на наличие тех самых ранее отобранных цветных пикселей
6). В случае нахождения требуемых цветов расчитываем область, относительно найденного пикселя, скажем 100*100 пикселей(по размеру того самого нужного камня)
7). В этой области, 100*100, посчитываем количество наших характеризующих цветных пикселей. Далее варианты:
а). Если количество пикселей совпадает с тем что мы заранее насчитали в шаге 2), не точно конечно, а скажем +-10% - 144 желтых, 77 зелёных и 217 красных, то с больной доле вероятности можно сказать, что в нашей области 100*100 реально находится нужный камень, кликаем по нему и т.д.
б). Если количество пикселей не совпадает, то мы просто попали на пиксели такого же цвета, относящиеся к другим элементам картинки. Ничего не делаем, продолжаем поиск\другие_действия и т.д.

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


Может быть это и работает, но у меня все рушится на твоем 6 пункте. Все пиксели камней с колормодом я собрал, но скрипт во время работы просто не находит этот пиксель нужный, сколько бы их не было, хотя этот пиксель уникальный, он встречается только внутри камня и отсутсвует в фоне я проверил с помощью unique search