Highligh:
- 详解相机位姿和外参的关系
- 详解基础矩阵(Fundamental Matrix)的计算
位姿(Pose)与相机外参
图 1. 物体的位姿(pose)示意图, 图来自
如图1所示, 图中各量满足
ripi=Civrvpv+rivi(1)
其中I是惯性系, 也即全局坐标系. V是体坐标系, 即物体自身定义的坐标系. P是空间中一点.
{rivi,Civ} 定义为物体V在全局坐标系I中的位姿.
可以看出, 位姿包括平移和旋转两部分, 平移分量rivi表示V在I坐标系中的位置表达, 旋转分量Civ表示V到I的旋转关系.
显见, 上式表达的是将坐标从V系转换到I系.
而在常见的相机参数表示中, 相机外参R,t表示相机的"位姿", 但是具体含义又与前述机器人学中的含义不尽相同, 加之旋转本就比较难以直观理解, 经常容易犯错.
投影相机(§ 6.2 in or § 6.4.1 in )外参的作用是将空间中的点x的坐标xI从全局坐标系I 转换到相机坐标系, 这里记作C吧, 与前文中V其实是一样的. 转换关系为
xC=R⋅xI+t(2)
可见, 该式表达的是将坐标从全局坐标系I转换到相机的自身坐标系C.
至此, 位姿和外参的关系就很清晰了. 他们表示的变换方向是相反的.
对于实际问题, 我们常会遇到五花八门的相机参数提供方式, 有按标准提供外参的, 有提供相机位姿的, 还有提供经过奇怪变换后的平移旋转参数的. 牢记以上两个公式, 然后进行一些推导变换, 即可正确解析.
典型题1: 已知相机外参 {R,t}, 求相机位姿.
公式(2)两边同乘 R⊤ 可得 R⊤⋅xC=xI+R⊤⋅t , 即 xI=R⊤⋅xC+(−R⊤⋅t).
所以相机位姿为 {(−R⊤t),R⊤}.
典型题2: 已知相机位姿 {r,C}, 求相机外参.
可知 xI=C⋅xC+r, 两边同乘 C⊤ 可得 xC=C⊤⋅xI+(−C⊤⋅r).
即相机外参为 {C⊤,−C⊤r}.
且 [C0Tr1]−1=[C⊤0T−C⊤r1].
(注意: 本文中位姿和外参中旋转和平移分量的位置不同.)
基础矩阵(Fundamental Matrix)
(§ 9.2.2 in )提供了一个示例用于在已知两个相机参数的情况下, 计算其之间基础矩阵.
F=K′−⊤[t]×RK−1(3)
但相机1的参数被设定为了 P=K[I∣0], 导致在实际使用时不能直接套用该公式.
实际用例:
已知两相机参数分别为P1=K1[R1∣t1] 和 P2=K2[R2∣t2].
为了能代入公式(3)需要引入一个变换将相机1的外参变为[I∣0], aka 对全局参考系进行旋转平移, 使得相机1外参变为[I∣0].
已知 xI′=R1⋅xI+t1=xC, 其中I′是变换后的坐标系, 坐标系I在I′中的位姿为{t1,R1} 可见该变换恰可以让相机1的外参变为[I∣0].
将相机2也变换到 I′坐标系中, xI′=R1⋅xI+t1,
又有 xI=R⊤⋅xC+(−R⊤⋅t),
可得 xI′=R1⋅(R2⊤⋅xC+(−R2⊤⋅t2))+t1,
即 xC=R2R1⊤⋅xI′+(t2−R2R1⊤t1)
最终相机2的外参变换为 [(R2R1⊤)∣(t2−R2R1⊤t1)], 且相机1外参为[I∣0].
def get_fundmat(cam1, cam2):
"""
Transform cams that cam1's R is identity mat and t is zero vector
$F = \mathrm{K}^{\prime-\top}[\mathrm{t}]_{\times \mathrm{RK}^{-1}}$
1′=Fx
:param cam1:
:param cam2:
:return:
"""
K1 = cam1['K']
K2 = cam2['K']
R1 = cam1['R']
R2 = cam2['R']
t1 = cam1['t']
t2 = cam2['t']
R22 = R2 @ R1.T
t22 = (t2 - R22@t1).reshape(-1)
t_mat = np.zeros((3, 3)) # cross product matrix
t_mat[0, 1] = -t22[2]
t_mat[0, 2] = t22[1]
t_mat[1, 2] = -t22[0]
t_mat = -t_mat.T + t_mat
fundmat = np.linalg.inv(K2).T @ t_mat @ R22 @ np.linalg.inv(K1)
return fundmat
参考资料