python

CameraTablet — как сделать графический планшет при помощи веб-камеры

  • среда, 21 июня 2017 г. в 03:14:40
https://habrahabr.ru/post/331288/
  • Обработка изображений
  • Python


Здравствуйте, меня зовут Дмитрий. Здесь я хочу рассказать о том, почему меня не устраивает мышка, и как я пытаюсь ее заменить. Я разрабатываю CAE-программы для инженеров (расчет статики и динамики механических систем), треть рабочего времени я работаю как project manager, а в остальное время я — системный архитектор, разработчик и тестер в своем и в чужих проектах. У меня всегда открыты десять-двадцать окон, между которыми мне приходится постоянно прыгать:

  1. Visual Studio – собственно, софт, обычно три-четыре разных solution
  2. SourceSafe – версионирование.
  3. Outlook
  4. Skype
  5. Total Commander – файлы, файлы.
  6. Internet-Explorer – планирование софта, мониторинг продвижения по проекту, doxygen документация и т.д.
  7. Word, Excel – список задач, протоколы заседаний, требования к проекту, быстрое построение графиков и т.д.
  8. PowerPoint – презентации для менеджмента.
  9. Notepad++ — просмотр промежуточных результатов, конфиги, и т.д.
  10. CAE soft наш – тестовая и основная версия.
  11. CAE soft других фирм – для тестов

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

В итоге весь мой рабочий день – это постоянное метание между мышкой и клавиатурой:

  • Мышка: открыть документ, пролистать,
  • Клавиатура: написать три-четыре строчки.
  • Мышка: нажать на кнопку, переместиться в другую программу, нажать на кнопку
  • Клавиатура: в появившемся окне написать 2-3 значения.
  • Мышка: отрыть другое окно. Нажать на кнопку. Выбрать пункт меню. Потом пункт в под-меню. Потом в под-под-меню. Клик! Новое окно!

В один прекрасный момент моя правая рука сказала: «Извини, хозяин, но что-то нагрузка для меня великовата». Кисть болела почти два месяца, сначала слабо, потом все сильнее. В итоге я купил вертикальную мышку, выучил побольше шорткатов в Visual Studio и перешел на Total Commander.

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

Ни одна из стандартных альтернатив мышке мне не нравится: PointStick (пипка в центре клавиатуры для ноутбуков), тачпад, графический планшет – у всех либо точность плохая, либо все равно надо дергать руку с клавиатуры.

Есть еще программы и железо для трекинга глаз, вроде Camera Mouse или Tobii Eye Trackers. Честно, тратить сотню баксов на Tobii Eye Tracker не хотелось, а Camera Mouse очень плохо распознавало положение глаз (подозреваю, что виноваты мои очки).

Программа CameraTablet


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

Писать программу я решил в Python, якобы на этом языке очень быстро можно разрабатывать прототипы. Самое забавное, что в итоге CameraTablet получилась очень небольшим. Больше всего времени понадобилось, чтобы понять, как opencv распознает образы. Плюс немного пришлось повозиться, чтобы найти нормальный скрипт для эмуляции мыши. В остальном благодаря массе библиотек на Python удалось довольно быстро сделать все, что хотелось. Что мне понадобилось в итоге:

  1. opencv
    • распознавание пальца на видео
    • сохранение файла с фотографией пальца
    • калибровка камеры
  2. keyboard – обработка горячих клавиш
  3. TkInter — пять кнопок для GUI.

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

Что дальше


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

Фич, которых на данный момент нет, но которые очень хочется сделать:

  1. Поддержка нескольких мониторов
  2. Эмуляция MouseDown und MouseUp (необходимо для выделения текста)
  3. Поддержка Linux

И тут наступил самый тяжелый момент, когда самое вкусные 20% дела уже сделаны, а в одиночку дальше пилить 80% не хочется. Тогда я и решил, что пришла пора все выложить на GitHub, благо я давно мечтал сделать что-нибудь open source. Буду очень рад, если кто-нибудь захочет принять участие проекте (тестирование, программирование, документация – все, что угодно). И, конечно, было бы интересно послушать мысли на тему интерфейсов человеко-машинных интерфейсов вообще и альтернативы мышам в частности.