Определение положения головы в пространстве или 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».
О них пойдет речь в дальнейших статьях.
Существует несколько разработок. Некоторые из них требуют дополнительные датчики, некоторые нет. На мой взгляд, наиболее продвинутая система без дополнительного оборудования — это 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».
О них пойдет речь в дальнейших статьях.
0 комментариев