Добро пожаловать в очередной неуместный и безумный проект (* эй, эй, это важно, хорошо!!). После успешного запуска (* я считаю, что это был сумасшедший хит) печально известного T-Man (* ваш Tinder Wingman с искусственным интеллектом), если вы еще не читайте , идите читайте (* пожалуйста, мне нужно больше просмотров)T-Man.

Приветствую вас в Protyper.

(* В драматической сцене)

Вы когда-нибудь чувствовали, что печатание отстойнее вашего пылесоса? И если печатание было футбольным матчем, то вы были Куртуа (* Месси так сильно мускатный орех, что вы хотите отрезать себе ноги….. Visca El Barca ……. без обид… я могу делать это весь день ).

* подожди, подожди, у меня есть еще один

Ваш набор текста отстойнее, чем у Ланы Роудс (*боже, какая она красивая) в ее фильмах? Protyper — это именно то, что вам нужно. (* Офицер арестовал меня, потому что я его убиваю!!! … пусть этим офицером будет Лана, пожалуйста!)

Хорошо достаточно! давайте теперь технически.

Как обычно, я разделю проблему на несколько подзадач и попытаюсь решить их по отдельности.

Проблемы

  1. Захват экрана
  2. Обнаружение символов на захваченном изображении
  3. Контроллер для обнаружения и реагирования на пользовательский ввод
  4. Создание уведомлений для отображения информации

Захват экрана

Решить эту проблему достаточно легко. В Python есть множество инструментов для создания скриншотов. В этом проекте мы будем использовать pyautogui. Поскольку pyautogui позволяет захватывать определенную область экрана.

Обнаружение символов на захваченном изображении

Есть два варианта решения этой проблемы. Сложный вариант и легкий вариант. Сложный вариант заключается в том, что мы могли бы создать с нуля нашу собственную нейронную сеть для обнаружения персонажа (*о, да ладно, кто это делает). Самый простой вариант — использовать чужую модель (* работайте с умом, а не усердно). Итак, в этом проекте мы будем использовать pytesseract и OpenCv для обнаружения символов.

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

Опять же, существует множество инструментов, предоставляющих интерфейсы для прослушивания и управления событиями мыши/клавиатуры. В этом проекте мы будем использовать pyinput.

Создание уведомления для отображения информации

Создать уведомление не так сложно. Мы могли бы написать собственный код для доступа к dbus для создания уведомления или использовать библиотеку, которая сделает это за нас. (* как вы уже догадались, я ленив и буду использовать некоторую библиотеку) В этом проекте мы будем использовать plyer для создания уведомлений на уровне ОС.

Код

Как обычно, вы можете найти всю реализацию в моем личном репозитории GitHub. Pro-Typer

Требования

  1. python 3.10 (*почему бы и нет!!… он поставляется с операторами switch yehhhhhh)
  2. pytesseract

Для системы Debian выполните

sudo apt install tesseract-ocr

Примечание: сделайте это, если вы не хотите вручную добавлять исполняемый файл tessaract в PATH

Настройка проекта

  1. Клонировать репозиторий
git clone https://github.com/dcostersabin/pro-typer.git

2. Зайти внутрь про-типера

cd pro-typer

3. Требования к установке

pip3 install -r requirements.txt

Выполняется

python3 main.py

Пояснение

Мы начнем с создания абстрактного класса Trigger, который будет отслеживать все ключевые события.

class Trigger(ABC):
........... bla bal bla ........
    @abstractmethod
    def on_keydown(self, key):
        # do stuff
        pass

Вы можете видеть, что я создал абстрактный метод, а именно on_keydown, который позволит нам написать нашу бизнес-логику.

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

class ImageSize:
............. bla bla bla .......................
     def is_valid(self):
        if self.start is None or self.end is None:
            self.invalid_notify()
            return False

        height, width = self.height_width
        x_valid = self.start[0] < self.end[0]
        y_valid = self.start[1] > self.end[1]
        h_w_valid = height > 28 and width > 28

        status = x_valid and y_valid and h_w_valid

        if not status:
            self.invalid_notify()

        return status

  

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

Механизм съемки экрана прост. Я не буду объяснять, как это делается, но вы можете найти странное ключевое слово, а именно обратные вызовы.

def __init__(self, callbacks=None):
    self.image = None
    self.callbacks = callbacks
    self.image_size = ImageSize()
    self.mouse_controller = Controller()
    super().__init__()

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

def _call_callbacks(self):
    _ = None if self.callbacks is None else [calls(self.image) for calls in self.callbacks]

Класс ImageToChar внутри OCR — это просто простой абстрактный класс для обнаружения символов в переданном изображении и прогнозирования обнаруженного символа, который будет храниться в переменной, называемой прогнозированием.

Чтобы контролировать все действия, мы создадим класс, а именно SysController, почему бы и нет. Добавление Sys к имени класса делает класс более важным, чем другие классы (* Разорвите мою логику).

Ключевая карта идет вроде.

Ctrl: если вы нажмете Ctrl, будет сделан скриншот вашего текущего видимого экрана.

Esc: если вы нажмете escape, программа прекратит работу.

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

Alt: если вы нажмете Alt, то он зафиксирует конечные координаты, которые также являются положением вашего указателя на экране (* но другое, лол. Я очень плохо объясняю вещи).

Вниз : И, наконец, если вы нажмете клавишу со стрелкой вниз, скрипт наберет для вас захваченные символы.

Вуаля, теперь у вас есть OCR на стероидах. Вот несколько скриншотов системы.

Теперь вы можете набирать тысячи слов за считанные секунды. Вы можете использовать эту программу, чтобы прокомментировать мой пост (* я рекламирую себя в своей статье)

Кто такой Сабин Шарма?

Если вы заинтересованы в автоматизации, вы должны проверить мою другую статью Автоматизация Tinder?! Преимущества программиста

Если вас интересуют алгоритмы, вам следует ознакомиться с другими моими статьями: Молекулярно-динамическое моделирование твердых сфер — приоритетная очередь в действии с Java, Создайте свою собственную игру на основе ИИ, Контроллер вентилятора NVIDIA для Linux (сделай сам). ».

А если вас интересует кибербезопасность, прочтите мою недавнюю статью Запачкать руки: использование уязвимости переполнения буфера в C