Перейти к содержимому


Оленеметр на коленке

олени кругом одни олени

  • Пожалуйста, авторизируйтесь для того, чтобы ответить
Сообщений в теме: 27

madb3aver #1 Отправлено 05 Июнь 2015 - 23:49

    Капитан

  • Игроки
  • 21849 боев
  • 3 434
  • [TABOR]
  • Регистрация:
    19.11.2014

*
Популярное сообщение!

Небольшой дисклаймер для основных групп читателей.

 

1. Для модераторов, КМ и прочих злых дядек и тетек с бан-хаммерами, которым будет лень читать, а их руки чешутся и сами тянутся раздать какой-нибудь бан за нарушение Правил или еще какой пункт из Списка запрещенных препаратов:

а) Это не мод б) Совсем не мод в) Клиент не модифицируется г) Протокол обмена не снифается д) Все законно, чинно, мирно

 

2. Для обычных игроков: 

Не стоит задавать вопросы из разряда - "а как это поставить?" и "а как запустить?". Это всего лишь "proof of concept", который может стать отправной точкой для написания нормального оленеметра. А может и не стать, т.к. мне писать сильно некогда и очень лень, поэтому разбирайтесь сами - исходный код прилагается.

 

3. Для тех, кто понимает, что такое исходный код, не боится Python и знает, что такое OCR - для экспериментов вам понадобится:

1. Python 2.7 + pip

2. Зависимости, устанавливаемые через pip: Pillow, watchdog, grab, cssselect, pytesseract

3. Установленный Tesseract OCR

 

4. Для создателей и владельцев problitz.ru:

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

 

Уф, вроде обратился ко всем заинтересованным сторонам, поэтому - поехали.

 

Итак, наши любимые (и не очень) разработчики дали недвусмысленно понять, что оленеметра не будет. Т.е. не будет от слова "совсем". Меня это категорически не устраивает и я абсолютно не согласен с их доводами против, поэтому я решил посмотреть, что можно по-быстром сделать, чтобы решить данную задачу за пару часов. При этом, мне очень не хотелось лезть в кишки игры и разбираться с ними - для меня это слишком сложная затея. Поэтому в голове созрел план по распознаванию скриншотов во время загрузки боя и дальнейшему вытаскиванию информации по статистике игроков, чьи имена удалось распознать. Алгоритм данной идеи вырисовывался таким:

 

  • Во время загрузки боя мы делаем скриншот
  • Этот скриншот автоматически копируется на настольный компьютер. Копироваться он может через iCloud или Dropbox или еще какой-нибудь Яндекс-Диск
  • На компьютере запущен скрипт, который мониторит заданную директорию на предмет появления новых файлов
  • При появлении нового скриншота мы распознаем его с помощью tesseract 
  • Запрашиваем стату распознанных никнеймов с любого удобного сайта статистики
  • Показываем стату на экран

 

Осталось дело за малым - реализовать это. Вот собственно и реализация (https://cloud.mail.r.../4F2B/trLqLfMn1). В качестве языка для реализации был выбран Python, т.к. это один из моих основных рабочих инструментов. Основные моменты в коде:

 

Функции allies_crop и enemies_crop нужны для вырезания из скриншота областей со списками союзников и противников. Смыл в том, чтобы не распознавать весь файл, где после последнего обновления выводится куча информации.

 

Функция post_process повышает контрастность кропов по B каналу, чтобы облегчить задачу распознавания текста. В итоге в tesseract попадают вот такие "красивые" картинки, распознавание которых проходит достаточно уверенно

allies_1.jpg enemies_1.jpg allies_4.png enemies_4.png

 

Функция post_cleanup нужна для убирания  пробелов и замены символа "|" на букву "I" - к сожалению, из-за очень нечитабельного шифта (все любители типографики с него плюются), который использовали разработчики игры, происходит путаница между буквами "I", "l" и символом "|" - я выбрал замену на букву "I", как букву имеющую наибольшую частотную повторяемость в английском языке.

 

Функция print_stat проходит по получившемуся списку распознанных никнеймов и запрашивает по ним статистику с problitz.ru, благо сайт позволяет получить её без танцев с бубном вокруг POST запросов - тупой GET и вытаскивание цифры через CSS селектор.

 

Остальной код тривиальный и не должен вызвать недопонимания.

 

Итак, что получилось в итоге? А получилось следующее - спустя 15 секунд после начала боя я знаю стату большинства противников и союзников.

scr.jpg Screen Shot 2015-06-06 at 02.56.09.png

 

Конечно, распознаются далеко не все и 15 секунд - это очень много, но лучше так, чем вообще никак.

 

Upd. от 18.06.2015

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


Сообщение отредактировал madb3aver: 18 Июнь 2015 - 10:20

 не ходи сюда - там этот рак себяшечки выкладывает.

 "Джоффри, Серсея, Меррин Трант, Тайвин Ланнистер, Берик Дондаррион, Торос из Мира, Красная Женщина, Гора, Пёс, Кнопка, М6МПС, ФиналЭльф, Колдвард...."


DisneyDurogon #2 Отправлено 06 Июнь 2015 - 00:06

    Лейтенант

  • Бета-тестер
  • 21399 боев
  • 801
  • [TABOR]
  • Регистрация:
    21.12.2011
Spoiler

 

Чел ты монстрилла!!! Олень весчь конечно нужная, но не до такой степени- алгоритм убойный( плюсану за труды;)

Сообщение отредактировал hitenok: 06 Июнь 2015 - 15:09
Оверквотинг


Korshun1744 #3 Отправлено 06 Июнь 2015 - 02:23

    Старший сержант

  • Игроки
  • 38831 бой
  • 119
  • [BIRD]
  • Регистрация:
    08.07.2011
Уважуха конечно, но я так понимаю, что это должно работать в тандеме с пк, а как жи мобильность? Ведь весь цимус блиц в мобильности, получаем оленемер, теряем мобильность, это не есть гуд(

santa1977 #4 Отправлено 06 Июнь 2015 - 03:55

    Лейтенант

  • Игроки
  • 24070 боев
  • 890
  • [SLM-R]
  • Регистрация:
    16.04.2014
Извини но под бан ты уже попал "запрещается использование красного шрифта простым игрокам" это из правил) и меня уже за это банили на 14 дней))

Spiker73 #5 Отправлено 06 Июнь 2015 - 04:13

    Младший лейтенант

  • Игроки
  • 4336 боев
  • 433
  • Регистрация:
    19.03.2011

Просмотр сообщенияsanta1977 (06 Июнь 2015 - 06:55) писал:

Извини но под бан ты уже попал "запрещается использование красного шрифта простым игрокам" это из правил) и меня уже за это банили на 14 дней))

 

Это не красный шрифт, а ссылка в тексте. 

C0HHblU_X0Pb0K #6 Отправлено 06 Июнь 2015 - 04:57

    Сержант

  • Игроки
  • 2287 боев
  • 61
  • [C0_X]
  • Регистрация:
    21.03.2015

Что могу сказать... Это реально КРУТО!

Придумать такой достаточно сложный алгоритм, прорисовать его до мельчайших деталей, довольно таки непросто!

Не поленился, и прочитал все от начала, до конца, и поставил заслуженный плюс.

Конечно, план далеко не идеален, из-за сложности сего процесса, вследствие чего возрастает и время ожидания боя, а так как в Blitz очень динамичные бои, то 15 секунд это долго для среднестатистического игрока. Но "лучше так, чем вообще никак".

 


Сообщение отредактировал C0HHblU_X0Pb0K: 06 Июнь 2015 - 15:50


bRed_KZN #7 Отправлено 06 Июнь 2015 - 05:28

    Старшина

  • Игроки
  • 7392 боя
  • 205
  • [OS_G]
  • Регистрация:
    26.06.2014

Всем по оленю !!!

Ну а если серьезно, нужную вещь ты затеял 

 



TwiGi #8 Отправлено 06 Июнь 2015 - 06:35

    Младший лейтенант

  • Игроки
  • 30799 боев
  • 451
  • [GLAF2]
  • Регистрация:
    07.02.2015
Очень полезная статейка, но кроме планшета носить с собой ещё и ноут, как-то не очень

 


raverbaby #9 Отправлено 06 Июнь 2015 - 07:09

    Младший лейтенант

  • Игроки
  • 42802 боя
  • 474
  • [TAB0R]
  • Регистрация:
    01.07.2014
молодец, лови плюс за старания! можешь реализовать это в виде исполняемого файла? не силен в программировании, но фичу опробовать не против

gpamatypr #10 Отправлено 06 Июнь 2015 - 07:33

    Лейтенант

  • Игроки
  • 7150 боев
  • 1 385
  • Регистрация:
    08.07.2014
Бобёр рулит :B

 

(ノಠ益ಠ)ノ彡┻━┻


leakur #11 Отправлено 06 Июнь 2015 - 08:08

    Старшина

  • Игроки
  • 181 бой
  • 233
  • Регистрация:
    26.06.2014
Зачем это?  Я и так знаю что практически у всех меньше 50!

dobraja_duwa #12 Отправлено 06 Июнь 2015 - 08:22

    Капитан

  • Игроки
  • 13144 боя
  • 3 036
  • Регистрация:
    04.08.2014
Красава, главное кинул реальную идею, одна голова хорошо , а две лучше , может кто-то допилит, изменит,)

                                                         

 

     ]=my history=>CLickКлац


alex_bond1994 #13 Отправлено 06 Июнь 2015 - 08:29

    Старшина

  • Игроки
  • 7358 боев
  • 267
  • Регистрация:
    08.04.2013
Плюсую за старания!  Думаю что идея пойдет дальше!!  Удачи!!  

 


KEV1109 #14 Отправлено 06 Июнь 2015 - 08:46

    Сержант

  • Игроки
  • 28532 боя
  • 93
  • [G-N]
  • Регистрация:
    04.07.2014
Для чего это нужно ? Бывает, что в бою тупят и 60%-й статой, а победы в бою, бывает, вытаскивают с 45% . Примеров масса !

u3_3oonapKa_C_TTPuBeToM #15 Отправлено 06 Июнь 2015 - 09:13

    Младший сержант

  • Бета-тестер
  • 21641 бой
  • 46
  • [IIUCK]
  • Регистрация:
    19.11.2012
Будут фокусить.

KEV1109 #16 Отправлено 06 Июнь 2015 - 09:23

    Сержант

  • Игроки
  • 28532 боя
  • 93
  • [G-N]
  • Регистрация:
    04.07.2014
Бред ! Пример - ну хорошо, узнал я в начале боя, что у моего союзника на Т-34-85 - 46% побед. И что ? А он бой вытянул ! Причем очень красиво ! И как можно предположить итог боя, когда не знаешь, кто, и в каком состоянии в данный момент играет ? Человеческий фактор никто не отменял !

MrPr13zrakk #17 Отправлено 06 Июнь 2015 - 12:20

    Лейтенант

  • Игроки
  • 11200 боев
  • 1 114
  • Регистрация:
    07.09.2014
Да ты што, миня ж стотизда ногебатора фокусить будут!

Заходи на http://wot-mobile.ru!


oieth #18 Отправлено 06 Июнь 2015 - 13:18

    Сержант

  • Игроки
  • 5383 боя
  • 96
  • Регистрация:
    09.01.2011
Spoiler

После селекта можно зациклить на второй круг для тех ников, у который возвращено пусто вместо статы, но с заменой l на I. Очевидно же. Было лень? Остальное очень хорошо


Сообщение отредактировал hitenok: 06 Июнь 2015 - 15:06
Оверквотинг

Кровь на стали. Сталь в крови

__K_O_P_O_JI_E_B_A__ #19 Отправлено 06 Июнь 2015 - 14:07

    Сержант

  • Игроки
  • 54262 боя
  • 88
  • [UZCOM]
  • Регистрация:
    20.12.2014
Нифига не понял:teethhappy:но за старания кину в тебя плюсом,так держать)

K0R_2015 #20 Отправлено 06 Июнь 2015 - 14:36

    Лейтенант

  • Игроки
  • 25814 боев
  • 1 181
  • [LOW72]
  • Регистрация:
    02.01.2015
Угу, думаю и правда на коленке(слышат которой)а тут аблоом.
А вообще красава, все по идее должно работать.





Количество пользователей, просматривающих этот форум: 1

0 пользователей, 0 гостей, 0 анонимных