Отображение антропометрических точек и углов поворота головы
В этом туториале вы узнаете, как отображать антропометрические точки и углы поворота головы после того, как лицо пользователя было найдено на видео или изображении. В основе этого туториала лежит туториал Детекция и трекинг лиц на видеопотоке и соответствующий проект, данный туториал является его продолжением и дополнением.
Готовый демо-проект вы можете найти в дистрибутиве Face SDK: examples/tutorials/detection_and_tracking_with_video_worker
#
Отображаем антропометрические точки- Создайте проект, в котором лицо будет находиться и отслеживаться при помощи объекта
VideoWorker
. Также в этом проекте лицо будет выделяться зеленым прямоугольником (см. Детекция и трекинг лиц на видеопотоке). - Модифицируем функцию
DrawFunction::Draw
. Объектpbio::RawSample
содержит в себе информацию об отслеживаемом лице, а именно: ограничивающий прямоугольник, антропометрические точки, позиции глаз, углы и т.д. Используя методpbio::RawSample::getLandmarks
получаем антропометрические точки отслеживаемого лица.
drawfunction.cpp
Примечание: В данном проекте используется набор точек singlelbf
(31 точка). В качестве альтернативного варианта вы можете использовать набор точек esr
(47 точек) (см. Антропометрические точки). Для этого вам необходимо указать конфигурационный файл video_worker.xml
вместо video_worker_lbf.xml
в конструкторе ViewWindow::ViewWindow
(файл ViewWindow.cpp
) (см. Детекция и трекинг лиц на видеопотоке).
- Визуализируем точки – на лице они будут отображаться в виде маленьких кружков красного цвета.
drawfunction.cpp
- Запускаем проект. На лице должны отображаться антропометрические точки.
#
Отображаем углы поворота головы- Информацию об углах поворота головы мы также получаем из объекта
pbio::RawSample
.
drawfunction.cpp
- Подключаем заголовочные файлы
QMatrix3x3
иQQuaternion
. Используя методQQuaternion::fromEulerAngles
получаем матрицу поворота.
Примечание: В Face SDK используются углы поворота yaw (поворот по оси Z), pitch (поворот по оси Y), roll (поворот по оси X). Алгоритм FaceSDK позволяет детектировать лица в следующем диапазоне углов: yaw [-60; 60], pitch [-60; 60], roll [-30; 30].
- Поскольку изображение, полученное с камеры и отображаемое на экране, является зеркальным отражением пользователя (правая часть лица на изображении находится слева, левая - справа), нам необходимо инвертировать направление оси Y (умножить на -1) для корректной визуализации углов.
drawfunction.cpp
- Для визуализации углов нам необходимо вычислить среднюю точку между глазами пользователя
axis_origin
, из которой будут исходить векторы yaw, pitch, roll.
drawfunction.cpp
- Для того, чтобы длина векторов yaw, pitch, roll была пропорциональна размеру лица, введем коэффициент
axis_length
. Он будет равен половине длины диагонали ограничивающего прямоугольника лицаface_size
.
drawfunction.cpp
- Визуализируем углы – векторы будут отображаться разными цветами (желтым, красным и зеленым).
drawfunction.cpp
- В цикле рисуем векторы. Векторы исходят из точки между глазами пользователя. Конечная точка вектора равна проекции вектора на плоскость изображения
QPointF
, умноженной на коэффициентaxis_length
и отложенной от начальной точки.
drawfunction.cpp
- Запускаем проект. Теперь на лице отображаются антропометрические точки и углы поворота головы.