Author Topic: Поиск картинок  (Read 4801 times)

0 Members and 1 Guest are viewing this topic.

shatun

  • Освоившийся
  • **
  • Posts: 36
    • View Profile
Re: Поиск картинок
« Reply #15 on: March 13, 2022, 01:09:27 PM »
Да, Вы правы.
Я уже пошёл по этому пути. Обработка при поиске пикселей действительно происходит намного быстрее в отличии от картинок. Закинул в SUB и вызываю его раз 30)))) пока не закончится игра (не прокликаются все монетки). Только со скоростью просмотра и нажатия на найденные пиксели ещё нужно поработать.
Code: [Select]
SUB(cocfff)
 GETSCREEN(526,371, 1375, 857)
  IF_PIXEL_IN(526,371, 1374, 856, 6542231)
      LCLICK($_return1, $_return2+30)
   END_IF
WAITMS(100)
 GETSCREEN(526,371, 1375, 857)
  IF_PIXEL_IN(526,371, 1374, 856, 1205465)
      LCLICK($_return1, $_return2+30)
   END_IF
WAITMS(100)
 GETSCREEN(526,371, 1375, 857)
  IF_PIXEL_IN(526,371, 1374, 856, 1263545)
      LCLICK($_return1, $_return2+60) // здесь спец. нажатие ниже т.к. появляется похожий объект с приближённым цветом по которому нельзя нажимать
   END_IF
WAITMS(100)
 GETSCREEN(526,371, 1375, 857)
  IF_PIXEL_IN(526,371, 1374, 856, 4564812)
      LCLICK($_return1, $_return2+30)
   END_IF
WAITMS(100)
END_SUB

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Поиск картинок
« Reply #16 on: March 13, 2022, 10:38:13 PM »
Только со скоростью просмотра и нажатия на найденные пиксели ещё нужно поработать.

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

Примерно так
Code: (clickermann) [Select]
SUB(cocfff)
    GETSCREEN(526,371, 1375, 857)
    IF_PIXEL_IN(526,371, 1374, 856, 6542231, 1205465, 4564812)
        LCLICK($_return1, $_return2+30)
        WAITMS(100)
    END_IF   
    IF_PIXEL_IN(526,371, 1374, 856, 1263545)
        LCLICK($_return1, $_return2+60) // здесь спец. нажатие ниже т.к. появляется похожий объект с приближённым цветом по которому нельзя нажимать
        WAITMS(100)
    END_IF
END_SUB
« Last Edit: March 13, 2022, 10:42:57 PM by Vint »


shatun

  • Освоившийся
  • **
  • Posts: 36
    • View Profile
Re: Поиск картинок
« Reply #17 on: March 14, 2022, 09:01:31 AM »
Quote
А зачем там столько вызовов GETSCREEN?
я думал поскольку картинки динамические и постоянно меняют расположение нужно постоянно скринить экран и по новому скрину искать пиксели. Блин здорово если это не так. Это по сути должно ускорить работу скрипта.
Quote
И если координаты одни, в IF_PIXEL_IN можно указывать несколько цветов через запятую. Сработает на первом найденном.
у меня было много раз когда выпала одна монетка (например красная), а далее подряд сыпятся штуки 4 монетки (например зелёные)
Если кликер сразу не попал по красной картинке (такое тоже часто случается) она опустится ниже пока кликер будет жать все зелёные монетки ну и проигрыш.

Т.е. если алгоритм будет такой?:
- поиск красной
- клик по красной (промахнулся)
- поиск зелёной
- клик по зелёной
- поиск зелёной
- клик по зелёной
- поиск зелёной
- клик по зелёной
или он будет искать и жать на красную пока не нажмёт её?

Я вот уже думаю в сторону Вашего скрипта написанного выше, но для пикселей а не для картинок т.к. с анимацией он у меня не работает, но логика именно та - поиск с низу вверх как описывал автор топика.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Поиск картинок
« Reply #18 on: March 14, 2022, 11:53:40 AM »
Даю не большой лайфхак по скорейшему поиску динамических картинок. Плюс в том, что способ САМЫЙ быстрый, на который способен Clickermann, при максимальной точности совпадения картинок. Минуса два... Первый минус в том, что придется собирать базу картинок, но с этим справится сам Clickermann, а вот второй более весомый - координаты картинок должны быть статичны. И так - поехали...
Как пример, возьмем распознание локаций в той же fantastic fishing. Там в локациях название на фоне облаков, плюс смена погоды и времени суток и так далее и потому картинки получаются динамические.



Код скрипта будем использовать такой:

Code: (clickermann) [Select]
GETSCREEN (357,25, 642,39)
$count = PXLCRC (357,25, 642,39)

IF(FExists(STRCONCAT("скрины\локации"))=0)
   FCREATE (STRCONCAT("скрины\локации"))
END_IF

$loka = 0
GETDIRLIST ($arr, "скрины\локации\*")
IF(ARRSIZE($arr) > 0)
   FOR($i=0,$i<ARRSIZE($arr))
      IF(FEXISTS(STRCONCAT("скрины\локации\",$arr[$i],"\*.bmp")))
         $loka = 1
         LOGWRITE ($arr[$i])
         $i = ARRSIZE($arr)
      END_IF
   END_CYC
END_IF

IF($loka = 0)
   LOGWRITE ("Локация не распознана...")
   if (FExists(STRCONCAT("скрины\локации\",$count,".bmp"))=0)
      SCREENSHOTFIX(357,25, 642,39, STRCONCAT("скрины\локации\",$count,".bmp"), 0)
   end_if
END_IF




WAITMS(50)

Сначала запустим скрипт и дадим ему поработать круглые (игровые) сутки, чтоб день ночью сменился и наоборот. Потом в папке "локации", создадим папку с названием самой локации, скрины которой Clickermann собирал игровые сутки, и переместим в эту папку все скрины, которые Clickermann создал в папке  "локации". То же самое потом повторяем с другой локацией.
Думаю, что сам механизм сейчас вам уже понятен.

Это могут быть не локации, а какие-нибудь вращающиеся монеты и так далее. Обычно для анимации таких объектов используется всего несколько статичных картинок, быстро повторяющихся друг за другом.

« Last Edit: March 14, 2022, 12:15:10 PM by Hito »
Я не ду... Потому и не бу...

Oblie1968

  • Освоившийся
  • **
  • Posts: 29
    • View Profile
Re: Поиск картинок
« Reply #19 on: March 14, 2022, 02:07:51 PM »
Даю не большой лайфхак по скорейшему поиску динамических картинок.
Метод рабочий. Самосбор картинок и цветов пикселей использую постоянно.
Пара технических замечаний.
1. В моей версии кликермана функций FExists и FCREATE нет, но всё равно, какой смысл использовать STRCONCAT с одним аргументом?
2. IF на строке 10, мне кажется, лишний, цикл и так не будет выполняться, если ARRSIZE($arr)==0
   

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Поиск картинок
« Reply #20 on: March 14, 2022, 02:35:49 PM »
1. В моей версии кликермана функций FExists и FCREATE нет, но всё равно, какой смысл использовать STRCONCAT с одним аргументом?

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

2. IF на строке 10, мне кажется, лишний, цикл и так не будет выполняться, если ARRSIZE($arr)==0

У меня иногда бывают условия типа:

Code: (clickermann) [Select]
IF(ARRSIZE($arr) > 0)
   FOR($i=0,$i<ARRSIZE($arr))
      IF(FEXISTS(STRCONCAT("скрины\локации\",$arr[$i],"\*.bmp")))
         $loka = 1
         LOGWRITE ($arr[$i])
         $i = ARRSIZE($arr)
      END_IF
   END_CYC
else
   
END_IF

Вот и вставил по привычке. Не думаю, что привычка очень уж плохая...
« Last Edit: March 14, 2022, 02:44:39 PM by Hito »
Я не ду... Потому и не бу...

Oblie1968

  • Освоившийся
  • **
  • Posts: 29
    • View Profile
Re: Поиск картинок
« Reply #21 on: March 14, 2022, 02:43:31 PM »
1. В моей версии кликермана функций FExists и FCREATE нет, но всё равно, какой смысл использовать STRCONCAT с одним аргументом?
А я просто рассеянный чуток по жизни и часто прописываю SCREENSHOTFIX в несуществующую папку, а потом ловлю ошибки скрипта.
Я не про это, это понятно, я про STRCONCAT с одним аргументом.

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Поиск картинок
« Reply #22 on: March 14, 2022, 02:46:52 PM »
Я не про это, это понятно, я про STRCONCAT с одним аргументом.
Я поправил ответ выше и сделал это раньше, чем увидел это сообщение. Сорри...
Я не ду... Потому и не бу...

shatun

  • Освоившийся
  • **
  • Posts: 36
    • View Profile
Re: Поиск картинок
« Reply #23 on: March 16, 2022, 08:08:04 AM »
.... а вот второй более весомый - координаты картинок должны быть статичны.
т.е. если монета просто вращается вокруг оси то это ТОП по скорости поиска анимированных картинок, а если она вращается и двигается (вверх, вниз, вправо или влево) этот скрипт работать небудет?

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Поиск картинок
« Reply #24 on: March 16, 2022, 08:53:29 AM »
.... а вот второй более весомый - координаты картинок должны быть статичны.
т.е. если монета просто вращается вокруг оси то это ТОП по скорости поиска анимированных картинок, а если она вращается и двигается (вверх, вниз, вправо или влево) этот скрипт работать небудет?
Нет - не будет, к сожалению. Ну... Если только координаты поиска в скрипте не будут плыть вслед за монеткой )) Хотя... Есть варианты... Сейчас опишу.
« Last Edit: March 16, 2022, 08:57:42 AM by Hito »
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Поиск картинок
« Reply #25 on: March 16, 2022, 09:51:46 AM »
Объясню на таком примере...



Ловить будем название выскочившей панели - "Клад халявный". Почему этот пример нам подходит...? Такие панели в игре всплывают разных размеров (названия панелей на разной высоте - зависит от количества информации внутри них) + названия у них могут быть разными. Мы не можем нашим способом вычислять и собирать базу картинок, изменяющихся и при этом с плавающими координатами, НО мы можем искать какие-нибудь не изменяющиеся картинки, тоже с плавающими координатами, но к координатам которых уже привязаны наши изменяющиеся картинки, которые нам нужны. Теперь понятна мысли?
Сначала ищем по всему экрану рамку, в которой находится сама надпись. (Для понимания ситуации, картинку увеличу)



 Но эту рамку, которую мы будем искать, мы слегка обработаем.



Закрасим места рамки, которые могут изменяться, черным цветом (я закрашиваю черным).
Далее наш скрипт:

Code: (clickermann) [Select]
GETSCREEN
COLORMODE (6)

IF_PICTURE_IN (0,0, $_xmax,$_ymax, "скрины\рамка.bmp", 0, 100)  // bgcolor отметим не -1, как обычно, а 0 - черный  (что за bgcolor в IF_PICTURE_IN - читаем в справке)
   
   LOGWRITE ("Найдена панель")
   
   IF(FExists(STRCONCAT("скрины\панели\заголовки"))=0)
      FCREATE (STRCONCAT("скрины\панели\заголовки"))
   END_IF
   
   $count = PXLCRC ($_return1+18,$_return2+2, $_return1+284,$_return2+13) // Подсчитываем хеш пикслей, для сравнения с базой, но уже отталкиваясь от координат, в которых найдена рамка
   // А дальше все по старой схеме
   $loka = 0
   GETDIRLIST ($arr, "скрины\панели\заголовки\*")
   IF(ARRSIZE($arr) > 0)
      FOR($i=0,$i<ARRSIZE($arr))
         IF(FEXISTS(STRCONCAT("скрины\панели\заголовки\",$arr[$i],"\*.bmp")))
            $loka = 1
            LOGWRITE ($arr[$i])
            $i = ARRSIZE($arr)
         END_IF
      END_CYC
   END_IF
   
   IF($loka = 0)
      LOGWRITE ("Заголовок панели не распознан...")
      if (FExists(STRCONCAT("скрины\панели\заголовки\",$count,".bmp"))=0)
         SCREENSHOTFIX(357,25, 642,39, STRCONCAT("скрины\панели\заголовки\",$count,".bmp"), 0)
      end_if
   END_IF
END_IF

WAITMS(50)
« Last Edit: March 16, 2022, 10:47:54 AM by Hito »
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Поиск картинок
« Reply #26 on: March 16, 2022, 11:17:16 AM »
Вот, например, ситуация только что произошла ) У меня затилинькал мобильник, так как в группу в ВК пришло сообщение:



А в игре ситуация:



И скрипт сделал скрин:

Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: Поиск картинок
« Reply #27 on: March 16, 2022, 09:33:03 PM »
Вот, кстати, еще пример... Я в БДО, при ловле рыбы, капчу выискивал вот такой сеткой. Там координаты капчи немного плавают.



В каждой ячейке на экране были буквы, которые не только менялись, но и меняли свой цвет. Но там я сами буквы вычислял не по заготовленным скринам (я их не делал там), а скрипт закрашивал все пиксели, которые были не равны цвету самой клетки, и вот по таким "теням" я уже вычислял буквы капчи.
Я не ду... Потому и не бу...