第二章:相机成像模型——针孔相机模型、透镜畸变与内外参矩阵
做视觉引导定位,第一步要搞清楚的,就是相机到底怎么「看」世界的。
你想想看,一个三维空间里的点,怎么就能变成图像上那个像素坐标?这中间经历了什么?说白了,就是一套数学变换。我刚开始接触这行的时候,也觉得这些公式枯燥,但后来在产线上调试一个高精度对位项目,发现标定参数差一点点,抓取偏差就跑到毫米级去了。嗯,从那以后,我再也不敢小看这个模型了。
2.1 针孔相机模型——最朴素的成像原理
针孔相机模型,是所有成像模型的基石。它假设光线是直线传播的,穿过一个小孔,在后面的成像平面上形成倒像。
这个模型虽然简单,但足够描述大多数工业相机的工作方式。我们通常把成像平面「虚拟」到相机前方,这样图像就是正的了,计算起来也方便。
核心公式就一个:
// 从世界坐标到像素坐标的映射
// 假设相机坐标系下点 P(Xc, Yc, Zc)
// 归一化平面坐标 (x, y) = (Xc/Zc, Yc/Zc)
// 像素坐标 (u, v) = (fx * x + cx, fy * y + cy)
这里 fx, fy 是焦距在像素单位下的值,cx, cy 是光心在图像上的位置。这些参数,就是我们要标定的内参。
关键理解:针孔模型本质上是「相似三角形」关系。世界有多大,成像有多大,完全由焦距和物距决定。
2.2 透镜畸变——现实世界没有完美的针孔
实际镜头不是针孔,是透镜。透镜就有畸变。我在项目中遇到过最头疼的情况:标定板拍出来直线全是弯的,但肉眼看不出来。一测量,边缘偏差好几个像素。
畸变主要分两类:
2.2.1 径向畸变
这是最常见的畸变。光线经过透镜边缘时,弯曲程度比中心大。表现为图像边缘的直线向内或向外弯曲。
- 桶形畸变:图像向外膨胀,像桶一样。广角镜头常见。
- 枕形畸变:图像向内收缩,像枕头一样。长焦镜头常见。
数学上,我们用三个参数 k1, k2, k3 来描述:
// 径向畸变校正
r² = x² + y²
x_corrected = x * (1 + k1*r² + k2*r⁴ + k3*r⁶)
y_corrected = y * (1 + k1*r² + k2*r⁴ + k3*r⁶)
注意,k3 通常只在畸变很大的镜头(比如鱼眼)才用。普通工业镜头,标定 k1, k2 就够了。
2.2.2 切向畸变
这个畸变是因为镜头和成像平面不平行造成的。说白了,就是镜头装歪了。
切向畸变用两个参数 p1, p2 描述:
// 切向畸变校正
x_corrected = x + (2*p1*x*y + p2*(r² + 2*x²))
y_corrected = y + (p1*(r² + 2*y²) + 2*p2*x*y)
我的经验:标定的时候,如果重投影误差一直降不下去,先检查切向畸变参数。如果 p1, p2 数值很大(比如超过 0.1),大概率是镜头安装有问题,不是算法问题。
2.3 相机内参矩阵——把物理世界映射到像素
内参矩阵,就是把相机坐标系下的点,映射到像素坐标的桥梁。它长这样:
// 相机内参矩阵 K
K = | fx 0 cx |
| 0 fy cy |
| 0 0 1 |
这个矩阵里,fx, fy 是焦距,cx, cy 是光心。它们决定了:
- 一个物体在图像上有多大(fx, fy)
- 图像的中心在哪里(cx, cy)
我曾经犯过一个低级错误:把 cx, cy 直接设成图像宽高的一半。结果标定出来的参数怎么都对不上。后来才发现,光心不一定在图像正中心,尤其是工业相机,装配误差会导致光心偏移几十个像素。
避坑指南:千万不要手动指定 cx, cy 为图像中心。一定要通过标定算法算出来。我曾经因为偷懒,直接用了图像中心,结果手眼标定精度差了 0.5mm,找了好久才发现是这里的问题。
2.4 相机外参矩阵——把世界坐标转到相机坐标
外参矩阵描述的是相机在世界坐标系中的位置和姿态。它由旋转矩阵 R 和平移向量 t 组成:
// 外参矩阵 [R|t]
// 世界坐标点 Pw 转到相机坐标 Pc
Pc = R * Pw + t
外参矩阵有 6 个自由度:3 个旋转角度(绕 x, y, z 轴)和 3 个平移量。
在视觉引导定位中,外参矩阵就是「手眼标定」要解的东西。你想想看,机器人要抓一个工件,相机看到了工件的位置,但相机装在机器人上,你得知道相机相对于机器人末端的位姿,才能把相机看到的坐标换算成机器人能用的坐标。
核心逻辑:内参矩阵 + 畸变参数 + 外参矩阵 = 完整的相机成像模型。缺一个,你的坐标转换就不准。
2.5 知识体系总览
下面这张图,是我自己整理的本章节知识结构。你可以把它当作一个「地图」,学完这一章,你应该能说清楚每个模块是干什么的。
2.6 本章小结
这一章我们聊了相机成像的底层逻辑。记住三点:
- 针孔模型是基础,理解它你就能看懂所有成像公式。
- 畸变校正是精度保障,工业现场千万别跳过这一步。
- 内外参矩阵是坐标转换的桥梁,手眼标定就是解外参。
下一章,我们会把这些参数「算出来」——也就是相机标定的具体操作。到时候我会分享一些我在产线上踩过的坑,保证实用。
个人建议:学完这一章,你可以拿手机拍一张棋盘格照片,用 OpenCV 的 calibrateCamera 跑一遍。看看你的手机镜头畸变有多大。我试过,iPhone 的边缘畸变大概在 2-3 个像素,工业镜头通常控制在 0.5 像素以内。
公众号:蓝海资料掘金营,微信deep3321