Рубрики
Без рубрики

Использование Google Tesseract OCR для обмана в тестах онлайн -памяти

Когда я впервые сыграл тест на тест на тест на устную память, меня зацепили. Идея мини -игры … Tagged with Python, Tuperial, Beginters, Ocr.

Когда я впервые сыграл Тест словесной памяти HumanBenchmark тест Я был зацепил. Идея мини -игры состоит в том, что она показывает слово, и вы должны сказать, является ли оно новым или появилось ранее. Это может звучать просто с 3 жизнями, но примерно через 12 слов ваша способность различать их два практически хороша, как и предположение.

Вместо того, чтобы на самом деле улучшить свою словесную память, я решил сделать это простым путем, обманывать. Google Tesseract OCR является одним из самых популярных и простых в использовании образа в текстовые преобразователи. Я написал сценарий примерно через полчаса, и хотя это не предпринимательство, он выполняет работу.

Монтаж

Tesseract Ocr

Нам нужно скачать и добавить Tesseract OCR к нашему пути, чтобы иметь доступ к нему из любого каталога на нашем компьютере. Страница установки направляйте вас через установку для Linux, Windows и Mac OS, так что просто следуйте за этим и проверьте, что она работает с командой Tesseract --версия Анкет

Модули Python

Если вы запускаете Python 3 (как вы должны быть) и используете PIP3 для установки модулей Python, вы можете получить все необходимые с этими 3 командами.

  • PIP3 Установите Pynput : Этот модуль позволяет нам взять вход от мыши, чтобы щелкнуть кнопки на мини -игре и переместить мышь.
  • PIP3 Установить Pyscreenshot : Pyscreenshot собирается сделать скриншоты слов, чтобы затем пройти на Tesseract.
  • PIP3 Установить pytesserAct : Нам нужен модуль PytesserAct, так как мы не можем использовать Tesseract напрямую из Python без обертки Python. Это всего лишь средний человек между нами и фактическим OCR.

Написание сценария

Таким образом, наши основные задачи для этого сценария будут следующими:

  • Скриншот Слово
  • Передайте его на Tesseract, получите вывод и добавьте в список известных слов
  • Если слово появилось ранее, нажмите «Виден», добавьте его в список и нажмите «Новый»
  • Продолжайте, пока не будет достигнут желаемый пользователь Highscore или что -то не так пойдет не так
Импорт
from pynput.mouse import Button, Controller
from PIL import Image
import pyscreenshot
import pytesseract
import sys
import re

Pynput – это довольно большой модуль, и нам понадобятся только два элемента, кнопку и контроллер. Поэтому нам нужно только импортировать эти две части Pynput. Мы используем PIL (библиотека изображений Python), чтобы открыть изображение скриншота, опять же нам нужно только изображение. Остальные модули довольно самостоятельно объясняют. Последний модуль, который мы импортируем, – это RE, который является модулем режима Python. Мы используем это только один раз, чтобы проверить, пошла ли игра и не показывает слово. По сути, это немного излишнее Но если бы вы обновили сценарий, вы найдете гораздо больше использования для выражений режима для разбора текста.

Скриншот
def screenshot():
    region = pyscreenshot.grab(bbox=(700,390,1250,450))
    region.save('currentWord.png')

Чтобы получить снимок экрана, нам нужно указать, какую область экрана мы хотим захватить. bbox находится в формате (x1, y1, x2, y2). Для обычного экрана 1080p данный аргументы делают область выбора достаточно большой для любого слова, которое игра бросает в вас. С этим скриншотом нам нужно где -то сохранить. Мы сохраняем его под CurrentWord.png который проанализируется позже Tesseract. Мы можем перезаписать это после каждой итерации, так как это будет помещено в наш список.

Передать слово Tesseract и добавить в список
def getWord(filename):
    return pytesseract.image_to_string(Image.open(filename))

Использование pytesseract довольно просто. С самостоятельным пояснительным методом Image_to_string Мы передаем открытое имя файла, которое всегда будет CurrentWord.png . Отлично, теперь у нас есть фактический текст из скриншота, теперь мы должны добавить его в массив (или список, как называет его Python), чтобы мы могли проверить на наличие дубликатов в будущем.

def isNew(currentWord, allWords):
    if currentWord in allWords:
        return 0
    else:
        allWords.append(currentWord)
        return 1

В isnew () Мы просто передаем текущее слово и список всех слов, которые мы видели раньше. Если слово находится в списке, мы возвращаем 0, указывая, что оно не новое, если оно новое, мы затем добавляем его в список всех известных слов и возвращаем 1.

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

def playGame(allWords, userLevel):
    mouse = Controller()
    for i in range(1,userLevel):
        screenshot()
        subject = getWord('currentWord.png')
        # if new
        if isNew(subject, allWords):
            mouse.position = (1030,505)
            mouse.click(Button.left, 1)
        # if seen
        else:
            mouse.position = (870, 505)
            mouse.click(Button.left, 1)

Функция играть в игру () принимает список всех слов и желаемого уровня пользователя (какой балл должен достичь бота). Он интенсирует мышь в качестве контроллера (из Pynput), поскольку нам нужно двигаться и щелкнуть мышью. Мы переоцениваем от 1 до пользовательского уровня, и в каждой итерации мы экранируем слово, получаем текст вывод из этого и посмотрим, новым или нет. Из этих двух результатов мы нажимаем либо на новый, либо увиденный, а затем петля начинается снова. . клик () принимает два аргумента в формате (X1, Y1). Опять же, этот скрипт работает только для экрана 1080p с окном в режиме полноэкранного режима, так как именно здесь есть кнопка, когда это так. Таким образом, из этого основного игрового цикла нам все еще нужно где -то принять вклад пользователя того, какого уровня они хотят достичь, и пройти в списке все слов. Мы будем использовать основную функцию для этого.

def main():
    allWords = list()
    mouse = Controller()
    userLevel = int(input('What level would you like to reach: '))
    if userLevel < 2:
        print('Error: defaulting to 10')
        userLevel = 10
    mouse.position = (950, 610)
    mouse.click(Button.left, 1)
    playGame(allWords, userLevel)

if __name__ == '__main__':
    main()

Мы получаем желаемый уровень пользователя и проверяем, является ли число действительным. Затем мы перемещаем мышь на кнопку «Пуск» и нажимаем, чтобы начать. Отсюда мы не вернемся к Майн. Последние две строки – это просто то, как вы заставляете интерпретатора Python запускать основную функцию по умолчанию.

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

В нашем getWord () Функция Мы собираемся добавить чек, чтобы увидеть, не является ли текущее «слово» не концом экрана. Мы собираемся использовать поиск режима, чтобы увидеть, соответствует ли строка «увидеть, как вы сравниваете». Если мы находимся на этом экране, программа выходит, поскольку она никогда не должна быть в этом состоянии.

def getWord(filename):
    text = pytesseract.image_to_string(Image.open(filename))
    if re.search('(See how you compare)+', text):
        print('Error: Unexpected end of game.')
        exit()
    else:
        return text

В нашем Playgame () Функция, которую мы собираемся добавить в некоторую регистрацию частоты как заметных, так и новых слов.

def playGame(allWords, userLevel):
    mouse = Controller()
    seenWords = 0
    for i in range(1,userLevel):
        screenshot()
        subject = getWord('currentWord.png')
        # if new
        if isNew(subject, allWords, seenWords, i):
            mouse.position = (1030,505)
            mouse.click(Button.left, 1)
        # if seen
        else:
            seenWords += 1
            mouse.position = (870, 505)
            mouse.click(Button.left, 1)
        percentage = 0
        percentage = float(seenWords/i)*100
        sys.stdout.write('\r{:.2f}% overall duplicates'.format(percentage))
        sys.stdout.flush() 

Я добавил встречный счетчик слов, чтобы отслеживать общее количество видных слов. После каждой итерации мы отображаем это как на общее количество слов, встречающихся, и отображаем его в хорошем формате.

Мы используем sys.stdout.write, чтобы написать в stdout и \ r Что может быть новым для вас, используется в основном стирание и записи текущей линии. Поэтому он не печатает новую линию для каждой итерации, обновляет линию, напечатанную с новой статистикой. Затем мы промываем выход для хорошей меры.

from pynput.mouse import Button, Controller
from PIL import Image
import pyscreenshot
import pytesseract
import sys
import re


def getWord(filename):
    text = pytesseract.image_to_string(Image.open(filename))
    if re.search('(See how you compare)+', text):
        print('Error: Unexpected end of game.')
        exit()
    else:
        return text

def screenshot():
    region = pyscreenshot.grab(bbox=(700,390,1250,450))
    region.save('currentWord.png')


def isNew(currentWord, allWords):
    if currentWord in allWords:
        return 0
    else:
        allWords.append(currentWord)
        return 1


def playGame(allWords, userLevel):
    mouse = Controller()
    seenWords = 0
    for i in range(1,userLevel):
        screenshot()
        subject = getWord('currentWord.png')
        # if new
        if isNew(subject, allWords):
            mouse.position = (1030,505)
            mouse.click(Button.left, 1)
        # if seen
        else:
            seenWords += 1
            mouse.position = (870, 505)
            mouse.click(Button.left, 1)
        percentage = 0
        percentage = float(seenWords/i)*100
        sys.stdout.write('\r{:.2f}% overall duplicates'.format(percentage))
        sys.stdout.flush()


def main():
    allWords = list()
    mouse = Controller()
    userLevel = int(input('What level would you like to reach: '))
    if userLevel < 2:
        print('Error: defaulting to 10')
        userLevel = 10
    mouse.position = (950, 610)
    mouse.click(Button.left, 1)
    try:
        playGame(allWords, userLevel)
    except KeyboardInterrupt:
        exit()


if __name__ == '__main__':
    main()

Дальнейшие улучшения

Если вы закончили сценарий и счастливы, что он работает, вот несколько дополнительных функций, которые вы можете реализовать, чтобы улучшить функциональность:

  • Сделайте сценарий адаптироваться к окнам различного размера (используйте половину ширины экрана для средней координаты вместо использования половины размеров экрана 1080p)
  • Вместо того, чтобы подключить мышь, возвращайте указатель в оригинальную позицию, когда она не занята нажатием.
  • Реализуйте сценарий для других мини -игр с подобным характером и разрушите высокие оценки!

Если у вас какие -либо вопросы о сценарии, разбирайтесь в том, как работает какая -то часть или сделала ваши собственные улучшения, и хотите показать их, вы можете сделать проблему или вытянуть запрос на Репо

Оригинал: “https://dev.to/iamcathal/using-google-s-tesseract-ocr-to-cheat-at-online-memory-tests-4lnl”