一、相机标定概述:什么是相机标定、为什么需要标定、标定的核心目标与数学模型简介
各位同学,咱们今天聊聊相机标定。说实话,这个知识点在计算机视觉里属于那种「看着不起眼,但绕不过去」的基础活。我刚开始做视觉项目时,总觉得标定是件麻烦事,能省就省。结果呢?后来吃了不少亏——测距偏差、拼接错位、三维重建变形……嗯,从那以后我再也不敢跳过标定了。
1.1 什么是相机标定?
相机标定,说白了就是给相机做一次「视力检查」和「配镜矫正」。
你想想看,我们人眼看到的世界和相机拍到的世界,其实是有差异的。相机镜头有畸变、传感器有安装误差、像素不是绝对正方形……这些都会导致图像失真。标定要做的,就是把这些「偏差」量化出来,然后反过来修正图像。
我个人习惯把标定理解成三个步骤:
- 拍一张棋盘格照片——作为参考物
- 找出棋盘格角点——建立对应关系
- 解算相机参数——得到修正公式
我在项目中遇到过一位同事,他拍标定板时随手拿手机拍了几张,结果标定出来的参数根本不能用。后来我告诉他:标定板要平整、光照要均匀、角度要丰富。他照做之后,效果立竿见影。
1.2 为什么需要标定?
这个问题我问过不少初学者。有人回答「为了校正图像」,有人回答「为了得到相机参数」。都对,但不够全面。
我总结一下,标定的必要性体现在三个层面:
- 消除畸变——镜头带来的桶形/枕形畸变,不标定的话,直线拍出来是弯的
- 建立度量关系——从像素坐标到真实世界坐标的映射,没有标定,你没法做精确测量
- 多相机协同——双目立体、全景拼接,每个相机都得标定,否则拼出来对不上
核心观点:标定不是「可选项」,而是「必选项」。任何涉及空间定位、尺寸测量、三维重建的视觉系统,标定都是第一步。
我记得有一次做工业检测项目,客户要求测量精度达到0.1mm。我们用的工业相机,镜头畸变其实很小。但如果不标定,直接拿像素当毫米用,误差能到2-3mm。标定之后,精度直接拉到0.05mm以内。你说这步能省吗?
1.3 标定的核心目标
标定的核心目标,其实就两件事:
- 内参标定——搞清楚相机内部的光学特性(焦距、主点、畸变系数)
- 外参标定——搞清楚相机在空间中的位置和朝向(旋转、平移)
打个比方:内参就像一个人的视力参数,外参就像他站在哪里、面朝哪个方向。两者缺一不可。
小技巧:初学者可以先只做内参标定,因为很多应用(比如单目测距)只需要内参就够了。外参标定通常用于多相机系统或与机械臂配合的场景。
1.4 数学模型简介
这里我尽量说得通俗一点。相机成像的数学模型,本质上是一个「从三维世界到二维图像」的投影过程。
整个过程可以拆成四步:
- 世界坐标系 → 相机坐标系(外参:旋转矩阵R + 平移向量t)
- 相机坐标系 → 归一化平面(透视投影)
- 归一化平面 → 畸变校正(径向畸变 + 切向畸变)
- 畸变校正后 → 像素坐标系(内参:焦距fx,fy + 主点cx,cy)
用数学公式表达就是:
s * [u, v, 1]^T = K * [R | t] * [X, Y, Z, 1]^T
其中:
s是尺度因子[u, v]是像素坐标K是内参矩阵[R | t]是外参矩阵[X, Y, Z]是世界坐标
这个公式看着复杂,其实你拆开看就明白了:
| 符号 | 含义 | 维度 |
|---|---|---|
| K | 内参矩阵(fx, fy, cx, cy) | 3×3 |
| R | 旋转矩阵(3个角度) | 3×3 |
| t | 平移向量(3个方向) | 3×1 |
| 畸变系数 | k1, k2, k3(径向), p1, p2(切向) | 5个参数 |
注意:畸变模型有很多种,最常用的是OpenCV采用的Brown-Conrady模型(5参数)。但有些高精度场景会用到更多参数(比如8参数、12参数)。我建议初学者先用5参数模型,够用且稳定。
我曾经在一个项目中,因为用了12参数的畸变模型,结果标定出来的参数过拟合了——对训练数据拟合得很好,但换一组照片就崩了。后来我换回5参数模型,反而更稳定。所以,参数不是越多越好,够用就行。
1.5 标定的常见方法
目前主流的标定方法有三种:
- 张正友标定法——用棋盘格,单相机,多角度拍摄。这是最常用的方法,OpenCV直接支持
- 自标定——不需要标定板,利用场景中的结构信息。精度较低,但灵活
- 主动视觉标定——需要精确控制相机运动。精度高,但设备要求高
我个人最推荐张正友法。为什么?因为它兼顾了精度和易用性。你只需要打印一张棋盘格,用相机拍十几张不同角度的照片,就能得到不错的标定结果。
避坑指南:我曾经因为棋盘格打印不平整,导致标定误差一直降不下去。后来换了亚克力板贴棋盘格,效果立竿见影。另外,拍摄时棋盘格要占画面1/3以上,角度变化要丰富(倾斜、旋转、远近都要有)。
好了,这一节的内容就到这里。总结一下:相机标定就是给相机做「视力矫正」,核心是解算内参和外参,最常用的方法是张正友标定法。下一节我们会手把手带你用OpenCV实现标定流程。