3. 相机标定原理:内参、外参、畸变参数,张正友标定法核心思想
相机标定,说白了就是给相机做一次「视力矫正」和「身份登记」。
你想想看,我们拿到的原始图像,其实是三维世界在二维平面上的投影。这个投影过程,是由相机内部的光学结构和它在空间中的位置共同决定的。如果不搞清楚这些参数,你算出来的抓取点坐标,很可能跟实际位置差着十万八千里。
我个人习惯把标定分成两件事:算清楚相机自己的脾气(内参),和搞清楚它站在哪、往哪看(外参)。
3.1 内参:相机的「出厂设置」
内参描述的是相机内部的光学映射关系。它决定了三维空间中的一个点,到底落在图像传感器的哪个像素上。
核心参数就这几个:
- 焦距(fx, fy):镜头中心到成像平面的距离,单位是像素。注意,x和y方向的焦距可能不一样,因为传感器像素不一定是正方形。
- 主点(cx, cy):光轴与成像平面的交点,理论上在图像正中心,但实际装配总有偏差。
- 偏斜因子(s):描述像素坐标系x轴和y轴是否垂直。现代工业相机基本可以忽略,但老式相机或某些特殊镜头需要处理。
内参矩阵长这样:
K = [fx, s, cx]
[ 0, fy, cy]
[ 0, 0, 1]
我的经验: 我在项目里遇到过一台相机,标定出来的cx、cy偏离图像中心十几个像素。一开始以为是标定板没放好,反复标了三次才发现是相机模组装配公差。所以,别迷信「出厂参数」,自己标一遍最靠谱。
3.2 外参:相机在空间中的「站位」
外参描述的是相机坐标系相对于世界坐标系的位姿。说白了,就是相机放在哪、朝哪看。
它由两部分组成:
- 旋转矩阵 R(3×3):描述相机的朝向。
- 平移向量 t(3×1):描述相机的位置。
外参矩阵是一个4×4的齐次变换矩阵:
[R | t]
[0 | 1]
在抓取场景里,外参的作用是把机械臂基座坐标系下的点,转换到相机坐标系下,或者反过来。我习惯把外参标定叫做「手眼标定」,这部分后面会专门讲。
3.3 畸变参数:镜头的「真实面目」
没有镜头是完美的。畸变就是镜头带来的图像变形,主要分两类:
| 畸变类型 | 表现 | 数学模型 |
|---|---|---|
| 径向畸变 | 直线变弯,越靠近边缘越明显。桶形畸变(广角)或枕形畸变(长焦)。 | k1, k2, k3(泰勒展开系数) |
| 切向畸变 | 镜头与成像平面不平行,导致图像倾斜。 | p1, p2 |
畸变矫正公式(以径向畸变为例):
x_corrected = x * (1 + k1*r^2 + k2*r^4 + k3*r^6)
y_corrected = y * (1 + k1*r^2 + k2*r^4 + k3*r^6)
其中 r 是像素点到主点的距离。
避坑指南: 我曾经在一个项目中用了廉价镜头,畸变参数k1、k2都很大。当时没在意,结果在图像边缘的抓取点误差达到了5个像素。换算到实际空间,就是几毫米的偏差。对于精密抓取,这完全不可接受。所以,畸变矫正一定要做,而且要用高阶模型(k1、k2、k3都标出来)。
3.4 张正友标定法:为什么它成了行业标准?
张正友标定法,是1998年张正友教授提出的一种相机标定方法。它的核心思想是:用一张平面棋盘格,从不同角度拍几张照片,就能解出所有参数。
为什么它这么流行?我总结了几点:
- 操作简单:不需要精密的3D标定物,一张打印的棋盘格就行。
- 精度够用:对于大多数工业视觉场景,精度完全满足要求。
- 鲁棒性好:对噪声和遮挡有一定容忍度。
它的核心流程是这样的:
- 拍摄多张棋盘格图像:从不同角度、不同距离拍摄,至少3-5张,我建议10-20张。
- 提取角点:找到棋盘格上所有内角点的像素坐标。
- 计算单应性矩阵:每张图像对应一个单应性矩阵H,它描述了棋盘格平面到图像平面的映射。
- 求解内参:利用多个单应性矩阵的约束,解出内参矩阵K。
- 求解外参:内参已知后,每张图像的外参R、t就可以单独解出来。
- 优化所有参数:用非线性最小二乘法(比如Levenberg-Marquardt算法),对所有参数进行全局优化,最小化重投影误差。
核心思想一句话: 张正友标定法巧妙地利用了「平面到平面的映射」这一约束,把复杂的3D标定问题,简化为多个2D单应性矩阵的求解。它不需要知道相机在空间中的位置,只需要棋盘格在图像中的投影关系。
3.5 标定流程与知识体系
下面这张图,是我自己整理的相机标定知识体系。它把内参、外参、畸变、张正友标定法的关系,以及标定流程串在了一起。
3.6 标定实操中的几个关键点
理论说完了,聊聊实际干活时要注意的事。
- 棋盘格要平整:贴在硬质平板上,不要有褶皱。我见过有人用A4纸打印,贴在纸箱上,结果标定出来的畸变参数全是错的。
- 覆盖整个视野:棋盘格要在图像的各个区域都出现,尤其是边缘和角落。这样才能准确估计畸变参数。
- 角度要多样:不要只拍正对着的,要倾斜、旋转、远近都拍一些。角度变化越大,标定结果越稳定。
- 光照要均匀:避免反光和阴影,否则角点提取会出问题。
- 重投影误差是硬指标:标定完成后,检查重投影误差。一般要求小于0.1像素,如果大于0.3像素,说明标定质量有问题,需要重新拍。
我的习惯: 每次标定我都会拍20张左右,然后挑出重投影误差最小的10张重新优化。这样能有效剔除那些手抖或者对焦不准的坏图。
嗯,相机标定这部分就讲到这里。记住,标定是视觉定位的基石。基础打牢了,后面的抓取点计算才能准。