一、标定基础:什么是相机标定?为什么需要标定?
各位同学,咱们今天聊点实在的。
你手里拿个摄像头,对着世界一拍,图像就出来了。但你想过没有——这张图像里的像素坐标,跟现实世界中的三维位置,到底是怎么对应的?
说白了,相机就是个把三维空间压缩成二维平面的设备。这个压缩过程,是有数学模型的。而相机标定,就是把这个模型的参数给算出来。
1.1 什么是相机标定?
相机标定,简单讲就是:找到相机内部的光学参数和外部的位置姿态参数。
我习惯把它拆成三块来看:
- 内参:焦距、主点、畸变系数。这些是相机本身的“基因”。
- 外参:旋转矩阵、平移向量。这些是相机在世界坐标系里的“站位”。
- 畸变模型:径向畸变、切向畸变。镜头不是完美的,总有点歪歪扭扭。
你想想看,如果不知道这些参数,你拿图像里的一个像素点,根本没法反推它在真实空间里的位置。这就是标定的意义。
核心公式(针孔模型):
s * [u, v, 1]^T = K * [R | t] * [X, Y, Z, 1]^T
其中:
(u, v) —— 图像像素坐标
(X, Y, Z) —— 世界坐标
K —— 内参矩阵
[R | t] —— 外参矩阵
s —— 尺度因子
1.2 为什么需要标定?
这个问题,我在项目里被问过无数次。
有一次,客户拿了个工业相机过来,说“我直接测距离,误差有5毫米,是不是相机坏了?”我一看,根本没标定。镜头畸变都没校正,误差不大才怪。
标定的必要性,我总结为三点:
- 消除畸变:镜头边缘的桶形或枕形畸变,不校正的话,测量全是歪的。
- 建立度量关系:像素距离 → 实际物理距离。没有标定,你只能比大小,不能算尺寸。
- 多传感器融合:如果你有双目、或者相机加激光雷达,标定是它们“对齐”的前提。
我曾经踩过的坑:
有一次做视觉引导抓取,标定板没贴平,结果外参算出来全是错的。机器人抓了三次,三次都抓空。后来发现是标定板翘了个角。嗯,标定板一定要贴平,这个细节别忽略。
1.3 单目视觉系统的典型应用场景
单目视觉,就是只用一个摄像头。别觉得它简单,应用场景其实非常广。
| 应用领域 | 典型场景 | 标定需求 |
|---|---|---|
| 工业测量 | 零件尺寸检测、缺陷检测 | 高精度内参 + 畸变校正 |
| 机器人视觉 | 视觉引导抓取、AGV导航 | 手眼标定 + 外参标定 |
| 自动驾驶 | 车道线检测、障碍物测距 | 内参 + 外参 + 地面标定 |
| 安防监控 | 目标跟踪、区域入侵检测 | 畸变校正 + 俯视变换 |
| AR/VR | 虚拟物体叠加、空间定位 | 实时标定 + 动态更新 |
我个人觉得,单目最大的优势就是便宜、简单、部署快。但代价是——它丢失了深度信息。所以标定精度直接决定了你能从二维图像里“挖”出多少三维信息。
1.4 标定的知识体系
这一章的内容,我习惯用一张图来串起来。你看下面这个结构:
我的建议:
刚开始学标定,别急着上复杂算法。先把针孔模型吃透,搞清楚内参外参到底在干什么。我见过太多人,OpenCV调个 calibrateCamera 就以为完事了,结果换了个镜头全废。模型理解到位了,工具只是顺手的事。
1.5 标定的输入与输出
标定不是凭空算的。你需要输入一些东西,才能得到输出。
| 输入 | 说明 | 典型值/要求 |
|---|---|---|
| 标定板图像 | 棋盘格、圆点阵、ChArUco等 | 至少10-20张,角度多样 |
| 标定板物理尺寸 | 格子边长、圆点间距 | 精度0.01mm以上 |
| 图像特征点坐标 | 角点、圆心等 | 亚像素精度提取 |
| 输出 | 说明 | 用途 |
|---|---|---|
| 内参矩阵 K | 3×3矩阵 | 像素 ↔ 归一化坐标 |
| 畸变系数 | 5个参数 (k1,k2,p1,p2,k3) | 图像去畸变 |
| 外参 [R|t] | 每张图像一组 | 世界 ↔ 相机坐标变换 |
| 重投影误差 | 标定质量的评价指标 | 通常 < 0.5像素算合格 |
嗯,这里要注意:重投影误差不是越小越好。我见过有人硬把误差压到0.01像素,结果过拟合了,换张图就崩。一般0.1~0.3像素就很好了。
1.6 本章小结
这一章咱们把标定的概念、必要性、应用场景和知识体系捋了一遍。说白了,标定就是给相机“配眼镜”——让它看清这个世界,并且知道自己在哪。
后面的章节,我会带你一步步走完整个标定流程。从选标定板、拍图像、提取角点,到算参数、评估质量,每一步我都会把项目里踩过的坑、总结的经验讲给你听。
准备好了吗?咱们开始动手。