Создайте собственное приложение для бесконтактного экрана с помощью OpenCV. Начните свое путешествие по компьютерному зрению с этого проекта.

вступление

Я очень рад поделиться с вами еще одним из моих проектов по использованию Python в повседневной жизни.

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

Звучит круто, правда?

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

Представьте себе железнодорожную станцию ​​или банкомат с несколькими сенсорными экранами для бронирования / покупки билетов или снятия наличных. Было бы неплохо просто использовать жесты для управления этими сенсорными панелями, вместо того, чтобы думать о том, чтобы перед этим дезинфицировать руки?

Я думаю, что да.

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

В конце я расскажу о его ограничениях и будущих разработках.

Давайте вместе бороться с пандемией.

Бесконтактные элементы экрана

Вот несколько важных вопросов, на которые нужно ответить:

Что мы пытаемся развивать?

Бесконтактный экран!

Что ему делать?

По сути, он должен бесконтактно реагировать на наши жесты.

Хорошо, другими словами, все, что мы можем делать с помощью клавиатуры и мыши - но только руками и жестами.

Предполагая, что вы видели мою предыдущую статью об основах компьютерного зрения (OpenCV), этой информации достаточно, чтобы начать разработку нашего приложения для бесконтактного экрана!

Пойдем!

Логика приложения

Чтобы воссоздать функциональные возможности сенсорной панели / мыши, нам нужны элементы управления движением и щелчком.

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

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

Итак, давайте построим эти детали последовательно.

Кодирование

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

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

Интерфейс приложения

Для создания интерфейса я буду использовать методы OpenCV, которые я описал в вышеупомянутой статье.

Я стараюсь писать слишком много комментариев к своему коду, чтобы его было легче понять. Но если у вас есть какие-либо сомнения или вопросы, посмотрите мои предыдущие статьи или / и спросите меня.

Код следующий

Просто скопируйте и вставьте свой скрипт Python, и вы получите следующий фреймворк.

Результат выглядит так (с маркером в руке и без него соответственно):

а также

Несколько комментариев по поводу моего сценария:

  • Как мы видим, я добавил несколько слов и стрелок, чтобы проинформировать пользователей о функциональности (Move и Click).
  • Кроме того, я применил порог, чтобы отфильтровать все цвета, кроме цвета маркера. (Однако эта часть должна быть изменена пользователем). На скриншоте выше я держу зеленый маркер.
  • Рамки четко указывают регионы, в которых применяется каждая функция (см. Следующий раздел).

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

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

Функциональные возможности (забавная часть)

Дополнительный пакет Python

Для этой части приложения требуется дополнительный пакет Python.

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

Я буду использовать pyautogui библиотеку.

Чтобы установить этот пакет, запустите: pip install pyautogui

Теперь мы готовы приступить к забавной части этого приложения!

Одно дополнение к фреймворку

В этот момент я понял, что мой маркер довольно расширен.

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

В результате мы получили красивую жирную точку красного цвета в центре маркера.

Примечание. Я использую блок try-except. Если вы не знаете, что это, я настоятельно рекомендую вам проверить это. Например, я объяснил это в этом проекте Jupyter Notebook.

Короче говоря, если у вас в руке нет маркера, программа вызовет исключение и завершит работу. Блок Try-catch предотвращает его нарушение.

Движение курсора

Прежде всего, я хочу реализовать движение курсора / мыши.

Но что нам действительно нужно для перемещения курсора?

Нам нужно знать две вещи:

  1. текущая позиция;
  2. желаемая должность.

Первая точка зависит от текущего местоположения нашего маркера (центр)

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

Итак, нам нужно добавить в нашу программу следующие элементы:

  • import pyautogui
  • добавить функциональность внутри цикла while

По сути, мы будем использовать метод pyautogui.move(). Это переместит курсор из любой позиции в любую позицию, в которую мы хотим, чтобы он переместился.

Логика, которую я ввел, представляет собой последовательность блоков if-else, которые будут проверять, где находится наш центр маркера относительно интерфейса / фреймворка.

Код выглядит так

В результате мы можем перемещать курсор по экрану, не касаясь ни одного пальца сенсорной панели (обратите внимание, это не видео, а изображение в формате gif, поэтому движение будет немного прерывистым):

Эта функциональность состоит из двух частей:

  1. Убедитесь, что маркер находится в левой или правой части экрана. Идея состоит в том, чтобы контролировать движение этого маркера, только если он находится слева. Правая сторона предназначена для нажатия.
  2. Управляйте перемещением курсора. Основная задача этой части состоит в том, чтобы определить координаты и установить правильные ограничения на позиции X и Y центра маркера. В противном случае это серия вложенных if-else блоков.

Примечание 1.. К концу этот код будет очень длинным из-за большого количества условий и функций. Итак, я не помещаю предыдущие части, о которых я говорил ранее. Либо скопируйте и вставьте новые блоки кода, либо посмотрите полный код в моем репозитории GitHub (ссылка в конце этой статьи).

Примечание 2. Я использую блоки if-else. Если вы не знаете, что это, я настоятельно рекомендую вам проверить это.

Нажатие курсора

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

Для этого нам просто нужно переместить наш маркер на отмеченное поле ЩЕЛЧОК, чтобы активировать эту функцию.

По сути, используя метод pyautogui.click().

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

Это одно из ограничений этого приложения, о котором я расскажу в конце статьи.

Но пока мы используем два маркера.

Код для добавления второго обнаружения маркера идентичен первому. Основное отличие заключается в составной маске, которая объединяет оба маркера, например mask = threshold | threshold2.

Итак, я хотел бы сэкономить ваше время, показывая только самые важные части (полный код смотрите в моем репозитории GitHub).

По сути, вы можете добавить этот блок сразу после первой серии (if-else) условий.

Это приводит к следующей структуре

Обратите внимание, что я использую здесь новые координаты, соответствующие новому центру маркера.

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

На этом мы закончили разработку нашего прототипа, рабочей версии программы. Есть несколько функций, которые можно улучшить, но программа работает, как и было обещано - бесконтактно.

Давайте рассмотрим некоторые из возможных будущих улучшений.

Примечание! Если вы видите, что ваша программа медленно реагирует на ваши жесты, вы можете раскомментировать эту строку: pyautogui.PAUSE = 0, однако делайте это на свой страх и риск !
В случае непредвиденного исключения / ошибки остановить программу может быть сложно, поэтому раскомментируйте эту строку, если вы абсолютно уверены, что обработали все (очевидные) исключения.

Полный код

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

Ограничения приложений и будущие разработки

Я считаю важным поговорить о некоторых очевидных и не столь очевидных ограничениях этой программы.

  1. В настоящее время он поддерживается только для локального использования - с вашего компьютера (ПК, ноутбука). Исходя из моей мотивации помогать людям во время пандемии COVID-19, это приложение следует использовать в обычных местах (банкоматы, вокзалы, аэропорты, торговые центры и т. Д.).
    Однако я полагаю, что его можно расширить на любое удаленное устройство, использующее материнскую плату, например, Raspberry Pi.
  2. Чтобы в полной мере использовать это приложение, вам все равно нужно носить с собой указатель (или два). Однако далеко не все выходят с указателем / маркером в кармане, иначе было бы немного странно.
    Таким образом, альтернативой может быть распознавание жестов, таких как открытая ладонь, кулак, обнаружение пальца и т. д. Это устранит необходимость в каких-либо указателях и цветовом пороге, но потребует, например, немного большего объяснения для пользователей.
  3. Простое улучшение может включать динамическую скорость курсора в зависимости от расстояния маркера от центра. Например, further = faster, closer = slower.
  4. Также интересно посмотреть, что происходит, когда вы не держите указатель / маркер. В моем случае программа ложно определяет шум как мои указатели. В этом случае курсор начинает двигаться в случайном направлении и щелкает сам по себе.
    Чтобы справиться с этим неприемлемым поведением, можно просто применить ядро ​​свертки (см. Часть 6 этой статьи).

Подводя итог, я вполне доволен этим проектом и надеюсь, что он вам понравился, как и мне во время работы над ним.

И последнее, но не менее важное: если вы обнаружили какие-либо ошибки или у вас есть предложения или комментарии, не стесняйтесь обращаться ко мне (см. Ниже).

Спасибо, что дочитали до конца. Оставайтесь в целости и сохранности.

Контакт

Свяжитесь со мной в LinkedIn.

Загляните в мой GitHub.

P.S .: Если вам нравится непрерывное чтение на этой прекрасной платформе Medium.com, подумайте о поддержке авторов этого сообщества, подписавшись на членство ЗДЕСЬ. Это стоит всего 5 долларов в месяц и поддерживает всех авторов.