相机坐标系标定与外参矩阵求解

相机坐标系标定与外参矩阵求解

引言

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

一、坐标系定义与特征点标定

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 标定验证

有效的验证方法包括:

  1. 正交性检验:验证旋转矩阵的列向量是否正交
  2. 投影验证:已知点云与图像的对应关系是否满足
  3. 时间稳定性:多次采集同一目标,结果的一致性

六、总结

本文通过从特征点坐标推导相机外参的完整案例,阐述了:

  1. 如何从原始测量数据构建正交坐标系
  2. 相机外参矩阵的数学形式与几何含义
  3. 相机内参与畸变模型的实际应用
  4. 多坐标系统一的工程意义

这套标定方法已广泛应用于自动驾驶、机器人视觉等领域,是现代计算机视觉系统的核心基础。通过精确的外参标定,我们能够实现毫米级精度的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.        ]])

此文档完整展示了从原始标定数据到可用变换矩阵的全过程,可直接应用于生产环境。

相关推荐
问道财经1 小时前
Pocket 4爆火,索尼富士慌了
数码相机
Hello-FPGA2 小时前
CoaXPress 相机触发设置
数码相机
qq_411262423 小时前
ESP32-S3 AI相机硬件组成与通信配置说明
人工智能·数码相机
私人珍藏库4 小时前
[Android] OldRoll复古胶片相机高级版-徕卡-哈苏-宝丽来等等
数码相机·智能手机·app·工具·软件·多功能
私人珍藏库4 小时前
[Android] 红妆相机-拍照美颜图片美化工具
android·数码相机·app·软件·多功能
金色熊族20 小时前
QTransform使用心得(二)--仿射变换、非仿射变换、矩阵
qt·线性代数·矩阵
江畔柳前堤1 天前
github实战指南00-命令在哪里执行?
人工智能·线性代数·oracle·数据挖掘·github·word
江畔柳前堤1 天前
github实战指南05-Fork与开源协作
人工智能·线性代数·oracle·开源·github·word