1. 相机标定之坐标系转换
在进行相机标定的时候需要涉及到几个坐标系需要明确一下:
-
世界坐标系:即物体在真实的物理环境所在坐标系。
-
相机坐标系:即以相机的的中心点为原点而建立的坐标系。相机的光轴通过该原点,且为该坐标系的Z轴
-
图像坐标系:即所获得的图像所在的坐标系,图像的中心即为该坐标系的原点
需要注意的是,相机的光轴也通过图像坐标系的原点
-
像素坐标系:即以图像的左上角(或者左下角)为原点的坐标系
需要注意的是,像素坐标系中的点,以像素来表示,而非距离单位
像素坐标系与图像坐标系均在像平面上
笔者认为,相机标定的目的就是:将世界坐标系通过平移转换,最后与像素坐标系重合。
下图为上述坐标系之间的关系:
其中点X为相机坐标系下的现实世界中的点
有些困惑的地方在于,为何相机坐标系原点到图像坐标系的原点之间的距离为一倍焦距??
我在阅读论文《基于机器视觉和激光雷达的割草机前方障碍物检测》-冯吉,一文时,其中写道“小孔相机模型聚焦的中心点为相机坐标系原点”,我以为是作者笔误。可阅读了其他相关文章后,譬如《相机标定》链接一文中,也明确指出此处距离为一倍焦距。
但,根据相机的成像原理,相机得到的像应该在一倍焦距到二倍焦距之间。而且更有一个明显的不解之处为:像平面和和实体竟然在同一侧,众所周知,相机成的像应当在透镜的另一侧且应当为倒立的像。
唯一可以解释的就是,或许我将相机的坐标系定在了透镜所在位置,导致我的思路出现了错误。
但是,如果真如我所说,那相机的真是坐标系又在哪里?
姑且抛开这个问题不谈。
在读了其他资料之后,终于搞明白了这一点。不过不得不说,网上资料太多,很容易看花眼,而且很多资料都说的不够清楚,需要自己好好琢磨。关于相机的标定中坐标的转换,比较推荐《相机标定:从世界坐标系到图像像素坐标系转换过程解析》链接
相机的坐标系确实是建立在透镜的位置,即光心的位置。而我们在上文中所提到的图像坐标系和像素坐标系则是建立在虚拟像平面上的,而非真实的像平面上。在虚拟像平面上所得到的像是与真实像平面上所得到的像是等大的,且方向相反。
而且,这里需要明确指出,这里所指的焦距f并非透镜的焦距,而是指相机的焦距,二者不能混为一谈为何要利用虚拟像平面?
正如上文提到的,相机成的像是倒立的像,因此采用虚拟像平面则能够得到正立的像,方便进行坐标转换和计算。(个人认为)
1.1世界坐标系到相机坐标系的转换
世界坐标系是一个三维的坐标系,其到相机的坐标系的转换包括一个平移动作和旋转动作。即将世界坐标系的坐标原点,经过x轴,y轴,z轴的平移,使其到相机坐标系的原点,然后将视觉坐标系绕原点进行一定的旋转,使其与相机坐标系重合。
为何要考虑旋转:相机在世界坐标中并非与世界坐标轴相平行,即x轴平行于世界坐标系的x轴,y轴平行于世界坐标系的y轴等等。需要考虑到相机的倾斜和角度问题,因此需要考虑到旋转。
这就是一个三维坐标系到三维坐标系的转换问题。
此时便可以理解“点X是相机坐标系下的现实世界中的点”这句话了。因为二者都是三维坐标系,点X可以处于两个坐标系中,只是相对不同的坐标系,所得到的坐标不同
假设该点X,其在世界坐标系中的坐标为
(
x
w
,
y
w
,
z
w
)
(x_w,y_w,z_w)
(xw,yw,zw)
在相机坐标系中的坐标为
(
X
c
,
Y
c
,
Z
c
)
(X_c,Y_c,Z_c)
(Xc,Yc,Zc)
根据线性代数知识很容易得到如下的公式:
[
X
c
Y
c
Z
c
]
=
R
∗
(
[
x
w
y
w
z
w
]
−
C
)
\left[\begin{array}{ccccc} X_c\\ Y_c\\ Z_c \end{array}\right] =R*( \left[\begin{array}{ccccc} x_w\\ y_w\\ z_w \end{array}\right]-C)
⎣⎡XcYcZc⎦⎤=R∗(⎣⎡xwywzw⎦⎤−C)
其中C为平移矩阵;R为旋转矩阵。
旋转矩阵的计算,在读到文章中都没有提及如何计算,或许在日后的标定工作中,标定所使用的算法或者软件会对旋转矩阵自动进行计算,且等到日后进行补充说明。
1.2相机坐标系到图像坐标系的转换
相机坐标系到图像坐标系的转换是从三维坐标系到二维坐标系的转换。
从坐标系关系图的右图可以看出,相机坐标系与图像坐标系之间的关系。根据相似三角形的原理,很容易得到如下的数学公式:
X
c
/
x
i
=
Z
c
/
f
=
=
=
=
>
x
i
=
X
c
∗
f
/
Z
c
X_c/x_i=Z_c/f ====>x_i=X_c*f/Z_c
Xc/xi=Zc/f====>xi=Xc∗f/Zc
Y
c
/
y
i
=
Z
c
/
f
=
=
=
=
>
y
i
=
Y
c
∗
f
/
Z
c
Y_c/y_i=Z_c/f====>y_i=Y_c*f/Z_c
Yc/yi=Zc/f====>yi=Yc∗f/Zc这便实现了从相机坐标系
(
X
c
,
Y
c
)
(X_c,Y_c)
(Xc,Yc)到图像坐标系
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)的转换。
1.3图像坐标系到像素坐标系的转换
图像坐标系到像素坐标系的转换是二维坐标系的平移。
如下图为,图像坐标系和像素坐标系的关系
图像坐标系为:
(
O
,
x
,
y
)
(O,x,y)
(O,x,y)
像素坐标系为:
(
P
o
,
P
x
,
P
y
)
(P_o,P_x,P_y)
(Po,Px,Py)
已知图像坐标系的原点在像素坐标系中的位置为:
(
P
x
,
P
y
)
(P_x,P_y)
(Px,Py)
需要注意的是,图像坐标系的原点在像素坐标系中是用像素点来表示的,但是我们这里仍旧使用的是距离单位,即Px,Py图像坐标原点到像素坐标原点之间的实际物理距离。在这里的计算暂时不考虑单位的转换。
图像坐标系中一点的坐标为:
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)
我们所要做的就是求其在像素坐标系中的坐标。通过简单的平移转换即可得到该点在像素坐标系中的坐标
(
P
x
i
,
P
y
i
)
(P_{x_i},P_{y_i})
(Pxi,Pyi):
P
x
i
=
x
i
+
P
x
,
P
y
i
=
y
i
+
P
y
P_{x_i}=x_i+P_x, P_{y_i}=y_i+P_y
Pxi=xi+Px,Pyi=yi+Py
1.4世界坐标系到像素坐标系
综上所述:
该点X,其在世界坐标系中的坐标为:
(
x
w
,
y
w
,
z
w
)
(x_w,y_w,z_w)
(xw,yw,zw)
其在相机坐标系中的坐标为:
(
X
c
,
Y
c
,
Z
c
)
(X_c,Y_c,Z_c)
(Xc,Yc,Zc)
其在图像坐标系中的坐标为:
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)
其在像素坐标系中的坐标为:
(
P
x
i
,
P
y
i
)
(P_{x_i},P_{y_i})
(Pxi,Pyi)
根据上述的坐标转换得到如下方程组:
该方程组可解出相机坐标系到像素坐标系下的转换矩阵:
{
x
i
=
X
c
∗
f
/
Z
c
y
i
=
Y
c
∗
f
/
Z
c
P
x
i
=
x
i
+
P
x
P
y
i
=
y
i
+
P
y
\left\{ \begin{array}{c} x_i=X_c*f/Z_c\\ y_i=Y_c*f/Z_c\\ P_{x_i}=x_i+P_x\\ P_{y_i}=y_i+P_y \end{array}\right.
⎩⎪⎪⎨⎪⎪⎧xi=Xc∗f/Zcyi=Yc∗f/ZcPxi=xi+PxPyi=yi+Py
[
P
x
i
P
y
i
]
=
[
x
i
+
P
x
y
i
+
P
y
]
\left[\begin{array}{ccccc} P_{x_i}\\ P_{y_i} \end{array}\right]= \left[\begin{array}{ccccc} x_i+P_x\\ y_i+P_y \end{array}\right]
[PxiPyi]=[xi+Pxyi+Py]
[
P
x
i
P
y
i
]
=
[
X
c
∗
f
/
Z
c
+
P
x
Y
c
∗
f
/
Z
c
+
P
y
]
−
−
−
−
−
−
−
−
−
−
−
−
−
①
\left[\begin{array}{ccccc} P_{x_i}\\ P_{y_i} \end{array}\right]= \left[\begin{array}{ccccc} X_c*f/Z_c+P_x\\ Y_c*f/Z_c+P_y \end{array}\right] -------------①
[PxiPyi]=[Xc∗f/Zc+PxYc∗f/Zc+Py]−−−−−−−−−−−−−①上述公式①可表示为如下的矩阵形式:
[
P
x
i
P
y
i
]
=
[
f
/
Z
c
0
P
x
/
Z
c
0
f
/
Z
c
P
y
/
Z
c
]
∗
[
X
c
Y
c
Z
c
]
\left[\begin{array}{ccccc} P_{x_i}\\ P_{y_i} \end{array}\right]=\left[ \begin{array}{ccccc} f/Z_c&0&P_x/Z_c\\ 0&f/Z_c&P_y/Z_c \end{array}\right]* \left[\begin{array}{ccccc} X_c\\ Y_c\\ Z_c \end{array}\right]
[PxiPyi]=[f/Zc00f/ZcPx/ZcPy/Zc]∗⎣⎡XcYcZc⎦⎤两边同时乘以Zc可以得到:
[
P
x
i
∗
Z
c
P
y
i
∗
Z
c
]
=
[
f
0
P
x
0
f
P
y
]
∗
[
X
c
Y
c
Z
c
]
−
−
−
−
−
−
−
−
−
②
\left[\begin{array}{ccccc} P_{x_i}*Z_c\\ P_{y_i}*Z_c \end{array}\right]=\left[ \begin{array}{ccccc} f&0&P_x\\ 0&f&P_y \end{array}\right]* \left[\begin{array}{ccccc} X_c\\ Y_c\\ Z_c \end{array}\right]---------②
[Pxi∗ZcPyi∗Zc]=[f00fPxPy]∗⎣⎡XcYcZc⎦⎤−−−−−−−−−②
此时仍要记得,我们所使用的仍旧是距离单位,还没有将其转换成像素
世界坐标到相机坐标的转换公式如下:
[
X
c
Y
c
Z
c
]
=
R
∗
(
[
x
w
y
w
z
w
]
−
C
)
\left[\begin{array}{ccccc} X_c\\ Y_c\\ Z_c \end{array}\right] =R*( \left[\begin{array}{ccccc} x_w\\ y_w\\ z_w \end{array}\right]-C)
⎣⎡XcYcZc⎦⎤=R∗(⎣⎡xwywzw⎦⎤−C)将其带入到矩阵②中,则可以得到世界坐标系到像素坐标系的转换关系:
[
P
x
i
∗
Z
c
P
y
i
∗
Z
c
]
=
[
f
0
P
x
0
f
P
y
]
∗
R
∗
(
[
x
w
y
w
z
w
]
−
C
)
\left[\begin{array}{ccccc} P_{x_i}*Z_c\\ P_{y_i}*Z_c \end{array}\right]=\left[ \begin{array}{ccccc} f&0&P_x\\ 0&f&P_y \end{array}\right]*R*( \left[\begin{array}{ccccc} x_w\\ y_w\\ z_w \end{array}\right]-C)
[Pxi∗ZcPyi∗Zc]=[f00fPxPy]∗R∗(⎣⎡xwywzw⎦⎤−C)
最后一步就是要进行单位的变换,将距离单位转换为像素单位。假设一个单位距离沿x轴上能够转换为M个像素块,而沿y轴则可以转换成N个像素块。
此处需要明确,并不是所有的像素块都是正方形,所以沿不同方向的像素块数量不同。
则可以使用如下公式来进行单位变换。其中Q为转换的像素矩阵
[
P
x
i
∗
Z
c
P
y
i
∗
Z
c
]
=
Q
∗
[
f
0
P
x
0
f
P
y
]
∗
R
∗
(
[
x
w
y
w
z
w
]
−
C
)
\left[\begin{array}{ccccc} P_{x_i}*Z_c\\ P_{y_i}*Z_c \end{array}\right]=Q* \left[ \begin{array}{ccccc}f&0&P_x\\ 0&f&P_y\end{array} \right]*R*( \left[\begin{array}{ccccc} x_w\\ y_w\\ z_w \end{array}\right]-C)
[Pxi∗ZcPyi∗Zc]=Q∗[f00fPxPy]∗R∗(⎣⎡xwywzw⎦⎤−C)
Q
=
[
M
0
0
N
]
Q = \left[\begin{array}{ccccc} M&0\\ 0&N\\ \end{array}\right]
Q=[M00N]
[
P
x
i
∗
Z
c
P
y
i
∗
Z
c
]
=
[
M
0
0
N
]
∗
[
f
0
P
x
0
f
P
y
]
∗
R
∗
(
[
x
w
y
w
z
w
]
−
C
)
\left[\begin{array}{ccccc} P_{x_i}*Z_c\\ P_{y_i}*Z_c \end{array}\right]= \left[\begin{array}{ccccc} M&0\\ 0&N\\ \end{array}\right]* \left[ \begin{array}{ccccc} f&0&P_x\\ 0&f&P_y\end{array} \right]*R*( \left[\begin{array}{ccccc} x_w\\ y_w\\ z_w \end{array}\right]-C)
[Pxi∗ZcPyi∗Zc]=[M00N]∗[f00fPxPy]∗R∗(⎣⎡xwywzw⎦⎤−C)计算上述矩阵式可得:
[
P
x
i
∗
Z
c
P
y
i
∗
Z
c
]
=
[
M
∗
f
0
M
∗
P
x
0
N
∗
f
N
∗
P
y
]
∗
R
∗
(
[
x
w
y
w
z
w
]
−
C
)
−
−
−
−
−
−
−
③
\left[\begin{array}{ccccc} P_{x_i}*Z_c\\ P_{y_i}*Z_c \end{array}\right]= \left[ \begin{array}{ccccc} M*f&0&M*P_x\\ 0&N*f&N*P_y \end{array} \right]*R*( \left[\begin{array}{ccccc} x_w\\ y_w\\ z_w \end{array}\right]-C)-------③
[Pxi∗ZcPyi∗Zc]=[M∗f00N∗fM∗PxN∗Py]∗R∗(⎣⎡xwywzw⎦⎤−C)−−−−−−−③
至此就实现了从世界坐标系到像素坐标系的转换,且此时所得到的点的坐标的单位是像素。
反复考校计算公式,真的是头都大了,由于《相机标定》链接一文中并没有明确提及到Zc这一要素,因此在阅读文章时要注意。
而且始终不是很明白,所参考到的资料中,他们都会将上述用到的矩阵通过0和1来补全成方阵,而且将坐标系下方补充一个1,如公式④。
[ P x i ∗ Z c P y i ∗ Z c Z c ] = [ M ∗ f 0 M ∗ P x 0 N ∗ f N ∗ P y 0 0 1 ] ∗ ( R ∣ − R C ) ∗ [ x w y w z w 1 ] − − − − − − − ④ \left[\begin{array}{ccccc} P_{x_i}*Z_c\\ P_{y_i}*Z_c\\ Z_c \end{array}\right]= \left[ \begin{array}{ccccc} M*f&0&M*P_x\\ 0&N*f&N*P_y\\ 0&0&1 \end{array} \right]*(R|-RC)* \left[\begin{array}{ccccc} x_w\\ y_w\\ z_w\\ 1 \end{array}\right]-------④ ⎣⎡Pxi∗ZcPyi∗ZcZc⎦⎤=⎣⎡M∗f000N∗f0M∗PxN∗Py1⎦⎤∗(R∣−RC)∗⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤−−−−−−−④
反复比较那些坐标补充1的矩阵式,终于明白了为何要补充1。这个操作被称为从欧式坐标到齐次坐标的转换。如上式③中,R,C均为相机的外参数,人们在计算时希望能够将其整合到一个矩阵中,同时也为了消除公式中的减法计算,因此做了如下的变换,将R,C合并到统一个矩阵中。我们看上述③式的右半部分:
R ∗ ( [ x w y w z w ] − C ) = = = = = = = = > ( R ∣ − R C ) ∗ [ x w y w z w 1 ] R*( \left[\begin{array}{ccccc} x_w\\ y_w\\ z_w \end{array}\right]-C)========>(R|-RC)* \left[\begin{array}{ccccc} x_w\\ y_w\\ z_w\\ 1 \end{array}\right] R∗(⎣⎡xwywzw⎦⎤−C)========>(R∣−RC)∗⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤ 将R矩阵转换成带有-Rc的增广矩阵,因此需要将坐标补充一个1,计算两边的结果可以发现是一样的.此时补充了1的坐标被称为世界坐标系下一点的齐次坐标。
这种计算方法带来的好处就是,简化了公式的复杂度。
让我们重新来计算一下。首先转化公式② [ P x i ∗ Z c P y i ∗ Z c ] = [ f 0 P x 0 f P y ] ∗ [ X c Y c Z c ] = = = = = > [ P x i ∗ Z c P y i ∗ Z c Z c ] = [ f 0 P x 0 0 f P y 0 0 0 1 0 ] ∗ [ X c Y c Z c 1 ] \left[\begin{array}{ccccc} P_{x_i}*Z_c\\ P_{y_i}*Z_c \end{array}\right]= \left[ \begin{array}{ccccc} f&0&P_x\\ 0&f&P_y \end{array} \right]* \left[\begin{array}{ccccc} X_c\\ Y_c\\ Z_c \end{array}\right]=====> \left[\begin{array}{ccccc} P_{x_i}*Z_c\\ P_{y_i}*Z_c\\ Z_c \end{array}\right]=\left[ \begin{array}{ccccc} f&0&P_x&0\\ 0&f&P_y&0\\ 0&0&1&0 \end{array} \right]* \left[\begin{array}{ccccc} X_c\\ Y_c\\ Z_c\\ 1 \end{array}\right] [Pxi∗ZcPyi∗Zc]=[f00fPxPy]∗⎣⎡XcYcZc⎦⎤=====>⎣⎡Pxi∗ZcPyi∗ZcZc⎦⎤=⎣⎡f000f0PxPy1000⎦⎤∗⎣⎢⎢⎡XcYcZc1⎦⎥⎥⎤
如上式所示,将右边的坐标补1,得到相机坐标系下的齐次坐标,其左边乘的矩阵就要相应的变化,相乘计算的结果也会变化,多出来一个Zc。同样的,将世界坐标系转换到相机坐标系的公式也要进行相应的变化。
[ X c Y c Z c 1 ] = [ R − R C 0 1 ] ∗ [ x w y w z w 1 ] \left[\begin{array}{ccccc} X_c\\ Y_c\\ Z_c\\ 1 \end{array}\right]= \left[ \begin{array}{ccccc} R&-RC\\ 0&1 \end{array}\right]* \left[ \begin{array}{ccccc} x_w\\ y_w\\ z_w\\ 1 \end{array}\right] ⎣⎢⎢⎡XcYcZc1⎦⎥⎥⎤=[R0−RC1]∗⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤
于是就有了如下公式:
[ P x i ∗ Z c P y i ∗ Z c Z c ] = [ f 0 P x 0 0 f P y 0 0 0 1 0 ] ∗ [ R − R C 0 1 ] ∗ [ x w y w z w 1 ] \left[\begin{array}{ccccc} P_{x_i}*Z_c\\ P_{y_i}*Z_c\\ Z_c \end{array}\right]=\left[ \begin{array}{ccccc} f&0&P_x&0\\ 0&f&P_y&0\\ 0&0&1&0 \end{array}\right]* \left[\begin{array}{ccccc} R&-RC\\0&1 \end{array}\right] *\left [\begin{array}{ccccc} x_w\\y_w\\z_w\\1 \end{array}\right] ⎣⎡Pxi∗ZcPyi∗ZcZc⎦⎤=⎣⎡f000f0PxPy1000⎦⎤∗[R0−RC1]∗⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤
之后进行像素单位的转换:
[ P x i ∗ Z c P y i ∗ Z c Z c ] = [ M 0 0 0 N 0 0 0 1 ] ∗ [ f 0 P x 0 0 f P y 0 0 0 1 0 ] ∗ [ R − R C 0 1 ] ∗ [ x w y w z w 1 ] \left[\begin{array}{ccccc} P_{x_i}*Z_c\\ P_{y_i}*Z_c\\ Z_c \end{array}\right]= \left[\begin{array}{ccccc} M&0&0\\ 0&N&0\\ 0&0&1 \end{array}\right]* \left[ \begin{array}{ccccc}f&0&P_x&0\\ 0&f&P_y&0\\ 0&0&1&0 \end{array}\right]* \left[\begin{array}{ccccc}R&-RC\\0&1\end{array}\right]*\left[\begin{array}{ccccc}x_w\\y_w\\z_w\\1\end{array}\right] ⎣⎡Pxi∗ZcPyi∗ZcZc⎦⎤=⎣⎡M000N0001⎦⎤∗⎣⎡f000f0PxPy1000⎦⎤∗[R0−RC1]∗⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤于是上述③式就转变成了
[ P x i ∗ Z c P y i ∗ Z c Z c ] = [ M ∗ f 0 M ∗ P x 0 0 N ∗ f N ∗ P y 0 0 0 1 0 ] ∗ [ R − R C 0 1 ] ∗ [ x w y w z w 1 ] \left[\begin{array}{ccccc} P_{x_i}*Z_c\\ P_{y_i}*Z_c\\ Z_c \end{array}\right]= \left[ \begin{array}{ccccc}M*f&0&M*P_x&0\\ 0&N*f&N*P_y&0\\ 0&0&1&0 \end{array}\right]* \left[\begin{array}{ccccc}R&-RC\\0&1\end{array}\right]*\left[\begin{array}{ccccc}x_w\\y_w\\z_w\\1\end{array}\right] ⎣⎡Pxi∗ZcPyi∗ZcZc⎦⎤=⎣⎡M∗f000N∗f0M∗PxN∗Py1000⎦⎤∗[R0−RC1]∗⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤
该矩阵方程仍可以进一步化简,我们知道,上述矩阵中的一列0对计算并没有任何帮助,它的存在仅仅是为了满足在转换过程中两个矩阵的对应形式。我们现在再来看右侧的三个矩阵,分别是3×4,4×4,4×1的形式。其实如果不影响结果的话,可以转换成3×3,3×4,4×1的形式。通过计算可以得到,上述的转变对于上式的结果并没有影响。于是就得到了④式:
[ P x i ∗ Z c P y i ∗ Z c Z c ] = [ M ∗ f 0 M ∗ P x 0 N ∗ f N ∗ P y 0 0 1 ] ∗ ( R ∣ − R C ) ∗ [ x w y w z w 1 ] − − − − − − − ④ \left[\begin{array}{ccccc} P_{x_i}*Z_c\\ P_{y_i}*Z_c\\ Z_c \end{array}\right]= \left[ \begin{array}{ccccc} M*f&0&M*P_x\\ 0&N*f&N*P_y\\ 0&0&1 \end{array} \right]*(R|-RC)* \left[\begin{array}{ccccc} x_w\\ y_w\\ z_w\\ 1 \end{array}\right]-------④ ⎣⎡Pxi∗ZcPyi∗ZcZc⎦⎤=⎣⎡M∗f000N∗f0M∗PxN∗Py1⎦⎤∗(R∣−RC)∗⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤−−−−−−−④这里的到的坐标被称为像素坐标系下的齐次坐标。三维齐次坐标转换成二维欧式坐标,只需要除去齐次坐标的第三维数据就好了。这样的话我们在计算的时候就不用刻意去担心 Z c Z_c Zc对计算结果的影响了。 [ P x i ∗ Z c P y i ∗ Z c Z c ] = = = = = = = = = = > [ P x i P y i ] \left[\begin{array}{ccccc} P_{x_i}*Z_c\\ P_{y_i}*Z_c\\ Z_c \end{array}\right] ==========> \left[\begin{array}{ccccc} P_{x_i}\\ P_{y_i}\\ \end{array}\right] ⎣⎡Pxi∗ZcPyi∗ZcZc⎦⎤==========>[PxiPyi]但个人觉得这个表达形式虽然工整简洁,不过并没有③式那么让人容易理解。
这相当于对整个矩阵转换的又一次推导了,至此,坐标转换完结撒花✿✿ヽ(°▽°)ノ✿。
令上述④式中:
K
=
[
M
∗
f
0
M
∗
P
x
0
N
∗
f
N
∗
P
y
0
0
1
]
K=\left[ \begin{array}{ccccc} M*f&0&M*P_x\\ 0&N*f&N*P_y\\ 0&0&1 \end{array}\right]
K=⎣⎡M∗f000N∗f0M∗PxN∗Py1⎦⎤
式中的四个参数即为相机的内参;而矩阵R和C则为相机的外参。
我们需要知道的是,实际上由于制作工艺等的误差,可能会使像素坐标系的x轴和y轴之间的夹角并非一定是90°,而这个夹角将会对我们所求得的像素坐标系中的坐标产生影响,因此需要对内参矩阵进行一定量的修正。
我们把像素坐标系的x轴和y轴之间的夹角设定为θ。
内参矩阵修正为:
K
=
[
M
∗
f
−
M
∗
f
∗
c
o
t
θ
M
∗
P
x
0
N
∗
f
/
s
i
n
θ
N
∗
P
y
0
0
1
]
K=\left[ \begin{array}{ccccc} M*f&-M*f*cotθ&M*P_x\\ 0&N*f/sinθ&N*P_y\\ 0&0&1 \end{array}\right]
K=⎣⎡M∗f00−M∗f∗cotθN∗f/sinθ0M∗PxN∗Py1⎦⎤
公式中始终消不去相机坐标系中的参数 Z c Z_c Zc,但其可以通过世界坐标系到相机坐标系的计算求得,不过也可以将带有 Z c Z_c Zc的坐标视为像素坐标系下一点的齐次坐标
且在本节中并没有讨论相机的畸变问题,留到下节