第二章 相机模型与成像原理
说实话,搞视觉定位这么多年,我见过太多人一上来就调算法、跑SLAM,结果定位精度死活上不去。最后排查下来,往往是相机模型没搞明白——内参标定不准、畸变没校正,后面的一切都是空中楼阁。
这一章,咱们就把相机成像这件事彻底说透。你想想看,相机到底是怎么把三维世界变成一张二维照片的?这里面藏着哪些坑?我踩过的那些雷,今天一并告诉你。
2.1 针孔相机模型——最朴素的成像原理
针孔相机模型,说白了就是初中物理的小孔成像。光线穿过一个小孔,在后面的感光平面上形成倒立的像。虽然现在的相机镜头复杂得多,但数学上我们依然用这个模型来近似。
这里有个关键点:我们假设相机是线性模型。什么意思?就是三维空间中的一条直线,投影到图像上还是一条直线。嗯,这个假设在理想情况下成立,但实际镜头会引入畸变,这个后面再说。
核心公式:
三维点 P(X, Y, Z) 投影到图像平面上的点 p(u, v):
u = f * X / Z + c_u
v = f * Y / Z + c_v
其中 f 是焦距,c_u、c_v 是主点偏移。
我个人习惯把相机模型理解成一个「映射函数」——输入是三维坐标,输出是像素坐标。这个映射关系,就是由内参矩阵来描述的。
2.2 内参矩阵——相机的「身份证」
内参矩阵,每个相机都不一样。它包含了五个参数:
| 参数 | 符号 | 含义 |
|---|---|---|
| 焦距(x方向) | f_x | 像素单位下的水平焦距 |
| 焦距(y方向) | f_y | 像素单位下的垂直焦距 |
| 主点(x方向) | c_x | 光轴与成像平面交点的x坐标 |
| 主点(y方向) | c_y | 光轴与成像平面交点的y坐标 |
| 倾斜因子 | s | 像素坐标系倾斜(通常为0) |
写成矩阵形式就是:
K = [f_x s c_x]
[0 f_y c_y]
[0 0 1 ]
我在项目中遇到过一件事:有一次用手机摄像头做AR,标定出来的内参矩阵里 f_x 和 f_y 差了将近10%。一开始我以为是标定出错了,后来查资料才发现——手机摄像头的像素不是正方形的!所以 f_x 和 f_y 不一样是正常的。
我的经验:拿到一个新相机,第一件事就是标定内参。别偷懒,这一步省了,后面所有算法都会出问题。
2.3 畸变模型——镜头不是完美的
现实中的镜头都有畸变。你想想看,镜头是曲面玻璃,光线穿过时会发生折射,导致图像边缘的直线变弯了。畸变主要分两种:
2.3.1 径向畸变
径向畸变是沿着半径方向的变形。离中心越远,变形越明显。常见的有两种:
- 桶形畸变:图像向外膨胀,像桶一样。广角镜头常见。
- 枕形畸变:图像向内收缩,像枕头一样。长焦镜头常见。
数学上用泰勒级数来建模:
x_distorted = x * (1 + k1*r^2 + k2*r^4 + k3*r^6)
y_distorted = y * (1 + k1*r^2 + k2*r^4 + k3*r^6)
其中 r 是像素到主点的距离,k1、k2、k3 是径向畸变系数。
注意:k3 通常只用于鱼眼镜头。普通镜头用 k1、k2 就够了。我曾经见过有人把 k3 也加上去,结果标定出来的畸变模型反而更差了——过拟合了。
2.3.2 切向畸变
切向畸变是因为镜头和成像平面不平行造成的。说白了,就是镜头装歪了。数学上:
x_distorted = x + [2*p1*x*y + p2*(r^2 + 2*x^2)]
y_distorted = y + [p1*(r^2 + 2*y^2) + 2*p2*x*y]
p1、p2 就是切向畸变系数。
我记得有一次做双目视觉,左右相机标定完发现基线长度总是不对。排查了两天,最后发现是切向畸变没校正——其中一个相机的镜头稍微歪了一点点,导致整个三维重建都偏了。
2.4 相机标定基础——给相机「量尺寸」
相机标定,就是求解内参和畸变系数的过程。最经典的方法是张正友标定法——用棋盘格拍几张照片,然后解方程。
基本步骤:
- 打印一张棋盘格标定板
- 从不同角度拍摄10-20张照片
- 检测每张照片中的角点
- 用最小二乘法求解内参和畸变系数
- 用非线性优化进一步精化结果
标定结果示例(640×480分辨率):
内参矩阵 K:
[532.12 0 312.45]
[ 0 531.89 245.67]
[ 0 0 1 ]
畸变系数:
k1 = -0.2834, k2 = 0.0732
p1 = 0.0012, p2 = -0.0008
这里有个坑:标定板的精度直接影响标定结果。我建议用玻璃基板的标定板,不要用打印纸贴墙上——纸会变形,角点位置就不准了。
避坑指南:
- 标定照片要覆盖整个视场——边缘、角落都要拍到
- 标定板不要离相机太远,占画面1/3到1/2最好
- 每张照片的标定板角度要不同——旋转、倾斜都要有
- 标定完一定要验证——用重投影误差判断,一般小于0.5像素就算合格
2.5 知识体系总览
这一章的内容比较多,我画了一张图帮你理清思路:
这张图把整个知识体系串起来了。从针孔模型出发,到内参矩阵描述映射关系,再到畸变模型修正现实偏差,最后用相机标定把这一切参数求出来。每一步都环环相扣。
嗯,这一章的内容就到这里。记住一句话:相机模型是视觉定位的基石,基石不稳,楼盖得再高也得塌。下一章咱们开始讲坐标系变换,那又是另一片天地了。