Author Topic: Распознование текста  (Read 6846 times)

0 Members and 1 Guest are viewing this topic.

SilentCat

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Распознование текста
« on: May 21, 2016, 04:34:28 PM »
Есть имена игроков в виде картинок.
Требуется распознать имя и сохранить в виде текста за максимально короткое время. В идеале около 100мс. Кроме времени выполнения - еще важное условие, чтобы в 100% случаев имя распозновалось верно.
Имена находятся в заранее известных местах. Шрифт и цвет символов всегда одинаковые. Ширина одного символа может быть разная. В имени могут использоваться латинские буквы, цифры и любые символы. 
Пробовал сохранить отдельно каждый символ в картинке и через scanpicture определять какие символы есть в имени, а затем расставлять их в правильном порядке. Такой подход в большинстве случаев работает, но очень медленно - слишком много возможных символов приходится искать.
« Last Edit: May 21, 2016, 04:51:03 PM by SilentCat »

SilentCat

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Распознование текста
« Reply #1 on: May 22, 2016, 02:29:11 AM »
Такой подход будет работать быстро только для 2 и далее распознования, а первое останется долгим, что есть очень не хорошо.
И к тому же относительно большая база соберется очень быстро. В день будет примерно 200-300 уникальных имен. Через пару недель в половине случаев придется проверять почти все или все символы.
Я думал насчет идеи для распознаных имен записывать еще контрольную сумму пикселей и сначала проверять ее, но это опять же поможет только для повторного распознования. Уникальных имен слишком много, поэтому надо, чтобы имя определялось быстро сразу.

SilentCat

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Распознование текста
« Reply #2 on: May 22, 2016, 03:43:55 AM »
Суть в том, что бот должен очень быстро реагировать на то, что происходит в игре, а происходит там все очень быстро. Помимо прочего, для определения того что именно должен сделать бот, нужно определить имена игроков. Во время одной сессии игроки могут меняться по сути бесконечное число раз, т.е. уникальных имен может быть очень много. Если бот будет тратить секунду на определение имени, то он не успеет отреагировать на происходящее в игре.

SilentCat

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Распознование текста
« Reply #3 on: May 22, 2016, 07:17:44 AM »
Получилось уменьшить время выполнения скрипта в 6-7 раз.
Перешел с версии 4.12 на 4.11  :P
Теперь через scanpicture время выполнения  200-250мс, не идеально но уже близко  :)

Еще вот проблемка появилась, не пойму в чем дело. На месте символа "o" находится символ "с". Поиск задан с 100% совпадением и фон не должен игнорироваться.

Code: (clickermann) [Select]
getscreen
scanpicture($var,932,502,986,530,"с.bmp",-1,100)

for($i=0,$i<arrsize($var),1)
print($var[$i])
end_cyc

halt

 

SilentCat

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Распознование текста
« Reply #4 on: May 22, 2016, 09:41:27 AM »
Дык, в том то и дело, что ищу я его с черным полем справа... Может быть я неправильно понимаю как задается параметр bgcolor... Если -1, то цвет фона НЕ игнорируется, т.е. картинка ищется с 100% соответствием всех пикселей. Если будет например 0, то игнорируется черный цвет. Правильно?

Про getscreen - спасибо, иногда забываю область указать :)

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Распознование текста
« Reply #5 on: May 22, 2016, 10:35:36 AM »
можно в файлах настройки убрать 1 мс задержки после каждой выполненной строки, это заметно увеличивает скорость в долгих циклах и больших скриптах, но увеличивает вероятность зависания скрипта при выполнении, так что этот последний ускоритель, только для хорошо отлаженных скриптов и нужно время от времени незабывать его включать снова для удобства редактирования.

clickermann411\data\config.ini

; Дополнительная задержка (в милисекундах) после выполнения команды (0 - без задержки)
; (Позволяет разгрузить процессор в случае, когда сценарий не использует WAIT)
delay_between_lines = 1

В 4.11 версии это не работает. Скажем если указать 100 то настройка будет действовать только на WAITMS от 2 до 100 мс. Вообще выполняет не то что от нее требуется.

В последней версии 4.12.001 эту задержку починили, однако скорость работы упала в разы.
Также оказалось если выставить 0 то кликер постоянно  грузит проц даже при задержке WAIT

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Распознование текста
« Reply #6 on: May 23, 2016, 09:24:43 AM »
...Еще вот проблемка появилась, не пойму в чем дело. На месте символа "o" находится символ "с". Поиск задан с 100% совпадением и фон не должен игнорироваться.

Может ты её областью поиска "подрезал"?


Если ты там нарезал все заготовки, хоть кинь их сюда. А то как пробовать? Всех символов нет, время перебора будет не то. У меня поиск одного символа вместе с гетскрином выдаёт 1 мс.


Кстати, где колормод в примере?

« Last Edit: May 23, 2016, 09:44:31 AM by Vint »


SilentCat

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Распознование текста
« Reply #7 on: May 23, 2016, 02:00:25 PM »
Область поиска намного больше картинки, дело не в этом.
Ради интереса провел эксперимент:
Ищу изображение 1.bmp (буква "с" - палка слева 3 пикселя, палки наверху и внизу по 2 пикселя, картинка сохранена с белыми полями в один пиксель со всех сторон) на картинке 3.bmp. Т.е. открываю картинку в графическом редакторе и на ней ищу изображение 1.bmp. Изображение находится 4 раза - на 1,2,3 и 6 вариантах.
Затем ищу изображение 2.bmp таким же макаром. Находится 1 раз на 1 варианте.
В общем функция scanpicture каким-то образом обрезает картинку, которую ищет. Но это не просто столбец из крайних правых пикселей, иначе изображение находилось бы на последнем варианте...

Code: (clickermann) [Select]
getscreen(933,502,984,531)
scanpicture($var,933,502,984,531,"1.bmp",-1,100)

for($i=0,$i<arrsize($var),1)
print($var[$i])
end_cyc

halt

Интересно, что если размер букв увеличить, то такой проблемы уже не возникает. И если 1.bmp сохранить с 2 белыми полями справа, то все работает исправно.
« Last Edit: May 23, 2016, 02:22:04 PM by SilentCat »

SilentCat

  • Зашел в гости
  • *
  • Posts: 11
    • View Profile
Re: Распознование текста
« Reply #8 on: May 23, 2016, 02:13:29 PM »
можно досрочно прекращать дальнейший поиск символов, если окажется, что нужное число символов уже найдено и всё поле имени заполнено.
Можно подобрать порядок проверки символов в зависимости от частоты их использования, чтоб сразу находить те которые чаше используются и уменьшать сектор поиска оставшихся.
можно вообще разделять сектора поиска после нахождения каждого знако вычитая из поиска их позиции.
можно разгрузить комп, закрыв все фоновые приложения и  некоторые процессы
можно принять меры к резкому увеличению эффективности охлаждения процессора.

Спасибо за идеи, на выходных попробую первые 3 реализовать, посмотрим какой прирост дадут. Хотя прирост больше, чем при переходе с 4.12 на 4.11 трудно будет получить))
Насчет остального - комп достаточно мощный, оперативы хватает, проц особо не грузится даже при масштабных проектах с потоками, не говоря уже о том, чтобы перегреваться.


Если ты там нарезал все заготовки, хоть кинь их сюда. А то как пробовать? Всех символов нет, время перебора будет не то. У меня поиск одного символа вместе с гетскрином выдаёт 1 мс.


Кстати, где колормод в примере?


Колормод в примере не нужен был, там уже отколормоденные изображения использовались)

Заготовки во вложении, но там только цифры и буквы, остальные символы не нарезал пока.

Вася_V

  • Зашел в гости
  • *
  • Posts: 1
    • View Profile
Re: Распознование текста
« Reply #9 on: May 25, 2016, 01:56:53 AM »
Получилось уменьшить время выполнения скрипта в 6-7 раз.
Перешел с версии 4.12 на 4.11  :P
Теперь через scanpicture время выполнения  200-250мс, не идеально но уже близко  :)

Еще вот проблемка появилась, не пойму в чем дело. На месте символа "o" находится символ "с". Поиск задан с 100% совпадением и фон не должен игнорироваться.

Code: (clickermann) [Select]
getscreen
scanpicture($var,932,502,986,530,"с.bmp",-1,100)

for($i=0,$i<arrsize($var),1)
print($var[$i])
end_cyc

halt
идёт наложение поиска, ведь в букве О есть буква С, если ты поменяешь приоритет поиска сначала букву С искать потом букву О то он не должен будет затирать данные символ О на С. Попробуй поменять местами их!

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Распознование текста
« Reply #10 on: September 20, 2016, 03:30:06 PM »

Ждал пока исправят, но видимо не дождусь. Награда должна найти своего героя.
Орден "Антибаг" второй степени