一、相机模型
1、简介
初中物理我们就学过小孔成像问题,这也是我们对相机的最初认识。
仅靠一个小孔进光量太小,拍摄到的照片会很暗,所以实际的相机会使用凸透镜来聚光。但是凸透镜的光学模型过于复杂,通常会简化成针孔相机模型来解释成像过程并进行建模。
这时出现了一个疑问,小孔成像成倒立的像,而照片的方向却是正常的?
原因在于相机内部会对所成的像再进行一次镜像,所以用户看到的图像就跟人眼看到的方向一致了,我们可以把这一过程等效成把成像平面放到相机前方,示意图如下(之后为了直观,本文所说的成像平面均为镜像过后的等效成像平面)。
列出几个重要名词,通过下图可以简单建立下概念,后边再细品
- 世界坐标系
o
w
−
x
w
−
y
w
−
z
w
o_w-x_w-y_w-z_w
ow−xw−yw−zw:世界坐标系不是一个有明确定义的坐标系,你可以任意指定一个在
当前场景下固定不变的坐标系
作为世界坐标系。 - 相机坐标系
o
c
−
x
c
−
y
c
−
z
c
o_c-x_c-y_c-z_c
oc−xc−yc−zc:相机坐标系习惯上这样定义:以相机光心为坐标系原点;假设你在手持相机,那么你的右手边是
x轴
正方向,下边是y轴
正方向,相机前方是z轴
正方向,也就是说,拍摄的远处物体距离为正。 - 图像坐标系
o
i
−
x
i
−
y
i
o_i-x_i-y_i
oi−xi−yi:图像坐标系的原点就位于感光芯片的中心(感光芯片是位于镜头背后的用于成像的小板子),
x、y轴
方向和相机坐标系x、y
相同,不同的是图像坐标系是二维坐标系没有z轴
。
- 像素坐标系 o p − x p − y p o_p-x_p-y_p op−xp−yp:像素坐标系也位于成像平面上,是图像坐标系通过平移和缩放的到的。值得注意的是不同软件或者库对于像素坐标 ( u , v ) (u,v) (u,v)的定义不一样,比如OpenCV中把 u u u定义为行坐标, v v v定义为列坐标,与我们这里的定义就不太一样。所以使用前需要统一像素坐标的定义。
2、针孔相机模型
P
c
P_c
Pc点是相机坐标系下坐标,
P
i
P_i
Pi是图像坐标系下坐标,
Z
c
Z_c
Zc是
P
c
P_c
Pc点距离光心的距离,
f
f
f是镜头的焦距,
X
c
X_c
Xc和
X
i
X_i
Xi是点在
x
x
x轴投影距离原点的距离,是正值。
根据相似三角形原理可得:
Z
c
f
=
−
X
c
X
i
=
−
Y
c
Y
i
(
1
)
\frac{Z_{c}}{f}=-\frac{X_{c}}{X_i}=-\frac{Y_{c}}{Y_i} (1)
fZc=−XiXc=−YiYc(1)
回忆前文提到的等效成像平面,我们这里再强化一下这个概念,将
P
′
P'
P′镜像到镜头前方
于是可以将(1)式中的负号去掉
Z
c
f
=
X
c
X
i
=
Y
c
Y
i
(
2
)
\frac{Z_{c}}{f}=\frac{X_{c}}{X_i}=\frac{Y_{c}}{Y_i} (2)
fZc=XiXc=YiYc(2)
二、相机内参
内参矩阵描述的是相机坐标系下的坐标到像素坐标的变换关系
1.相机坐标-图像坐标
利用
(
2
)
(2)
(2)式,很容易可以得出二者的转换关系。
{
X
i
=
f
Z
c
X
c
Y
i
=
f
Z
c
Y
c
(
3
)
\left\{ \begin{aligned} X_i=\frac{f}{Z_{c}}X_{c}\\ Y_i=\frac{f}{Z_{c}}Y_{c} \end{aligned} \right. (3)
⎩
⎨
⎧Xi=ZcfXcYi=ZcfYc(3)
2.图像坐标-像素坐标
图像坐标是实连续值,而像素坐标是离散的正值,经过简单的平移和尺度缩放,很容易得到二者之间的转换关系如下:
{
u
=
α
X
i
+
c
x
v
=
β
Y
i
+
c
y
(
4
)
\left\{ \begin{aligned} u=\alpha X_i+c_x\\ v=\beta Y_i+c_y \end{aligned} \right. (4)
{u=αXi+cxv=βYi+cy(4)
α \alpha α、 β \beta β与实际传感器的物理尺寸有关,单位为 p i x e l / m pixel/m pixel/m ; X i X_i Xi、 Y i Y_i Yi单位为 m m m; c x c_x cx、 c y c_y cy单位为 p i x e l pixel pixel。
3.相机坐标-像素坐标
用
(
3
)
(3)
(3)式,将
X
i
,
Y
i
X_i,Y_i
Xi,Yi用
X
,
Y
,
Z
X,Y,Z
X,Y,Z替换,得到像素坐标与相机坐标系下坐标的关系
{
u
=
f
x
X
c
Z
c
+
c
x
v
=
f
y
Y
c
Z
c
+
c
y
(
5
)
\left\{ \begin{aligned} u=f_x \frac{X_{c}}{Z_{c}}+c_x\\ v=f_y \frac{Y_{c}}{Z_{c}}+c_y \end{aligned} \right.(5)\\
⎩
⎨
⎧u=fxZcXc+cxv=fyZcYc+cy(5)
为了表达更加漂亮,引入齐次坐标
(
u
v
1
)
=
1
Z
c
(
f
x
0
c
x
0
f
y
c
y
0
0
1
)
(
X
c
Y
c
Z
c
)
(
6
)
\left( \begin{matrix} u\\ v\\ 1 \end{matrix} \right) =\frac{1}{Z_c} \left( \begin{matrix} f_x&0&c_x\\ 0&f_y&c_y\\ 0&0&1\\ \end{matrix} \right) \left( \begin{matrix} X_{c}\\ Y_{c}\\ Z_{c} \end{matrix} \right)(6)
uv1
=Zc1
fx000fy0cxcy1
XcYcZc
(6)
Z
c
(
u
v
1
)
=
K
P
c
(
7
)
Z_c \left( \begin{matrix} u\\ v\\ 1 \end{matrix} \right)=KP_{c}(7)
Zc
uv1
=KPc(7)
为了避免混淆,一些参考材料会使用
s
s
s来代替
Z
c
Z_c
Zc,注意他们意思是一样的
思考:
- 观察(6)式可以发现,由于 1 Z c \displaystyle\frac{1}{Z_c} Zc1的存在,对相机坐标同时乘一个常数后的到的像素坐标是相同的。也就是说从光心发出的射线上的点,在图片里对应的像素坐标是相同的,即点的深度在投影过程中被丢失了。不用特殊手段,单目相机无法得到深度值。但如果给定距离,像素点对应的 P c P_{c} Pc就可唯一确定。
- 再重新处理一下(6)式
( u v 1 ) = ( f x 0 c x 0 f y c y 0 0 1 ) ( X c / Z c Y c / Z c 1 ) ( 8 ) \left( \begin{matrix} u\\ v\\ 1 \end{matrix} \right)= \left( \begin{matrix} f_x&0&c_x\\ 0&f_y&c_y\\ 0&0&1\\ \end{matrix} \right) \left( \begin{matrix} X_c/Z_c\\ Y_c/Z_c\\ 1 \end{matrix} \right)(8) uv1 = fx000fy0cxcy1 Xc/ZcYc/Zc1 (8)
可以认为像素坐标是对相机前方1处平面上的点采样和量化的过程,这个平面称为归一化平面,平面上点的坐标称为归一化坐标。
至此,我们推出了想要的结果!这个只和相机内部参数有关的矩阵
K
K
K即为相机的内参矩阵
K
=
(
f
x
0
c
x
0
f
y
c
y
0
0
1
)
(
7
)
K=\left( \begin{matrix} f_x&0&c_x\\ 0&f_y&c_y\\ 0&0&1\\ \end{matrix} \right)(7)
K=
fx000fy0cxcy1
(7)
有的时候还会引入一个
λ
\lambda
λ参数,来描述交轴误差(感光芯片的
X
,
Y
X,Y
X,Y轴没有完全垂直)
(
f
x
λ
c
x
0
f
y
c
y
0
0
1
)
\left( \begin{matrix} f_x&\lambda&c_x\\ 0&f_y&c_y\\ 0&0&1\\ \end{matrix} \right)
fx00λfy0cxcy1
注意:
- 感光芯片的最小单元一般不是严格的正方形,所以得到的 f x f_x fx和 f y f_y fy不一定相等。并且理论上 f x 、 f y 、 c x 、 c y f_x、f_y、c_x、c_y fx、fy、cx、cy应该是整数,但是最优化算出来的结果不一定是整数,影响不大。
- K一般会由相机生产商提供,如果没有提供则可以通过单目棋盘格张正友标定法确定,这个过程被称作内参标定。
- 实际使用中交轴误差好像很少被考虑
三、外参矩阵
外参矩阵描述的是世界坐标系下坐标与相机坐标系下坐标的转换关系,众所周知,两个坐标系之间的刚体变换可以通过旋转和平移描述,这里其实也没啥好说的。
1.世界坐标-相机坐标
(
X
c
Y
c
Z
c
)
=
[
R
t
]
(
X
w
Y
w
Z
w
1
)
(
8
)
\left( \begin{matrix} X_{c}\\ Y_{c}\\ Z_{c} \end{matrix} \right)=[R \ \ \ t] \left( \begin{matrix} X_{w}\\ Y_{w}\\ Z_{w}\\ 1 \end{matrix} \right) \ (8)
XcYcZc
=[R t]
XwYwZw1
(8)
P
c
=
[
R
t
]
P
w
~
P_c=[R \ \ \ t]\tilde{P_w}
Pc=[R t]Pw~
这里的
P
w
~
\tilde{P_w}
Pw~是齐次坐标,
P
w
~
=
[
P
w
1
]
T
\tilde{P_w}=[P_w \ \ 1]^T
Pw~=[Pw 1]T,
R
R
R是
3
×
3
3\times3
3×3的旋转矩阵,
t
t
t是
3
×
1
3\times1
3×1的平移向量,
R
R
R,
t
t
t称为相机的外参数。
这个地方如果不理解的,可以去搜索刚体变换,我这里就不写了
2.世界坐标-像素坐标
Z c P u v = Z c ( u v 1 ) = K [ R t ] P w ~ ( 9 ) Z_cP_{uv}=Z_c \left( \begin{matrix} u\\ v\\ 1 \end{matrix} \right)= K[R\ \ t]\tilde{P_w}(9) ZcPuv=Zc uv1 =K[R t]Pw~(9)
四、畸变系数
畸变系数也是相机内参的一部分,非理想情况下,存在以下问题:
-
透镜自身的形状会对光线传播产生影响——径向畸变
-
机械组装过程中,透镜和成像平面不可能完全平行——切向畸变
其中切向畸变影响很小;径向畸变最为常见,尤其是在照片的边缘上(可以拿出手机,把自己的脸调整到边缘上,看看有没有变形),效果如下:
1.畸变矫正
如果相机畸变比较明显,那么获得图像坐标后,要使用畸变系数进行矫正,数学模型如下:
径向:
X
i
c
=
X
i
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
Y
i
c
=
Y
i
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
X_{ic}=X_i(1+k_1r^2+k_2r^4+k_3r^6)\\ Y_{ic}=Y_i(1+k_1r^2+k_2r^4+k_3r^6)
Xic=Xi(1+k1r2+k2r4+k3r6)Yic=Yi(1+k1r2+k2r4+k3r6)
切向:
X
i
c
=
X
i
+
2
p
1
X
i
Y
i
+
p
2
(
r
2
+
2
X
i
2
)
Y
i
c
=
Y
i
+
p
1
(
r
2
+
2
Y
i
2
)
+
2
p
2
X
i
Y
i
X_{ic}=X_i+2p_1X_iY_i+p_2(r^2+2X_i^2)\\ Y_{ic}=Y_i+p_1(r^2+2Y_i^2)+2p_2X_iY_i
Xic=Xi+2p1XiYi+p2(r2+2Xi2)Yic=Yi+p1(r2+2Yi2)+2p2XiYi文章来源:https://www.toymoban.com/news/detail-729526.html
不同镜头畸变模型不太一样,比如鱼眼镜头和广角镜头都有,这个地方我平时用不到,引用一篇比较完整的总结常用相机投影及畸变模型(针孔|广角|鱼眼),感兴趣的可以去学习。文章来源地址https://www.toymoban.com/news/detail-729526.html
到了这里,关于相机内参、外参、畸变系数简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!