摘要
matlab把点坐标看作行向量,而《视觉SLAM十四讲》(以下简称《十四讲》)把点坐标看作列向量,因此它们把世界坐标系下的点投影到像素坐标系下时,使用的公式有所不同。这导致使用matlab标定得到相机的内外参矩阵,与高翔《视觉SLAM十四讲》所说的内外参矩阵格式不一致。要想得到正确的参数,还需要弄清楚matlab内外参矩阵的数据格式。
结论
先给出结论,简单来说以标定板左上角作为世界坐标系原点,uv方向作为世界坐标系的XY轴,有一下结论:
- matlab标定得到的相机内参矩阵(IntrinsicMatrix, K m a t l a b K_{matlab} Kmatlab),对应的是《十四讲》中的 K T K^T KT;
- matlab标定得到的旋转矩阵(RotationMatrices , R m a t l a b R_{matlab} Rmatlab),对应的是《十四讲》中的 R w c ( 3 × 3 ) R_{wc(3\times 3)} Rwc(3×3);
- matlab标定得到的平移向量(TranslationVectors, t m a t l a b t_{matlab} tmatlab),对应的是《十四讲》中的 t c w ( 1 × 3 ) T t_{cw(1\times 3)}^T tcw(1×3)T。
内容
约定: 以标定板左上角作为世界坐标系原点,uv方向作为世界坐标系的XY轴。下标 c c c 表示camera(相机)坐标系, 下标 w w w 表示world(世界)坐标系,例如: T c w ( 3 × 4 ) T_{cw(3\times 4)} Tcw(3×4) 表示在这个矩阵右边乘以world世界坐标系下的点,会得到camera相机坐标系下的点。
《十四讲》:《十四讲》里把点坐标看作列向量,其将世界坐标系下的点
[
X
Y
Z
1
]
\begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix}
⎣⎢⎢⎡XYZ1⎦⎥⎥⎤,投影到像素坐标系下的点
[
u
v
1
]
\begin{bmatrix} u \\ v \\ 1 \end{bmatrix}
⎣⎡uv1⎦⎤的公式如下 :
s
[
u
v
1
]
=
K
T
c
w
(
3
×
4
)
[
X
Y
Z
1
]
=
K
[
R
c
w
(
3
×
3
)
t
c
w
(
3
×
1
)
]
[
X
Y
Z
1
]
\begin{aligned} s\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} &=KT_{cw(3\times 4)}\begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix} =K\begin{bmatrix} R_{cw(3\times 3)} & t_{cw(3\times 1)} \end{bmatrix}\begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix} \end{aligned}
s⎣⎡uv1⎦⎤=KTcw(3×4)⎣⎢⎢⎡XYZ1⎦⎥⎥⎤=K[Rcw(3×3)tcw(3×1)]⎣⎢⎢⎡XYZ1⎦⎥⎥⎤
matlab: matlab把点坐标看作行向量,其将世界坐标系下的点
[
X
Y
Z
1
]
\begin{bmatrix} X & Y & Z & 1 \end{bmatrix}
[XYZ1],投影到像素坐标系下的点
[
u
v
1
]
\begin{bmatrix} u & v & 1 \end{bmatrix}
[uv1]的公式如下 :
s
[
u
v
1
]
=
[
X
Y
Z
1
]
T
c
w
(
4
×
3
)
T
K
T
=
[
X
Y
Z
1
]
[
R
c
w
(
3
×
3
)
T
t
c
w
(
1
×
3
)
T
]
K
T
=
[
X
Y
Z
1
]
[
R
w
c
(
3
×
3
)
t
c
w
(
1
×
3
)
T
]
K
T
\begin{aligned} s\begin{bmatrix} u & v & 1 \end{bmatrix} &= \begin{bmatrix} X & Y & Z & 1 \end{bmatrix}T_{cw(4\times 3)}^T K^T \\ &= \begin{bmatrix} X & Y & Z & 1 \end{bmatrix}\begin{bmatrix} R_{cw(3\times 3)}^T \\ t_{cw(1\times 3)}^T \end{bmatrix}K^T \\ &= \begin{bmatrix} X & Y & Z & 1 \end{bmatrix}\begin{bmatrix} R_{wc(3\times 3)} \\ t_{cw(1\times 3)}^T \end{bmatrix}K^T \end{aligned}
s[uv1]=[XYZ1]Tcw(4×3)TKT=[XYZ1][Rcw(3×3)Ttcw(1×3)T]KT=[XYZ1][Rwc(3×3)tcw(1×3)T]KT
Note: 旋转矩阵R为正交矩阵,而对于正交矩阵有该性质: R R T = R R − 1 = E RR^T=RR^{-1}=E RRT=RR−1=E,即旋转矩阵的转置就是它的逆矩阵 R T = R − 1 R^T=R^{-1} RT=R−1。
综上可知,以标定板左上角作为世界坐标系原点,uv方向作为世界坐标系的XY轴,有一下结论,有如下结论成立:
- matlab标定得到的相机内参矩阵(IntrinsicMatrix, K m a t l a b K_{matlab} Kmatlab),对应的是《十四讲》中的 K T K^T KT;
- matlab标定得到的旋转矩阵(RotationMatrices , R m a t l a b R_{matlab} Rmatlab),对应的是《十四讲》中的 R w c ( 3 × 3 ) R_{wc(3\times 3)} Rwc(3×3);
- matlab标定得到的平移向量(TranslationVectors, t m a t l a b t_{matlab} tmatlab),对应的是《十四讲》中的 t c w ( 1 × 3 ) T t_{cw(1\times 3)}^T tcw(1×3)T。
相关/参考链接
matlab帮助:cameraParameters