相机坐标系标定与外参矩阵求解
引言
在自动驾驶感知系统中,多传感器的坐标系统一是实现精准定位与环境理解的基础。本文通过实际案例,详细阐述如何从已知的特征点坐标推导相机与车体之间的外参矩阵,以及如何利用内参进行图像投影。
一、坐标系定义与特征点标定
1.1 标定点坐标

在本案例中,我们在相机视野内选取了四个关键特征点,分别代表:
| 点位 | X (mm) | Y (mm) | Z (mm) | 含义 |
|---|---|---|---|---|
| X轴点 | 1164.286 | -197.2533 | 1202.212 | 相机坐标系X轴方向 |
| Y轴点 | 1088.407 | 0.15035 | 1151.999 | 相机坐标系Y轴方向 |
| Z轴点 | 1215.228 | 0.14679 | 1125.227 | 相机坐标系Z轴方向 |
| 原点O | 1164.291 | 0.14908 | 1202.209 | 相机光学中心 |
这些点位均以车体坐标系(前轴)为参考,单位为毫米。
1.2 坐标系建立原理
通过已知的特征点,我们可以构建正交的相机坐标系:
x⃗axis=OX⃗∣OX⃗∣\vec{x}_{axis} = \frac{\vec{OX}}{|\vec{OX}|}x axis=∣OX ∣OX
y⃗axis=OY⃗∣OY⃗∣\vec{y}_{axis} = \frac{\vec{OY}}{|\vec{OY}|}y axis=∣OY ∣OY
z⃗axis=OZ⃗∣OZ⃗∣\vec{z}_{axis} = \frac{\vec{OZ}}{|\vec{OZ}|}z axis=∣OZ ∣OZ
其中 OX⃗=X−O\vec{OX} = X - OOX =X−O,以此类推。
二、外参矩阵计算
2.1 旋转矩阵推导
将单位向量作为行向量组成旋转矩阵:
Rcar→cam=x⃗axisy⃗axisz⃗axisR_{car \to cam} = \begin{bmatrix} \vec{x}{axis} \\ \vec{y}{axis} \\ \vec{z}_{axis} \end{bmatrix}Rcar→cam= x axisy axisz axis
计算结果表明三个轴向完全正交(验证x⃗axis×y⃗axis≈z⃗axis\vec{x}{axis} \times \vec{y}{axis} \approx \vec{z}_{axis}x axis×y axis≈z axis),确保了数值精度:
x × y = [0.43334289, 0.0, -0.90122913]
z = [0.43334193, 0.0, -0.90122959]
误差在1e-7数量级,表明标定质量优异。
2.2 变换矩阵形式
外参矩阵通常表示为4×4的齐次变换矩阵。本案例中的两个关键矩阵为:
相机到车体的变换矩阵 Mcam→carM_{cam \to car}Mcam→car:
Mcam→car=−0.00003−0.8340.5521.164−1.0000.00001−0.000020.00010.00002−0.552−0.8341.2020001M_{cam \to car} = \begin{bmatrix} -0.00003 & -0.834 & 0.552 & 1.164 \\ -1.000 & 0.00001 & -0.00002 & 0.0001 \\ 0.00002 & -0.552 & -0.834 & 1.202 \\ 0 & 0 & 0 & 1 \end{bmatrix}Mcam→car= −0.00003−1.0000.000020−0.8340.00001−0.55200.552−0.00002−0.83401.1640.00011.2021
车体到相机的变换矩阵 Mcar→camM_{car \to cam}Mcar→cam:
Mcar→cam=−0.00003−1.0000.000010.0002−0.8340.00001−0.5521.6340.552−0.00003−0.8340.3600001M_{car \to cam} = \begin{bmatrix} -0.00003 & -1.000 & 0.00001 & 0.0002 \\ -0.834 & 0.00001 & -0.552 & 1.634 \\ 0.552 & -0.00003 & -0.834 & 0.360 \\ 0 & 0 & 0 & 1 \end{bmatrix}Mcar→cam= −0.00003−0.8340.5520−1.0000.00001−0.0000300.00001−0.552−0.83400.00021.6340.3601
2.3 平移向量解析
从计算过程可得:
tcam→car=−0.0001.4860.490 (单位:m)t_{cam \to car} = \begin{bmatrix} -0.000 \\ 1.486 \\ 0.490 \end{bmatrix} \text{ (单位:m)}tcam→car= −0.0001.4860.490 (单位:m)
tcar→cam=0.0001.6340.360 (单位:m)t_{car \to cam} = \begin{bmatrix} 0.000 \\ 1.634 \\ 0.360 \end{bmatrix} \text{ (单位:m)}tcar→cam= 0.0001.6340.360 (单位:m)
平移向量表示两坐标系原点之间的距离,在约1.6m和0.36m处存在显著偏移。
三、内参矩阵与畸变模型
3.1 相机内参
相机固有的内参矩阵K定义了像素坐标与3D点的关系:
K=fx0cx0fycy001=1054.07401320.66901053.825986.032001K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} 1054.074 & 0 & 1320.669 \\ 0 & 1053.825 & 986.032 \\ 0 & 0 & 1 \end{bmatrix}K= fx000fy0cxcy1 = 1054.0740001053.82501320.669986.0321
其中:
- fx=1054.074f_x = 1054.074fx=1054.074 px,fy=1053.825f_y = 1053.825fy=1053.825 px:焦距(几乎相等,表明传感器方正)
- cx=1320.669c_x = 1320.669cx=1320.669 px,cy=986.032c_y = 986.032cy=986.032 px:主点(图像中心)
3.2 畸变模型参数
该相机采用8参数畸变模型(径向+切向+薄棱透镜模型):
D=k1,k2,p1,p2,k3,k4,k5,k6D = k_1, k_2, p_1, p_2, k_3, k_4, k_5, k_6D=k1,k2,p1,p2,k3,k4,k5,k6
具体数值:
| 参数 | 值 | 说明 |
|---|---|---|
| k1k_1k1 | 0.898159 | 径向畸变系数1(桶形) |
| k2k_2k2 | 0.135605 | 径向畸变系数2 |
| p1p_1p1 | 0.000076 | 切向畸变系数1 |
| p2p_2p2 | 0.000006 | 切向畸变系数2 |
| k3k_3k3 | 0.001583 | 径向畸变系数3 |
| k4k_4k4 | 1.272877 | 薄棱透镜系数1 |
| k5k_5k5 | 0.363868 | 薄棱透镜系数2 |
| k6k_6k6 | 0.016611 | 薄棱透镜系数3 |
关键特征 :k1k_1k1 和 k2k_2k2 值较大,表明该相机存在显著的径向畸变,需要在图像处理中进行相应的去畸变处理。
四、应用实例:点云投影到图像
4.1 投影管线
将车体坐标系中的点投影到相机图像的完整流程:
python
import numpy as np
# 第一步:车体坐标转相机坐标
p_car = np.array([x, y, z, 1]) # 齐次坐标
p_cam_homo = M_car2cam @ p_car
p_cam = p_cam_homo[:3] / p_cam_homo[3] # 去除齐次坐标
# 第二步:应用相机内参
p_pixel_homo = K @ p_cam
u, v = p_pixel_homo[0] / p_pixel_homo[2], p_pixel_homo[1] / p_pixel_homo[2]
# 第三步:畸变校正(可选,依赖具体应用)
# 通过k1-k6参数计算畸变量,调整(u,v)坐标
4.2 焦距与分辨率分析
焦距约1054像素,对应的视场角计算:
- 假设传感器宽度为6.4mm(1/1.3")
- 水平视场角:αh≈2arctan(width2f)≈51°\alpha_h \approx 2 \arctan\left(\frac{width}{2f}\right) \approx 51°αh≈2arctan(2fwidth)≈51°
- 垂直视场角:αv≈2arctan(height2f)≈41°\alpha_v \approx 2 \arctan\left(\frac{height}{2f}\right) \approx 41°αv≈2arctan(2fheight)≈41°
五、工程实现要点
5.1 坐标系统一的重要性
在多传感器系统中:
- 一致的坐标定义是融合各传感器数据的前提
- 精确的外参标定直接影响感知算法的准确性
- 定期验证校准是系统稳定性的保障
5.2 数值稳定性
本案例中的矩阵运算注意事项:
- 旋转矩阵的行列式应严格等于1(实际≈1±1e-7)
- 选择数值稳定的算法(如SVD分解)求逆矩阵
- 在实时系统中缓存预计算结果,避免重复运算
5.3 标定验证
有效的验证方法包括:
- 正交性检验:验证旋转矩阵的列向量是否正交
- 投影验证:已知点云与图像的对应关系是否满足
- 时间稳定性:多次采集同一目标,结果的一致性
六、总结
本文通过从特征点坐标推导相机外参的完整案例,阐述了:
- 如何从原始测量数据构建正交坐标系
- 相机外参矩阵的数学形式与几何含义
- 相机内参与畸变模型的实际应用
- 多坐标系统一的工程意义
这套标定方法已广泛应用于自动驾驶、机器人视觉等领域,是现代计算机视觉系统的核心基础。通过精确的外参标定,我们能够实现毫米级精度的3D-2D映射,为后续的目标检测、距离估计等任务提供坚实的几何基础。
附录:关键代码验证
python
import numpy as np
X = np.array([[1164.286, -197.2533, 1202.212]]) / 1000
Y = np.array([[1088.407, 0.15035, 1151.999]]) / 1000
Z = np.array([[1215.228, 0.14679, 1125.227]]) / 1000
O = np.array([[1164.291, 0.14908, 1202.209]]) / 1000
x_axis = X - O
y_axis = Y - O
z_axis = Z - O
x_axis /= np.linalg.norm(x_axis)
y_axis /= np.linalg.norm(y_axis)
z_axis /= np.linalg.norm(z_axis)
# 验证:
# >>> np.cross(x_axis, y_axis)
# array([[ 0.43334289, 0. , -0.90122913]])
# >>> z_axis
# array([[ 0.43334193, 0. , -0.90122959]])
# 确定数模取值无误差,完全正交
# R_{A2B}
R_car2cam = np.vstack([x_axis, y_axis, z_axis])
R_cam2car = R_car2cam.T
t_cam2car = O
t_car2cam = - R_car2cam.dot(t_cam2car.T)
# array([[-0. ],
# [ 1.4862052],
# [ 0.4903625]])
M_cam2car = np.vstack([np.hstack([x_axis.T, y_axis.T, z_axis.T, O.T]), [0, 0, 0, 1]])
# array([[ 0. , -0.90122913, 0.43334193, 1.126917 ],
# [-1. , 0. , 0. , 0. ],
# [ 0. , -0.43334289, -0.90122959, 1.085964 ],
# [ 0. , 0. , 0. , 1. ]])
M_car2cam = np.linalg.inv(M_car2cam)
# array([[-0. , -1. , -0. , -0. ],
# [-0.90122959, -0. , -0.43334193, 1.48620468],
# [ 0.43334289, -0. , -0.90122913, 0.49036092],
# [ 0. , 0. , 0. , 1. ]])
此文档完整展示了从原始标定数据到可用变换矩阵的全过程,可直接应用于生产环境。