参考资料:https://zhuanlan.zhihu.com/p/87185139
一、3D空间中点到图像的投影
设3D空间中的点
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)投影到图像上的像素坐标(连续值,以左上角像素的左上角为原点的坐标系,注意与整数值的图像像素索引相区别,详见此文第2部分)为
(
u
,
v
)
(u,v)
(u,v),深度为
d
d
d,图像内参矩阵为
I
3
×
3
I_{3\times3}
I3×3,外参矩阵为
E
3
×
4
E_{3\times4}
E3×4。则存在如下关系:
(
u
d
v
d
d
)
=
I
3
×
3
E
3
×
4
(
x
y
z
1
)
\begin{pmatrix} ud \\ vd \\ d \end{pmatrix}=I_{3\times3}E_{3\times4}\begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix}
udvdd
=I3×3E3×4
xyz1
记
I
3
×
3
E
3
×
4
=
M
3
×
4
=
(
m
1
m
2
m
3
)
,
P
=
(
x
y
z
1
)
I_{3\times3}E_{3\times4}=M_{3\times4}=\begin{pmatrix} m_1 \\ m_2 \\ m_3 \end{pmatrix},\ \ P=\begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix}
I3×3E3×4=M3×4=
m1m2m3
, P=
xyz1
其中
m
i
∈
R
1
×
3
m_i\in\mathbb{R}^{1\times3}
mi∈R1×3,易得
{
u
d
=
m
1
P
v
d
=
m
2
P
d
=
m
3
P
\left\{ \begin{matrix} ud=m_1P \\ vd=m_2P \\ \ \ d=m_3P \end{matrix}\right.
⎩
⎨
⎧ud=m1Pvd=m2P d=m3P
二、图像缩放及同一3D点在缩放前后图像中的投影坐标
设原始图像的宽和高分别为
W
W
W和
H
H
H,其缩放比例(缩放因数)分别为
s
1
s_1
s1和
s
2
s_2
s2(即缩放后图像的宽和高分别为
s
1
W
s_1W
s1W和
s
2
H
s_2H
s2H),如下图所示(图中
W
=
6
,
H
=
4
,
s
1
=
1
/
3
,
s
2
=
1
/
2
W=6,H=4,s_1=1/3,s_2=1/2
W=6,H=4,s1=1/3,s2=1/2;左图为原始图像,右图为缩放后的图像):
对于3D空间中的同一个点,其投影到缩放前后图像上的相对位置是相同的(图中黄点)。换句话说,若以左上角像素的左上角为原点建立图像坐标系,其在缩放前后图像中的坐标(分别记为
(
u
,
v
)
(u,v)
(u,v)和
(
u
′
,
v
′
)
(u',v')
(u′,v′))之比即为
(
1
/
s
1
,
1
/
s
2
)
(1/s_1,1/s_2)
(1/s1,1/s2)。
由深度的几何(物理)含义可知同一个点在缩放前后图像中的深度不变。
三、图像缩放后内外参矩阵的变化
根据第一节中的最后一个公式和第二节中的分析:
{
u
d
=
m
1
P
v
d
=
m
2
P
d
=
m
3
P
,
{
u
′
d
′
=
s
1
u
d
=
m
1
′
P
v
′
d
′
=
s
2
v
d
=
m
2
′
P
d
′
=
d
=
m
3
′
P
\left\{ \begin{matrix} ud=m_1P \\ vd=m_2P \\ \ \ d=m_3P \end{matrix}\right.,\ \ \ \left\{ \begin{matrix} u'd'=s_1ud=m'_1P \\ v'd'=s_2vd=m'_2P \\ d'=d=m'_3P \end{matrix}\right.
⎩
⎨
⎧ud=m1Pvd=m2P d=m3P, ⎩
⎨
⎧u′d′=s1ud=m1′Pv′d′=s2vd=m2′Pd′=d=m3′P可知
m
3
′
=
m
3
m'_3=m_3
m3′=m3,而
m
1
′
=
s
1
m
1
,
m
2
′
=
s
2
m
2
m'_1=s_1m_1,\ m'_2=s_2m_2
m1′=s1m1, m2′=s2m2。
故结论为:图像缩放时,内外参矩阵之积的第一行需要乘上宽的缩放因数,第二行需要乘上高的缩放因数。
注意:设缩放前像素的整数索引为 ( u , v ) (u,v) (u,v),图像的宽和高分别为 W W W和 H H H,缩放比例(缩放因数)分别为 s 1 s_1 s1和 s 2 s_2 s2,若仍按照第二节的方式计算缩放后的坐标 ( u ′ , v ′ ) (u',v') (u′,v′)(即 u ′ = s 1 u , v ′ = s 2 v u'=s_1u,v'=s_2v u′=s1u,v′=s2v),则存在参考资料中所谓的“0.5像素问题”。这是因为像素的整数索引和像素的连续坐标之间相差了0.5(同样可见此文第2部分)。如果在缩放时考虑到了这一点(如使用cv2.resize()函数实现缩放),则可直接使用第三节的结论。