2321 字
6 分钟
lesson11 机器人基础之相机内外参标定
2026-09-01

lesson11 机器人基础之相机内外参标定#

这篇文档主要介绍相机的内外参标定。

针孔相机模型#

相机把三维世界中的坐标点映射到二维图像平面的过程可以用一个几何模型来进行描述,这个几何模型的参数就是相机参数,通过计算我们可以得到相机的内参、外参和畸变参数,这种过程我们叫做标定。这种几何模型有很多中,其中最为简单的为针孔模型(还有双目相机模型、RGB-D相机模型等)。

针孔模型描述了一束光线通过针孔在针孔背面投影成像的关系,同时由于相机镜头上透镜的存在,使得光线投影到成像平面的过程中会产生畸变,所以我们用针孔和畸变两个模型来描述整个投影过程。

Image

由此我们对针孔模型进行几何建模。设O−x−y−zO-x-y-z为相机坐标系,右手系建系zz轴向前,xx轴向左,yy轴向下。OO为相机光心,也是针孔模型的针孔。现实空间的空间点PP,经过小孔OO投影之后,落在物理成像平面O′−x′−y′O^{'}-x^{'}-y^{'}上,成像点为P′P^{'}。设PP的坐标为[X,Y,Z]T[X,Y,Z]^T,P′P^{'}的坐标为[X′,Y′,Z′]T[X^{'},Y^{'},Z^{'}]^T,并且物理成像平面到小孔的距离为ff(焦距)。则我们可以根据三角形相似关系得到:

Image

其中负号表示成像是倒立的,但由于实际相机得到的像并不是倒像(软件翻转处理),因此我们可以等价把成像平面对称地放到相机前方,和三维空间点一起放到相机坐标系的同一侧,便可消去负号。

Image

整理可得:

Image

Image

上式描述了点PP和它的像之间的空间关系,单位可理解为米。但在相机中,我们最终获得的是一个个像素,因此我们还缺一个描述光线转换为像素的过程。设成像平面上有像素平面o−u−vo-u-v,因此P′P^{'}的像素坐标为[u,v]T[u,v]^T。

像素坐标系的定义方式为原点o′o^{'}位于图像的左上角,uu轴向右与xx轴平行,vv轴向下与yy轴平行。像素坐标系与成像平面之间相差了一个缩放和一个原点的平移,那么设在uu轴缩放了α\alpha倍,在vv轴缩放了β\beta倍,同时原点平移了[cx,cy]T[c_{x},c_{y}]^T。便可得:

Image

代入之前推导的式子并把αf\alpha f合并为fxf_{x}, βf\beta f合并为fyf_{y},得

Image

我们把该式化为矩阵形式:

Image

这样矩阵KK便是相机的内参,它描述相机本身的成像特性,即从相机坐标系到像素坐标系的变换关系。

对于外参,之前我们使用的是PP在相机坐标系下的坐标,但是实际情况中相机在运动,所以PP的相机坐标应该是它的世界坐标PwP_{w}根据相机的当前位姿变换到相机坐标系下的结果。相机的位姿由旋转矩阵RR和平移向量tt描述,则有:

Image

相机的位姿RR,tt称为外参,描述世界坐标系到相机坐标系的变换,相机的外参会随着相机运动而变化。

畸变模型#

我们在相机前面加装了透镜,这会对成像过程中光线的传播产生新的影响:一是透镜自身形状对光线传播的影响;二是在机械组装过程中,透镜和成像平面不可能完全平行,从而使光线穿过透镜投影到成像面的位置发生改变。

由透镜形状形成的畸变称为径向畸变。在实际情况下,相机的透镜往往使真实环境中的一条直线在图片中变成了曲线,越靠近图像的边缘现象越明显。由于透镜往往是中心对称的,这使得不规则的畸变通常径向对称。

Image

桶型畸变图像放大率随与光轴之间的距离增加而减小,而枕性畸变相反。

除了透镜的形状会引入径向畸变,透镜不能和成像面严格平行也引入了切向畸变。

Image

下面我们通过严格的数学形式来描述。设归一化平面上任意一点PP,坐标为[x,y]T[x,y]^T,也可写成极坐标形式[r,θ]T[r,\theta]^T,其中rr表示点PP与坐标系原点之间的距离,θ\theta表示与水平轴的夹角。径向畸变可以看成坐标点沿着长度方向发生了变化,也就是距离原点的长度发生了变化。切向畸变可以看作坐标点沿着切线方向发生了变化,也就是水平夹角发生了变化。假设这些畸变呈多项式关系,则

Image

对于切向畸变,我们可以使用另外两个参数p1,p2p_{1},p_{2}

Image

因此我们联合上述两个式子,对于相机坐标系下的一点PP,可以通过5个畸变系数k1,k2,k3,p1,p2k_{1},k_{2},k_{3},p_{1},p_{2}来找到这个点在像素平面上的正确位置。

把三维空间点归一化后计算径向畸变和切向畸变

Image

将畸变后的点通过内参数矩阵投影到像素平面,得到该点在图像上的正确位置

Image

四大坐标系#

在前面的模型介绍中,我们提到了较多的坐标系。在自瞄系统下,我们往往会定义四个坐标系。

坐标系原点位置x轴y轴z轴
像素坐标系图像左上角水平向右(u轴)垂直向下(v轴)——
相机坐标系光心位置向右向下向前(z轴向前的右手系)
云台坐标系云台 yaw/pitch 旋转轴交点向右向前向上
世界坐标系云台旋转轴交点指向 IMU 初始化时的 yaw=0 方向——铅垂向上

世界坐标系是独立与相机之外,被认为静止的坐标系;云台坐标系通过世界坐标系平移得到;相机坐标系通过云台坐标系旋转得到;像素坐标系通过相机坐标系成像得到。

注意,以上坐标系的指向并不统一,主要由开发者自己定义(每个不同的软件引擎都有自己的坐标系,我是真的力竭了😡,推荐以ROS系为标准)

Image

Image

多传感器联合下的外参#

在多传感器系统下,每个传感器都有自己的坐标,如:相机坐标系、激光雷达坐标系、IMU坐标系、世界坐标系

那所谓的外参就是这些坐标系之间的变换关系

Image

外参的标定就是计算出这些传感器坐标系的旋转矩阵RR和平移向量tt,如相机-激光雷达标定就是激光雷达坐标系到相机坐标系的变换。

所谓的手眼标定也就是相机坐标系到机械臂末端坐标系的变换(如果相机放在机械臂上)

不同外参的联合标定方法各不相同,比如相机-激光雷达标定有FAST-Calib方案(有标定板,https://github.com/hku-mars/FAST-Calib)

标定实操#

对于相机的标定,目前主流有张正友标定法、Kalibr等,标定板也有棋盘格、AprilTag等。

Image 我目前手上的棋盘格标定板

  1. 张正友标定法: opencv自带的标定算法使用的就是张正友标定法,你可以自己简单写一个程序来标定,也可以使用ros2自带的包来进行标定。详细教程见:https://www.bilibili.com/video/BV1cNBXB5Euv/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=513b0a1c28964df3eb762ff4217dae5d

  2. Kalibr: 一个开源的多传感器标定工具箱,不仅支持单相机内参标定,还支持多相机外参标定、相机-IMU 联合标定、IMU 内参标定、时间偏移估计等,基于图优化进行后端非线性优化,因而精度高。详细教程见:https://www.bilibili.com/video/BV1SsER6JEKa/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=513b0a1c28964df3eb762ff4217dae5d (包含了相机-激光雷达标定FAST-Calib2和相机内参标定Kalibr)

对于一个包含相机、激光雷达、IMU的多传感器系统,我们要进行相机内参标定、IMU内参标定(激光雷达内参出厂即标定完成)、相机-激光雷达晚参标定、相机-IMU外参标定、激光雷达-IMU外参标定,这些大多数标定可以使用Kalibr完成,具体标定方法自行学习。

可以说,各个传感器的内外参标定是工作中感知SLAM岗的必备基础技能.

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

lesson11 机器人基础之相机内外参标定
https://www.wust-rm.top/posts/teach11/
作者
qing_feng
发布于
2026-09-01
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录