标定基础理论:相机模型与坐标系转换
各位同学,今天我们来啃一块硬骨头——相机模型和坐标系转换。说实话,我刚入行那会儿,觉得这东西就是一堆数学公式,没啥实际用。直到有一次,我标定出来的内参矩阵,算出来的投影点跟实际图像差了十几个像素……嗯,从那以后,我再也不敢小看这部分了。
针孔相机模型:最朴素的成像原理
咱们先聊聊针孔模型。说白了,它就是描述「三维世界里的一个点,是怎么跑到二维图像上的」。你想想看,光线从物体表面反射,穿过一个小孔,投射到后面的感光面上——这就是最原始的相机。
核心思想:针孔模型假设所有光线都通过一个点(光心),然后投影到成像平面上。虽然真实镜头有畸变、有厚度,但针孔模型是标定的起点。
数学上,一个三维点 P(X, Y, Z) 投影到图像上的位置 p(x, y) 满足:
x = f * (X / Z)
y = f * (Y / Z)
这里的 f 是焦距。我在项目中遇到过一个问题:用手机拍的标定板,算出来的焦距跟镜头标称值差了一大截。后来发现,是因为手机镜头有自动对焦,焦距一直在变。所以啊,标定前一定要锁死焦距。
坐标系转换:从世界到像素的四步跳
一个三维点要变成图像上的像素,中间要经历四次坐标变换。我习惯把这四个坐标系记成一条流水线:
- 世界坐标系 → 我们定义的三维空间,单位是毫米或米
- 相机坐标系 → 以相机光心为原点,Z轴指向镜头前方
- 图像坐标系 → 在成像平面上,单位是毫米,原点在光轴与平面交点
- 像素坐标系 → 最终图像,单位是像素,原点在左上角
为什么会搞这么复杂?说白了,每个坐标系都有自己的「舒服区」。世界坐标系方便我们描述物体位置,相机坐标系方便描述投影关系,像素坐标系方便计算机读取。你硬要把它们混在一起,公式会变得一塌糊涂。
外参矩阵:世界怎么「看」相机
外参矩阵描述的是世界坐标系和相机坐标系之间的相对关系。它由两部分组成:
- 旋转矩阵 R(3×3)—— 描述两个坐标系之间的旋转
- 平移向量 t(3×1)—— 描述两个坐标系原点之间的偏移
数学表达式很简单:
P_camera = R * P_world + t
我曾经踩过一个坑:用张正友标定法算出来的外参,把旋转矩阵转成欧拉角后,角度值完全对不上。后来才发现,是我把旋转矩阵的转置搞反了。记住,R 是从世界坐标系到相机坐标系的旋转,方向别搞反。
避坑指南:外参矩阵不是唯一的。同一个标定板,你换个位置重新标定,外参就会变。内参才是相机的「固有属性」,外参是「当前姿态」。我曾经见过有人把外参当内参用,结果换了场景全崩了。
内参矩阵:相机自己的「基因」
内参矩阵描述的是相机坐标系到像素坐标系的映射。它长这样:
K = [fx 0 cx]
[ 0 fy cy]
[ 0 0 1]
其中:
- fx, fy —— 焦距在x、y方向上的像素尺度(通常很接近)
- cx, cy —— 光心在像素坐标系中的位置(理论上在图像中心)
你想想看,为什么要有 fx 和 fy 两个值?因为像素不一定是正方形的。我遇到过一些工业相机,像素是矩形的,fx 和 fy 能差 5% 以上。如果你强行设成一样,标定出来的结果就会有系统误差。
完整投影公式:把一切串起来
把外参和内参串起来,一个三维点 P_w 到像素 p 的完整投影公式就是:
p = K * [R | t] * P_w
展开写就是:
s * [u] [fx 0 cx] [r11 r12 r13 t1] [Xw]
[v] = [ 0 fy cy] * [r21 r22 r23 t2] * [Yw]
[1] [ 0 0 1] [r31 r32 r33 t3] [Zw]
[1]
这里的 s 是尺度因子,说白了就是齐次坐标归一化用的。我刚开始学的时候,总觉得这个 s 是多余的。后来做三维重建,发现没有 s 你根本没法处理深度信息——同一个物体离得近就大、离得远就小,s 就是用来描述这个「缩放」的。
畸变模型:针孔模型的「补丁」
针孔模型是理想情况。真实镜头有畸变,主要是两种:
| 畸变类型 | 产生原因 | 典型表现 |
|---|---|---|
| 径向畸变 | 镜头曲率不完美 | 直线变弯,越靠近边缘越明显 |
| 切向畸变 | 镜头与感光面不平行 | 图像倾斜,像被「拧」了一下 |
畸变参数通常用 k1, k2, k3(径向)和 p1, p2(切向)来表示。标定时,我们会先估计内参外参,再优化畸变参数。我个人的习惯是:先做一次粗标定,看看畸变参数的量级。如果 k1 超过 0.5,说明镜头畸变很大,可能需要换镜头或者做更精细的标定。
小技巧:标定的时候,标定板尽量覆盖整个视场。如果只拍中间区域,畸变参数根本算不准。我一般会让标定板出现在图像的四个角和中心,至少拍 15-20 张不同姿态的图片。
小结:标定的本质是什么?
说了这么多,其实标定的本质就一句话:求解内参矩阵、外参矩阵和畸变参数。你给相机拍一堆已知尺寸的标定板图片,然后让计算机去反推这些参数。参数准了,后面的三维重建、测距、AR 叠加才能靠谱。