Search
Write a publication
Pull to refresh

Определение положения головы в пространстве или 6DOF Face Tracking

Автоматическое распознавание и отслеживание положения лица — это одна из главных задач в области компьютерного видения. Имея работоспособный алгоритм можно организовать примерку очков в интернет-магазине, отслеживать направление взгляда (Gaze tracking) и т.д. Я предлагаю немного разобраться.

Существует несколько разработок. Некоторые из них требуют дополнительные датчики, некоторые нет. На мой взгляд, наиболее продвинутая система без дополнительного оборудования — это FaceApi. Ее очень просто найти в интернете, плюс они предоставляют демо-версию. Но она платная. Интересно разобраться, за что платят деньги, и реально ли написать свой алгоритм не уступающий данной.

Итак. Начнем с конца. Нам надо получить положение лица в пространстве и углы поворота относительно 3-х осей координат. Понятней будет сказать X, Y, размер лица и углы поворота.

Если с углами более менее понятно, то с размерами и положением в пространстве не очень. Положение в пространстве задается 3-мя координатами x, y, z. У нас же 2D пространство, где есть только x, y, ну и вопрос размера конечно. Можно заглянуть сюда или сюда.

В итоге я получил следующие формулы:

X = Ax * F / Az + W/2;
Y = Ay * F / Az + H/2;

W — Ширина экрана.
H — Высота экрана.
F — Фокусное расстояние (примерно 600 — 650).

Ax
Ay — Координаты точки в пространстве
Az

X — X на экране.
Y — Y на экране.

При условии, что модель изначально задается в пределах от 0 до 1.

Теперь про углы. Существует матрица поворота в пространстве.

В OpenCV есть функция cvPOSIT. На входе ей задается 3D модель состоящая из не менее 4-х точек, отображение этих точек в пространстве, фокусное расстояние. На выходе получаем вектор смещения центра модели (0,0,0) и матрицу поворота в пространстве. Перемножаем каждую точку модели на матрицу поворота, прибавляем вектор смещения, пропускаем через матрицу перспективы или формулы выше и получаем координаты проекции точек.

В принципе логично, но теперь надо найти эти 4-ре точки. У нас есть два глаза, нос и рот. Т.е. задача определения положения головы в пространстве заключается в определении координат глаз, носа и рта на каждом кадре. Все вроде бы просто. Берем тот же OpenCV Haar Cascade, определяем лицо, вычисляем зоны для глаз, носа и рта и вперед!
А что будет, если лицо повернется, и каскад лица не определится или ложное определение?

Скажу так: От каскада не отказываюсь, но надо искать другие способы определения. Другими словами появилась новая задача: «Face features detection».

О них пойдет речь в дальнейших статьях.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.