第二章:相机成像模型——针孔相机模型、透镜畸变与内外参矩阵

做视觉引导定位,第一步要搞清楚的,就是相机到底怎么「看」世界的。

你想想看,一个三维空间里的点,怎么就能变成图像上那个像素坐标?这中间经历了什么?说白了,就是一套数学变换。我刚开始接触这行的时候,也觉得这些公式枯燥,但后来在产线上调试一个高精度对位项目,发现标定参数差一点点,抓取偏差就跑到毫米级去了。嗯,从那以后,我再也不敢小看这个模型了。

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 知识体系总览

下面这张图,是我自己整理的本章节知识结构。你可以把它当作一个「地图」,学完这一章,你应该能说清楚每个模块是干什么的。

相机成像模型知识体系 针孔相机模型 透镜畸变 内外参矩阵 相似三角形原理 归一化平面坐标 像素坐标映射 径向畸变 (k1,k2,k3) 切向畸变 (p1,p2) 畸变校正流程 内参矩阵 K 外参矩阵 [R|t] 6自由度位姿 完整成像模型:世界坐标 → 相机坐标 → 归一化平面 → 畸变校正 → 像素坐标 标定目的:求解内参 + 畸变参数 + 外参,建立精确的映射关系 应用场景:视觉引导定位、尺寸测量、3D重建

2.6 本章小结

这一章我们聊了相机成像的底层逻辑。记住三点:

  1. 针孔模型是基础,理解它你就能看懂所有成像公式。
  2. 畸变校正是精度保障,工业现场千万别跳过这一步。
  3. 内外参矩阵是坐标转换的桥梁,手眼标定就是解外参。

下一章,我们会把这些参数「算出来」——也就是相机标定的具体操作。到时候我会分享一些我在产线上踩过的坑,保证实用。

个人建议:学完这一章,你可以拿手机拍一张棋盘格照片,用 OpenCV 的 calibrateCamera 跑一遍。看看你的手机镜头畸变有多大。我试过,iPhone 的边缘畸变大概在 2-3 个像素,工业镜头通常控制在 0.5 像素以内。


公众号:蓝海资料掘金营,微信deep3321