opencv相机标定和人头姿态估计案例
Posted 风翼冰舟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv相机标定和人头姿态估计案例相关的知识,希望对你有一定的参考价值。
前言
头部驱动除了之前关注的表情驱动外,还有眼球驱动和头部方向驱动。本博客基于opencv官方文档和部分开源代码来研究如何基于人脸关键点获取头部的朝向。
国际惯例,参考博客:
opencv:Camera Calibration and 3D Reconstruction
opencv:Real Time pose estimation of a textured object
Python cv2.decomposeProjectionMatrix方法代码示例
Face-Yaw-Roll-Pitch-from-Pose-Estimation-using-OpenCV
相机标定理论
几种坐标系
先看从opencv
官网中扒下来的两幅图,代表针孔相机模型(pinhole camera model
)
其中涉及到几种坐标系:
- 世界坐标系:一个固定不变的坐标系,原点通常固定不变,右图的 w w w坐标系
- 相机坐标系:相机在世界坐标系下的姿态,右图的 c c c坐标系
- 图像坐标系:成像平面,图中的
x-y
坐标轴,其原点是相机的光轴与成像平面的胶垫 - 像素坐标系:最终图像,图中的
u-v
坐标轴,原点在左上角,就跟opencv输出的图片一样,左上角代表 ( 0 , 0 ) (0,0) (0,0)像素位置。
图像坐标系和像素坐标系横轴和纵轴方向一致,但是单位不同,一个是物理单位,一个是像素单位,一般有一个对应的缩放关系,代表一个像素在成像平面上的大小。
针孔相机的目标就是把3D坐标点
P
w
P_w
Pw利用透视变换(perspective transformation
)投影到图像平面上,得到对应像素
p
p
p。其中
P
w
P_w
Pw和
p
p
p都在齐次坐标系下表示。
无畸变情况下,针孔相机的投影变换可以表示为:
s
p
=
A
[
R
∣
t
]
P
w
s\\ p=A[R|t]P_w
s p=A[R∣t]Pw
其中
P
w
P_w
Pw为世界坐标系下的3D坐标点,
p
p
p是图像平面上的2D像素点,
A
A
A是相机内参矩阵,
R
R
R和
t
t
t分别描述了世界坐标系到相机坐标系的旋转和平移变换,
s
s
s是任意尺度的投影变换(非相机模型的参数,其实就是图像坐标系到像素坐标系的变换系数)。
世界坐标系到相机坐标系
旋转-平移矩阵
[
R
∣
t
]
[R|t]
[R∣t]是投影变换(projective transformation
)和齐次变换(homogeneous transformation
)的乘积。
维度为
(
3
,
4
)
(3,4)
(3,4)投影变换可以将相机坐标系里的3D坐标映射到成像平面的2D坐标,并且在归一化的相机坐标系
x
′
=
X
c
Z
c
x'=\\fracX_cZ_c
x′=ZcXc和
y
′
=
Y
c
Z
c
y'=\\fracY_cZ_c
y′=ZcYc下表示出来 以上是关于opencv相机标定和人头姿态估计案例的主要内容,如果未能解决你的问题,请参考以下文章
Z
c
[
x
′
y
′
1
]
=
[
1
0
0
0
0
1
0
0
0
0
1
0
]
[
X
c
Y
c
Z
c
1
]
Z_c\\beginbmatrix x'\\\\ y'\\\\1 \\endbmatrix=\\beginbmatrix 1&0&0&0\\\\ 0&1&0&0\\\\ 0&0&1&0 \\endbmatrix\\beginbmatrix X_c\\\\Y_c\\\\Z_c\\\\1 \\endbmatrix
Zc⎣⎡x′y′1⎦⎤=⎣⎡100010001000⎦⎤⎣⎢⎢⎡XcYcZc1⎦⎥⎥⎤
而齐次变换通常在相机外参
R
R
R和
t
t
t中体现出来,代表世界坐标系到相机坐标系的变换,因此给定一个世界坐标系下的点
P
w
P_w
Pw,那么相机坐标系下的对应点为:
P
c
=
[
R
t
0
1
]
P
w
P_c=\\beginbmatrix R&t\\\\0&1 \\endbmatrixP_w
Pc=[R0t1]Pw
这个齐次变换一般就是由一个(3,3)的旋转矩阵和一个(3,1)的平移向量组成:
[
R
t
0
1
]
=
[
r
11
r
12
r
13
t
x
r
21
r
22
r
23
t
y
r
31
r
32
r
33
t
z
0
0
0
1
]
\\beginbmatrix R&t\\\\0&1 \\endbmatrix=\\beginbmatrix r_11&r_12&r_13&t_x\\\\ r_21&r_22&r_23&t_y\\\\ r_31&r_32&r_33&t_z\\\\ 0&0&0&1 \\endbmatrix
[R0t1]=⎣⎢⎢⎡r11r21r310r12r22r320r13r23r330txtytz1⎦⎥⎥⎤
因此
[
X
c
Y
c
Z
c
1
]
=
[
r
11
r
12
r
13
t
x