Author Topic: Анализ текста с картинки  (Read 17060 times)

0 Members and 1 Guest are viewing this topic.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Анализ текста с картинки
« Reply #30 on: July 24, 2014, 05:11:11 PM »
Вот я и предлагаю отследить все варианты и на каждый создать картинку, т.е. сделать упор на 100% распознавание. Картинок кстати будет не много. На первых порах скрипт должен делать скриншот и останавливаться, в случае если не смог распознать изображение. Лучше уж пусть бот ничего не сделает, чем например, выкинет из инвентаря дорогой предмет.
Ошибаешься, картинок может быть много. Практически все пограничные пикселы могут меняться.
Я за %. Всегда делал так в сложных случаях. Особенно при колормоде не 8, а 7 или 6. Иногда приходится снижать колормод из-за малого контраста, часто при 7 уже искомый объект равен фону.
« Last Edit: July 24, 2014, 05:13:24 PM by Vint »


Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: Анализ текста с картинки
« Reply #31 on: July 24, 2014, 06:32:14 PM »
Quote
вынужден не согласится на процент совпадения выставленный в 95-99 % позволит отсеять возможные изменения пары  рандомных пикселей, а вот выискивание всех возможных вариаций картинки может вылиться в увлекательное приключение поскольку искомая картинка мало того что появляется в рандомном месте так и еще и фон не статический.
Давайте рассмотрим на примере картинки http://s019.radikal.ru/i640/1407/b1/1b13236923c0.png
Попробуем установить процент совпадения 95-99%. Расчет прост.
180 / 100 * 1 = 1.8 (99% совпадения - будет проигнорирован 1 пиксель) - это не вариант
180 / 100 * 2 = 3.6 (98% совпадения - будет проигнорировано 3 пикселя) - не стабильно
...
180 / 100 * 5 = 9 (95% совпадения - будет проигнорировано 9 пикселей) - это перебор
Вот что получится если проигнорировать 5% (95% совпадения) пикселей этой картинки:
http://s015.radikal.ru/i333/1407/fd/94ebc6124f72.png Какая там цифра распознается, не подскажете? :)
Это еще повезло, что картинка такая большая, цифры вполне умещаются на поле 3x5, тогда нельзя проигнорировать даже 1 пиксель (ноль можно спутать с восьмеркой).
Цель разработчиков защиты игры в том и заключается, чтобы бот не мог точно распознать изображение, а путался в этих самых 95-99%.
Зачем нам самим себе процент неудач устанавливать?  :)
Перебор картинок работает очень быстро, тем более что их не так уж и много, мало их будет в этой задаче.
Code: (clickermann) [Select]
$arr[0] = "0.bmp"
$arr[1] = "1.bmp"
$arr[2] = "2.bmp"
$arr[3] = "3.bmp"

FOR($i, $i < 4) // Переменная i - Индекс элемента массива
   GETSCREEN
   IF_PICTURE_IN (x,y, x2,y2, $arr[$i])
      // Действие, если изображение найдено
   END_IF
END_CYC

HALT

IF_PICTURE_IN можно заменить на PXLXOR или PXLCRC.

Для тяжелых случаев, где помимо точности, критична скорость распознавания, можно использовать "двухступенчатое" распознавание изображений, т.е. за два прохода. Первый "грубый" поиск находит саму область искомой картинки, или размытые очертания изображения. В первом проходе уместно и даже обязательно применение % точности. Второй "точный" поиск запустится только по положительному результату первого поиска и будет иметь точность 100%.
А вообще, первым делом, нужно пролазить все настройки игры (все файлы настроек игры), почитать в интернете про настройку данной игры. И окажется, что можно отключить все эффекты прозрачности окон и размытости шрифтов. Или хотя бы немного их уменьшить. Да и клавиши заодно забиндить на нужные действия, чтобы мышку использовать как можно меньше и не палиться. Другими словами Clickermann'у помогать надо всемерно, тогда и он ответит точностью и скоростью. :)


« Last Edit: July 24, 2014, 06:34:04 PM by Atas »

ronny56

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Re: Анализ текста с картинки
« Reply #32 on: July 25, 2014, 02:51:29 AM »
Quote
вынужден не согласится на процент совпадения выставленный в 95-99 % позволит отсеять возможные изменения пары  рандомных пикселей, а вот выискивание всех возможных вариаций картинки может вылиться в увлекательное приключение поскольку искомая картинка мало того что появляется в рандомном месте так и еще и фон не статический.
Давайте рассмотрим на примере картинки http://s019.radikal.ru/i640/1407/b1/1b13236923c0.png
Попробуем установить процент совпадения 95-99%. Расчет прост.
180 / 100 * 1 = 1.8 (99% совпадения - будет проигнорирован 1 пиксель) - это не вариант
180 / 100 * 2 = 3.6 (98% совпадения - будет проигнорировано 3 пикселя) - не стабильно
...
180 / 100 * 5 = 9 (95% совпадения - будет проигнорировано 9 пикселей) - это перебор
Вот что получится если проигнорировать 5% (95% совпадения) пикселей этой картинки:
http://s015.radikal.ru/i333/1407/fd/94ebc6124f72.png Какая там цифра распознается, не подскажете? :)
Это еще повезло, что картинка такая большая, цифры вполне умещаются на поле 3x5, тогда нельзя проигнорировать даже 1 пиксель (ноль можно спутать с восьмеркой).
Цель разработчиков защиты игры в том и заключается, чтобы бот не мог точно распознать изображение, а путался в этих самых 95-99%.
Зачем нам самим себе процент неудач устанавливать?  :)
Перебор картинок работает очень быстро, тем более что их не так уж и много, мало их будет в этой задаче.
Code: (clickermann) [Select]
$arr[0] = "0.bmp"
$arr[1] = "1.bmp"
$arr[2] = "2.bmp"
$arr[3] = "3.bmp"

FOR($i, $i < 4) // Переменная i - Индекс элемента массива
   GETSCREEN
   IF_PICTURE_IN (x,y, x2,y2, $arr[$i])
      // Действие, если изображение найдено
   END_IF
END_CYC

HALT

IF_PICTURE_IN можно заменить на PXLXOR или PXLCRC.

Для тяжелых случаев, где помимо точности, критична скорость распознавания, можно использовать "двухступенчатое" распознавание изображений, т.е. за два прохода. Первый "грубый" поиск находит саму область искомой картинки, или размытые очертания изображения. В первом проходе уместно и даже обязательно применение % точности. Второй "точный" поиск запустится только по положительному результату первого поиска и будет иметь точность 100%.
А вообще, первым делом, нужно пролазить все настройки игры (все файлы настроек игры), почитать в интернете про настройку данной игры. И окажется, что можно отключить все эффекты прозрачности окон и размытости шрифтов. Или хотя бы немного их уменьшить. Да и клавиши заодно забиндить на нужные действия, чтобы мышку использовать как можно меньше и не палиться. Другими словами Clickermann'у помогать надо всемерно, тогда и он ответит точностью и скоростью. :)

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


Насчет других сообщений,-6% там может быть только у активации,так что "время активации" в изображении не имеет значения.

Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: Анализ текста с картинки
« Reply #33 on: July 25, 2014, 11:32:09 AM »
Можно написать примерно такой сценарий с использованием функции IF_PICTURE_IN().
[spoiler]
Code: (clickermann) [Select]
WAITMS(500)

LOGCLEAR

$entry = 0 // Количество найденных изображений

//-------------------------------- Предварительное сканирование

GETSCREEN
COLORMODE(8)

IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Картинка.bmp", -1, 90)
   $entry_1_X = $_return1 // Сохраняем координаты для следующих операций
   $entry_1_y = $_return2
   LOGWRITE ("Первое совпадение найдено")
   LOGWRITE( STRCONCAT("x=", $entry_1_X) ) // Вывод в лог информации для отладки
   LOGWRITE( STRCONCAT("y=", $entry_1_y) )
   LOGWRITE (" ")
   INC($entry) // Счетчик найденных изображений увеличивается на единицу
   //
   // Координата X (горизонтальное смещение) для левого верхнего угла области поиска остается неизменной
   // Область поиска становится меньше и смещается вниз на высоту искомого изображения (10 пикселей)
   IF_PICTURE_IN ($_return1,$_return2+10, $_xmax,$_ymax, "Картинка.bmp", -1, 90)
      $entry_2_X = $_return1
      $entry_2_y = $_return2
      LOGWRITE ("Второе совпадение найдено")
      LOGWRITE( STRCONCAT("x=", $entry_2_X) )
      LOGWRITE( STRCONCAT("y=", $entry_2_y) )
      LOGWRITE (" ")
      INC($entry)
      // В этом месте (если достаточно двух совпадений) можно перейти к следующему действию сценария
      // и не терять время на поиск третьего совпадения.
      // Например оператором GOTO(label) :)
      //
      IF_PICTURE_IN ($_return1,$_return2+10, $_xmax,$_ymax, "Картинка.bmp", -1, 90)
         $entry_3_X = $_return1
         $entry_3_y = $_return2
         LOGWRITE ("Третье совпадение найдено")
         LOGWRITE( STRCONCAT("x=", $entry_3_X) )
         LOGWRITE( STRCONCAT("y=", $entry_3_y) )
         LOGWRITE (" ")
         INC($entry)
      ELSE
         LOGWRITE ("Третье совпадение не найдено")
      END_IF
      //
   ELSE
      LOGWRITE ("Второе совпадение не найдено")
   END_IF
   //
ELSE
   LOGWRITE ("Первое совпадение не найдено")
END_IF

LOGWRITE (" ")
LOGWRITE ("Всего найдено совпадений: ", $entry)

//-------------------------------- Окончательная обработка

SWITCH($entry) // Действия в зависимости от количества найденых изображений
CASE(1)
   // случай 1
CASE(2)
   // Для примера, здесь может быть код для проверки точности найденных изображений
   // ...
   //   $arr[0] = "0.bmp"
   //   $arr[1] = "1.bmp"
   //   $arr[2] = "2.bmp"
   //   $arr[3] = "3.bmp"
   //   FOR($i, $i < 4) // Переменная i - Индекс элемента массива
   //      GETSCREEN
   //      IF_PICTURE_IN (x,y, x2,y2, $arr[$i])
   //         // Действие
   //      END_IF
   //   END_CYC
   // ...
CASE(3)
   // случай 3
DEFAULT
   // случай по умолчанию
END_SWITCH


HALT
[/spoiler]
Картинка и скрипт для теста во вложении.

ronny56

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Re: Анализ текста с картинки
« Reply #34 on: July 25, 2014, 11:54:31 AM »
Можно написать примерно такой сценарий с использованием функции IF_PICTURE_IN().
[spoiler]
Code: (clickermann) [Select]
WAITMS(500)

LOGCLEAR

$entry = 0 // Количество найденных изображений

//-------------------------------- Предварительное сканирование

GETSCREEN
COLORMODE(8)

IF_PICTURE_IN (0,0, $_xmax,$_ymax, "Картинка.bmp", -1, 90)
   $entry_1_X = $_return1 // Сохраняем координаты для следующих операций
   $entry_1_y = $_return2
   LOGWRITE ("Первое совпадение найдено")
   LOGWRITE( STRCONCAT("x=", $entry_1_X) ) // Вывод в лог информации для отладки
   LOGWRITE( STRCONCAT("y=", $entry_1_y) )
   LOGWRITE (" ")
   INC($entry) // Счетчик найденных изображений увеличивается на единицу
   //
   // Координата X (горизонтальное смещение) для левого верхнего угла области поиска остается неизменной
   // Область поиска становится меньше и смещается вниз на высоту искомого изображения (10 пикселей)
   IF_PICTURE_IN ($_return1,$_return2+10, $_xmax,$_ymax, "Картинка.bmp", -1, 90)
      $entry_2_X = $_return1
      $entry_2_y = $_return2
      LOGWRITE ("Второе совпадение найдено")
      LOGWRITE( STRCONCAT("x=", $entry_2_X) )
      LOGWRITE( STRCONCAT("y=", $entry_2_y) )
      LOGWRITE (" ")
      INC($entry)
      // В этом месте (если достаточно двух совпадений) можно перейти к следующему действию сценария
      // и не терять время на поиск третьего совпадения.
      // Например оператором GOTO(label) :)
      //
      IF_PICTURE_IN ($_return1,$_return2+10, $_xmax,$_ymax, "Картинка.bmp", -1, 90)
         $entry_3_X = $_return1
         $entry_3_y = $_return2
         LOGWRITE ("Третье совпадение найдено")
         LOGWRITE( STRCONCAT("x=", $entry_3_X) )
         LOGWRITE( STRCONCAT("y=", $entry_3_y) )
         LOGWRITE (" ")
         INC($entry)
      ELSE
         LOGWRITE ("Третье совпадение не найдено")
      END_IF
      //
   ELSE
      LOGWRITE ("Второе совпадение не найдено")
   END_IF
   //
ELSE
   LOGWRITE ("Первое совпадение не найдено")
END_IF

LOGWRITE (" ")
LOGWRITE ("Всего найдено совпадений: ", $entry)

//-------------------------------- Окончательная обработка

SWITCH($entry) // Действия в зависимости от количества найденых изображений
CASE(1)
   // случай 1
CASE(2)
   // Для примера, здесь может быть код для проверки точности найденных изображений
   // ...
   //   $arr[0] = "0.bmp"
   //   $arr[1] = "1.bmp"
   //   $arr[2] = "2.bmp"
   //   $arr[3] = "3.bmp"
   //   FOR($i, $i < 4) // Переменная i - Индекс элемента массива
   //      GETSCREEN
   //      IF_PICTURE_IN (x,y, x2,y2, $arr[$i])
   //         // Действие
   //      END_IF
   //   END_CYC
   // ...
CASE(3)
   // случай 3
DEFAULT
   // случай по умолчанию
END_SWITCH


HALT
[/spoiler]
Картинка и скрипт для теста во вложении.

Теперь разберем по порядку
Code: (clickermann) [Select]
CASE(1)
   // случай 1

это то,что будет делать кликер если найдет 1 совпадение?
 случай 2,это если 2 подряд,и случай по умолчанию это если не найдет верно?

Еще,случай 1 это -6?,случай 2 -12,случай 3 -18 я верно понял?


Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: Анализ текста с картинки
« Reply #35 on: July 25, 2014, 12:08:32 PM »
Quote
это то,что будет делать кликер если найдет 1 совпадение?
Ну уж я незнаю, что там у тебя по сценарию, если обнаружено одно совпадение изображения.  :)
Я бы сделал повторную проверку, чтобы исключить ошибку при 90% распознавании. Но возможно и 90% будет достаточно точно.
Quote
случай 2,это если 2 подряд,и случай по умолчанию это если не найдет верно?
Еще,случай 1 это -6?,случай 2 -12,случай 3 -18 я верно понял?
Да, всё так получается.
Кстати, неплохо бы делать SCREENSHOT в случае по умолчанию, чтобы отловить редко встречающиеся варианты изображения и порезать их на картинки.  :)

А SWITCH() я вставил для примера и чтобы не загромождать секцию "Предварительное сканирование", где вложенные друг в друга IF_PICTURE_IN(). Если сценарий небольшой, то можно обойтись и без SWITCH().
« Last Edit: July 25, 2014, 12:17:04 PM by Atas »