Camera file cam.txt
stores the camera parameters, which includes extrinsic, intrinsic, minimum depth and maximum depth:
extrinsic
E00 E01 E02 E03
E10 E11 E12 E13
E20 E21 E22 E23
E30 E31 E32 E33
intrinsic
K00 K01 K02
K10 K11 K12
K20 K21 K22
DEPTH_MIN DEPTH_MAX
e x t r i n s i c = T = [ R t 0 T 1 ] i n t r i n s i c = K = [ f x 0 c x 0 f y c y 0 0 1 ] extrinsic = \boldsymbol{T} = \begin{bmatrix} \boldsymbol{R} &\boldsymbol{t} \\ \boldsymbol{0}^T & 1 \end{bmatrix} \\ intrinsic = \boldsymbol{K} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} extrinsic=T=[R0Tt1]intrinsic=K=⎣⎡fx000fy0cxcy1⎦⎤
d
p
=
d
[
u
v
1
]
=
K
(
R
P
w
+
t
)
=
(
K
R
P
w
+
K
t
)
=
[
K
R
K
t
]
[
P
w
1
]
d\boldsymbol{p} = d\begin{bmatrix} u\\ v\\ 1 \end{bmatrix} =\boldsymbol{K}(\boldsymbol{RP}_w + \boldsymbol{t}) = (\boldsymbol{KRP}_w + \boldsymbol{Kt}) = \begin{bmatrix} \boldsymbol{KR} & \boldsymbol{Kt}\\ \end{bmatrix} \begin{bmatrix} \boldsymbol{P}_w \\ 1 \end{bmatrix}
dp=d⎣⎡uv1⎦⎤=K(RPw+t)=(KRPw+Kt)=[KRKt][Pw1]
P
w
=
R
−
1
(
K
−
1
p
d
−
t
)
\boldsymbol{P}_w = \boldsymbol{R}^{-1}(\boldsymbol{K}^{-1}\boldsymbol{p}d - \boldsymbol{t})
Pw=R−1(K−1pd−t)
P
w
\boldsymbol{P}_w
Pw为世界坐标系下的坐标。
考虑参考图中的某个像素
p
\boldsymbol{p}
p,以及其深度
d
j
d_j
dj,计算这个点在源图
i
i
i中的坐标:
p
i
,
j
=
p
i
(
d
j
)
=
K
i
(
R
i
P
w
+
t
i
)
=
K
i
(
R
i
R
0
−
1
(
K
0
−
1
p
d
j
−
t
0
)
+
t
i
)
=
K
i
R
i
R
0
−
1
K
0
−
1
p
d
j
−
K
i
R
i
R
0
−
1
t
0
+
K
i
t
i
=
R
^
p
d
j
+
t
^
\begin{aligned} \boldsymbol{p}_{i,j} & = \boldsymbol{p}_i(d_j) \\ & = \boldsymbol{K}_i(\boldsymbol{R}_i \boldsymbol{P}_w+\boldsymbol{t}_i) \\ & = \boldsymbol{K}_i(\boldsymbol{R}_i \boldsymbol{R}_0^{-1}(\boldsymbol{K}_0^{-1}\boldsymbol{p}d_j - \boldsymbol{t}_0) + \boldsymbol{t}_i) \\ & = \boldsymbol{K}_i \boldsymbol{R}_i \boldsymbol{R}_0^{-1}\boldsymbol{K}_0^{-1}\boldsymbol{p}d_j - \boldsymbol{K}_i \boldsymbol{R}_i \boldsymbol{R}_0^{-1}\boldsymbol{t}_0 + \boldsymbol{K}_i \boldsymbol{t}_i \\ & = \hat{\boldsymbol{R}}\boldsymbol{p}d_j + \hat{\boldsymbol{t}} \end{aligned}
pi,j=pi(dj)=Ki(RiPw+ti)=Ki(RiR0−1(K0−1pdj−t0)+ti)=KiRiR0−1K0−1pdj−KiRiR0−1t0+Kiti=R^pdj+t^
proj_mat = extrinsics.copy()
proj_mat[:3, :4] = np.matmul(intrinsics, proj_mat[:3, :4])
有下式:
p
r
o
j
_
m
a
t
=
[
K
R
K
t
0
T
1
]
\boldsymbol{proj\_mat} = \begin{bmatrix} \boldsymbol{KR} & \boldsymbol{Kt} \\ \boldsymbol{0}^T & 1 \end{bmatrix}
proj_mat=[KR0TKt1]
p
r
o
j
_
m
a
t
−
1
=
[
R
−
1
K
−
1
−
R
−
1
t
0
T
1
]
\boldsymbol{proj\_mat}^{-1} = \begin{bmatrix} \boldsymbol{R}^{-1}\boldsymbol{K}^{-1} & -\boldsymbol{R}^{-1}\boldsymbol{t} \\ \boldsymbol{0}^T & 1 \end{bmatrix}
proj_mat−1=[R−1K−10T−R−1t1]
proj = torch.matmul(src_proj, torch.inverse(ref_proj))
rot = proj[:, :3, :3] # [B,3,3]
trans = proj[:, :3, 3:4] # [B,3,1]
p r o j = p r o j _ m a t i × p r o j _ m a t 0 − 1 = [ K i R i K i t i 0 T 1 ] [ R 0 − 1 K 0 − 1 − R 0 − 1 t 0 0 T 1 ] = [ K i R i R 0 − 1 K 0 − 1 − K i R i R 0 − 1 t 0 + K i t i 0 T 1 ] = [ R ^ t ^ 0 T 1 ] = [ r o t t r a n s 0 T 1 ] \begin{aligned} \boldsymbol{proj} & = \boldsymbol{proj\_mat}_i \times \boldsymbol{proj\_mat}_0^{-1} \\ & = \begin{bmatrix} \boldsymbol{K}_i \boldsymbol{R}_i & \boldsymbol{K}_i \boldsymbol{t}_i \\ \boldsymbol{0}^T & 1 \end{bmatrix} \begin{bmatrix} \boldsymbol{R}_0^{-1}\boldsymbol{K}_0^{-1} & -\boldsymbol{R}_0^{-1}\boldsymbol{t}_0 \\ \boldsymbol{0}^T & 1 \end{bmatrix} \\ & = \begin{bmatrix} \boldsymbol{K}_i \boldsymbol{R}_i \boldsymbol{R}_0^{-1}\boldsymbol{K}_0^{-1} & -\boldsymbol{K}_i \boldsymbol{R}_i \boldsymbol{R}_0^{-1}\boldsymbol{t}_0 + \boldsymbol{K}_i \boldsymbol{t}_i \\ \boldsymbol{0}^T & 1 \end{bmatrix} \\ & = \begin{bmatrix} \hat{\boldsymbol{R}} & \hat{\boldsymbol{t}} \\ \boldsymbol{0}^T & 1 \end{bmatrix} \\ & = \begin{bmatrix} \boldsymbol{rot} & \boldsymbol{trans} \\ \boldsymbol{0}^T & 1 \end{bmatrix} \\ \end{aligned} proj=proj_mati×proj_mat0−1=[KiRi0TKiti1][R0−1K0−10T−R0−1t01]=[KiRiR0−1K0−10T−KiRiR0−1t0+Kiti1]=[R^0Tt^1]=[rot0Ttrans1]