相机标定原理:针孔模型、内参矩阵、外参矩阵、畸变系数
相机标定,说白了就是搞清楚「相机是怎么看世界的」。我刚开始做视觉检测那会儿,总觉得标定是个玄学——明明摆好了棋盘格,算出来的参数却总是不对。后来踩的坑多了,才明白这背后的数学模型其实很清晰。
今天咱们就把相机标定的四个核心概念掰开揉碎:针孔模型、内参矩阵、外参矩阵、畸变系数。嗯,一个一个来。
1. 针孔模型:相机成像的「理想世界」
你想想看,相机拍照的本质是什么?就是把三维空间里的点,映射到二维图像上。针孔模型就是描述这个映射的最简单方式。
它的原理特别朴素:光线从物体出发,穿过一个小孔(光心),投射到成像平面上。这个过程中,物体和图像是倒立且缩小的。
核心公式:
假设三维空间点 P = (X, Y, Z),投影到图像平面上的点 p = (x, y),那么:
x = f * (X / Z)
y = f * (Y / Z)
其中 f 是焦距(光心到成像平面的距离)。
我在项目中遇到过一个问题:用针孔模型算出来的坐标,总是和实际测量值差一截。后来发现,是因为镜头不是理想针孔,而是有厚度的透镜组。但没关系,针孔模型作为基础框架,足够我们理解后续的矩阵变换。
3. 内参矩阵:相机「内部」的秘密
内参矩阵描述的是相机内部的几何特性。说白了,就是告诉你「像素坐标」和「物理坐标」之间怎么换算。
它的标准形式是 3x3 矩阵:
K = [[fx, 0, cx],
[ 0, fy, cy],
[ 0, 0, 1]]
其中:
- fx, fy:焦距在 x 和 y 方向上的像素尺度。如果像素是正方形,fx = fy。
- cx, cy:主点坐标,也就是光轴与图像平面的交点。理想情况下在图像中心,但实际会有偏移。
我的经验:标定内参时,棋盘格一定要拍够 15-20 张不同角度的照片。我曾经只拍了 8 张,结果算出来的 fx 和 fy 差了 3 个像素,导致后续测量精度全崩了。
内参矩阵的作用,就是把相机坐标系下的点 (Xc, Yc, Zc) 映射到像素坐标 (u, v):
[u] [fx 0 cx] [Xc]
[v] = [ 0 fy cy] [Yc]
[1] [ 0 0 1] [Zc]
4. 外参矩阵:相机「位置」的真相
外参矩阵描述的是相机在世界坐标系中的位置和朝向。说白了,就是相机「站在哪里、看向哪里」。
它由两部分组成:
- 旋转矩阵 R:3x3 矩阵,描述相机的朝向。
- 平移向量 t:3x1 向量,描述相机的位置偏移。
外参矩阵的完整形式是 4x4 齐次矩阵:
[R | t]
[0 | 1]
它的作用是把世界坐标系下的点 Pw 转换到相机坐标系下:
Pc = R * Pw + t
避坑指南:我曾经在标定外参时,把旋转矩阵和平移向量的顺序搞反了。结果算出来的相机位置,直接跑到了棋盘格后面。嗯,检查了三天才发现是矩阵乘法顺序的问题。记住:先旋转,再平移。
5. 畸变系数:现实世界的「不完美」
针孔模型是理想情况,但实际镜头都有畸变。最常见的两种:
- 径向畸变:镜头边缘的弯曲,像鱼眼效果。用 k1, k2, k3 三个参数描述。
- 切向畸变:镜头和成像平面不平行导致的偏移。用 p1, p2 两个参数描述。
畸变校正的公式长这样:
x_distorted = x * (1 + k1*r^2 + k2*r^4 + k3*r^6) + 2*p1*x*y + p2*(r^2 + 2*x^2)
y_distorted = y * (1 + k1*r^2 + k2*r^4 + k3*r^6) + p1*(r^2 + 2*y^2) + 2*p2*x*y
其中 r^2 = x^2 + y^2,是点到图像中心的距离。
实际经验:我做过一个高精度测量项目,要求误差小于 0.1mm。一开始没做畸变校正,测量结果偏差了 0.5mm。加上畸变校正后,精度直接提升到 0.05mm。所以,别小看这五个畸变系数,它们往往是精度的「最后一公里」。
6. 标定流程:从理论到实践
完整的相机标定流程,我一般分四步走:
- 采集图像:打印棋盘格,拍摄 15-20 张不同角度、不同距离的照片。
- 提取角点:用 OpenCV 的
findChessboardCorners找到棋盘格的内角点。 - 计算参数:用
calibrateCamera函数,同时算出内参、外参和畸变系数。 - 验证精度:用重投影误差(reprojection error)来评估标定质量。一般小于 0.5 像素就算合格。
我的习惯:标定完成后,我会拍一张新的棋盘格照片,手动计算几个角点的重投影误差。如果误差超过 0.3 像素,我就重新标定。别偷懒,这一步能省掉后面很多调试时间。
7. 知识体系总览
下面这张图,把相机标定的核心逻辑串起来了。你一看就明白:
从这张图可以看得很清楚:世界坐标经过外参矩阵变换到相机坐标,再经过内参矩阵投影到像素坐标,中间还要用畸变系数做一次校正。每一步都环环相扣,缺一不可。
8. 总结
相机标定这四个概念,我个人的理解是:
- 针孔模型是理想框架,告诉你「应该怎么算」。
- 内参矩阵是相机本身的「基因」,出厂就定了,但会随温度、震动轻微变化。
- 外参矩阵是相机的「姿势」,每次安装或移动后都要重新标定。
- 畸变系数是镜头的「性格」,广角镜头尤其明显,必须校正。
你想想看,如果这四个参数都搞清楚了,那视觉检测的精度就有了理论保障。剩下的,就是动手去标、去测、去验证。