头部姿态获取算法概述
—— 才疏学浅, 难免有错误和遗漏, 欢迎补充和勘误.
获取头部运动姿态的流程图如下:
- 首先通过Dlib库得到2D人脸68个特征关键点,再通过3D Morphable Model等模型匹配算法拟合3D人脸特征点。摄像机中的各个坐标系的位置关系如下:
- 其中,世界坐标系为:Ow-XwYwZw;相机坐标系为:0c-XcYcZc;图像坐标系为:o-xy;像素坐标系为:图像左上角-uv,单位为像素。P为世界坐标系中的一点; p为P在图像坐标系中的投影点;f为焦距,即Oc到o的距离。
- 世界坐标系Ow-XwYwZw通过旋转和平移转换到相机坐标系0c-XcYcZc
转换公式为: [ X c Y c Z c 1 ] = [ R T 0 → 1 ] [ X w Y w Z w 1 ] \left[\begin{array}{c}X c \\ Y c \\ Z c \\ 1\end{array}\right]=\left[\begin{array}{ll}R & T \\ \overrightarrow{0} & 1\end{array}\right]\left[\begin{array}{c}X w \\ Y w \\ Z w \\ 1\end{array}\right] ⎣⎢⎢⎡XcYcZc1⎦⎥⎥⎤=[R0T1]⎣⎢⎢⎡XwYwZw1⎦⎥⎥⎤
其中旋转矩阵R的规格是3*3,平移矩阵T的规格是3*1,且都为未知量。
- 相机坐标系0c-XcYcZc通过三角形相似关系的透视投影转换到图像坐标系0-xy:
∵
△
A
B
O
c
∼
△
o
C
O
c
⋅
\because \triangle A B O c \sim \triangle o C O c \cdot
∵△ABOc∼△oCOc⋅ 且
△
P
B
O
c
∼
△
p
C
O
c
\triangle P B O c \sim \triangle p C O c
△PBOc∼△pCOc
∴
{
x
=
f
X
c
Z
c
y
=
f
Y
c
Z
c
\therefore\left\{\begin{array}{l}x=f \frac{X c}{Z c} \\ y=f \frac{Y c}{Z c}\end{array}\right.
∴{x=fZcXcy=fZcYc
将上式写为矩阵表达式为:
Z
c
[
x
y
1
]
=
[
f
0
0
0
0
f
0
0
0
0
1
0
]
[
X
c
Y
c
Z
c
1
]
Z c\left[\begin{array}{l}x \\ y \\ 1\end{array}\right]=\left[\begin{array}{cccc}f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0\end{array}\right]\left[\begin{array}{c}X c \\ Y c \\ Z c \\ 1\end{array}\right]
Zc⎣⎡xy1⎦⎤=⎣⎡f000f0001000⎦⎤⎣⎢⎢⎡XcYcZc1⎦⎥⎥⎤
- 图像坐标系0-xy通过伸缩和平移转换到像素坐标系uv:
p
(
u
,
v
)
:
{
u
=
x
d
x
+
u
0
v
=
y
d
y
+
v
0
p(u, v):\left\{\begin{array}{l}u=\frac{x}{d x}+u_{0} \\ v=\frac{y}{d y}+v_{0}\end{array}\right.
p(u,v):{u=dxx+u0v=dyy+v0
其中 d x dx dx、 d y dy dy为单个像素在 x x x轴和 y y y 轴方向上的物理长度,将上式写为矩阵表达式为:
[ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ x y 1 ] \left[\begin{array}{l}u \\ v \\ 1\end{array}\right]=\left[\begin{array}{ccc}\frac{1}{d x} & 0 & u_{0} \\ 0 & \frac{1}{d y} & v_{0} \\ 0 & 0 & 1\end{array}\right]\left[\begin{array}{l}x \\ y \\ 1\end{array}\right] ⎣⎡uv1⎦⎤=⎣⎡dx1000dy10u0v01⎦⎤⎣⎡xy1⎦⎤
- 至此,由世界坐标系0w-XwYwZw到像素坐标系uv之间的转换公式可合写为:
- 其中相机的内参只由相机本身决定,由张正友标定法等标定出来;相机的外参会随着世界坐标系中物体的位置而变化,当计算出相机畸变后,把3D参考点、2D关键点、相机内部参数和相机的畸变输入到OpenCV的solvePnP函数中求解出旋转矩阵R和平移矩阵T,最后通过欧拉角计算出驾驶人的头部运动姿态,即得到头部运动的pitch(俯仰角)、yaw(偏航角)和roll(翻滚角),如下图所示: