Pull to refresh

Детектирование ладоней и пальцев на изображении

Reading time 3 min
Views 34K

С течением времени изменяются наши представления о способах взаимодействия с компьютером. На смену «классических» клавиатуры и мыши, в нашу жизнь прочно вошли тачпады и сенсорные экраны. Но это не последняя ступень эволюции для средств ввода информации. С появлением устройств дополненной реальности, например таких, как Google Glass, возникает необходимость в интерфейсах способных гармонично вписываться в данную концепцию. Предпосылки к возникновению таких интерфейсов имеются, так, например, появились такие устройства как Intel Creative Camera, Microsoft Kinect или Leap Motion. Основными управляющими элементами в данных устройствах являются руки пользователя. Поэтому, одной из фундаментальных алгоритмических задач, для взаимодействия с подобными устройствами, является детектирование рук и пальцев пользователя и реконструкция их пространственного расположения.
В данной статье речь пойдет о одном из способов решения задачи детектирования ладоней и пальцев.

Постановка задачи


Под детектированием рук и пальцев будем понимать обнаружение таких точек, по которым можно восстановить положение ладони на плоскости и её позу. В качестве таких точек рационально использовать центр масс ладони и точки описывающие кончики пальцев.

Описание алгоритма


Рассмотрим некоторый контур, описывающий силуэт ладони:


Поиск особой точки ладони

Сначала определим точку, являющуюся описателем ладони. Как было упомянуто выше, в качестве такой точки будем использовать центр масс контура. Для его нахождения нам потребуется вычисление пространственных моментов. Момент является характеристикой контура, вычисляемой путем интегрирования(или суммирования) всех пикселей контура. В общем виде момент (p, q) можно записать как:

Тогда формулы для координат центра масс можно записать в виде:



Примерное размещение центра масс отмечено красной точкой на изображении.

Поиск особых точек пальцев

Теперь рассмотрим части контура соответствующие пальцам.
Для каждой точки P[n] контура, будем также рассматривать точки P[n-r], P[n+r], где r — некоторое положительное число (r<n).
Три такие точки образуют угол. Рассмотрим их:

Как видно из изображения, на контуре соответствующем силуэту пальцев, может быть 2 типа точек:
1) Точки лежащие на прямой(соответствуют точкам пальца). Угол P[n-r]P[n]P[n+] тупой.
2) Точки лежащие на дугах(соответствуют кончикам пальцев и промежуткам между пальцами). Угол P[n-r]P[n]P[n+] тупой.
Нас интересуют точки второго типа, т.к. они описывают кончики пальцев.
Как известно из курса мат. анализа: . Поэтому в качестве точек описывающих кончики пальцев будем искать точки 2 типа с максимальным(в окрестности) косинусом угла P[n-r]P[n]P[n+].
Но, как видно из рисунка выше, точки 2 типа соответствуют не только кончикам пальцев, но и промежуткам между пальцами. Для определения является ли точка кончиком пальца, воспользуемся свойствами обхода контура. Пусть мы обходим пиксели контура по часовой стрелке, тогда точки соответствующие кончикам пальцев будут соответствовать правому повороту P[n]P[n+r] относительно P[n-r]P[n], а точкам лежащим в промежутке между пальцами левому повороту.
Для определения, образуют ли три точки P[n-r], P[n], P[n+r] правый поворот, можно использовать обобщение векторного произведения на двумерное пространство, а именно условие правого поворота будет выглядеть следующим образом:


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

Реализация алгоритма


Вообще говоря, описанный выше алгоритм будет работать с видеопотоком обычной вэб-камеры, но в этом случае возникнут проблемы с аккуратным отделением переднего плана от фона. Для избежания этих проблем был использован RGB-D сенсор (Microsoft Kinect), при помощи которого можно вместо вычитания фона, просто ограничить рабочее расстояние путем порогового отсечения по глубине. Вообще Kinect для данной задачи не очень хорошо подходит, т.к. минимальное рабочее расстояние для него составляет порядка 40см, а это накладывает значительные ограничения его размещение. Но это все-же лучше чем ничего. В качестве драйвера для работы с Kinect использовался OpenNI.
Также была использована библиотека OpenCV для упрощения работы с Kinect и обработкой контуров.

Результаты экспериментов


Пример картинки в процессе работы алгоритма:

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


Исходный код: github.com/BelBES/HandDetector
Tags:
Hubs:
+43
Comments 28
Comments Comments 28

Articles