多相机外参矩阵原点迁移:以相机1为新原点的重计算问询
没问题,这个原点迁移的本质就是坐标系变换的推导,我给你理清楚步骤和代码实现:
相机外参原点迁移:从标定板到相机1的位姿转换
首先明确我们的变换关系:
- 原标定结果:每个相机i相对于标定板坐标系(记为W)的旋转矩阵是
R_i(即rotationMatrix{i}),平移向量是t_i(即translationVector{i})。这里的定义是:标定板坐标系下的点P_W,转换到相机i坐标系下的点P_ci的公式为:P_ci = R_i * P_W + t_i。
现在要把原点换成相机1的坐标系(记为C1),求每个相机i相对于C1的旋转矩阵R_i_from_1和平移向量t_i_from_1——也就是找到从C1到相机i的变换,满足:P_ci = R_i_from_1 * P_c1 + t_i_from_1。
核心推导过程
我们通过坐标系逆变换来推导:
- 先求相机1坐标系C1到标定板坐标系W的变换:因为P_c1 = R_ref * P_W + T_ref(R_ref是相机1的旋转
rotationMatrix{1},T_ref是相机1的平移translationVector{1}),反过来,P_W = R_ref' * (P_c1 - T_ref)(旋转矩阵的逆等于转置,用R_ref'表示转置)。 - 把P_W代入相机i的变换公式:
P_ci = R_i * [R_ref' * (P_c1 - T_ref)] + t_i = (R_i * R_ref') * P_c1 + (t_i - R_i * R_ref' * T_ref) - 对比目标公式
P_ci = R_i_from_1 * P_c1 + t_i_from_1,直接得到:- 相对旋转矩阵:
R_i_from_1 = R_i * R_ref' - 相对平移向量:
t_i_from_1 = t_i - R_i_from_1 * T_ref
- 相对旋转矩阵:
代码实现示例(匹配你的Matlab变量命名)
假设rotationMatrix是存储各相机旋转矩阵的cell数组,translationVector是存储各相机平移向量的cell数组,代码如下:
% 相机1的参考位姿 R_ref = rotationMatrix{1}; T_ref = translationVector{1}; % 初始化存储相对位姿的数组 num_cameras = length(rotationMatrix); R_rel = cell(num_cameras, 1); T_rel = cell(num_cameras, 1); % 相机1相对于自己的位姿是单位矩阵和零向量 R_rel{1} = eye(3); T_rel{1} = zeros(3, 1); % 计算其他相机相对于相机1的位姿 for i = 2:num_cameras R_i = rotationMatrix{i}; T_i = translationVector{i}; % 计算相对旋转 R_rel{i} = R_i * R_ref'; % 计算相对平移 T_rel{i} = T_i - R_rel{i} * T_ref; end
验证小技巧
- 相机1自己的相对位姿必然是单位旋转矩阵和零平移向量,这一步可以快速验证代码正确性。
- 如果有条件,用两个相机重叠区域的特征点验证:把相机2中的点转换到相机1坐标系,和实际观测到的点对比,误差应该极小。
内容的提问来源于stack exchange,提问作者user3178756
相关产品推荐
相关产品推荐

