4. 摄像头成像模型:针孔模型、畸变模型、内参矩阵

各位同学,咱们今天聊聊摄像头成像这事儿。说实话,做传感器融合这么多年,我见过太多人上来就调对齐参数,结果怎么都对不准。为啥?因为没搞懂摄像头到底是怎么「看」世界的。

摄像头成像,说白了就是把三维世界「拍扁」成一张二维图片。这个过程里,有三个东西你必须吃透:针孔模型畸变模型内参矩阵。嗯,今天咱们一个一个掰开揉碎了讲。

4.1 针孔模型:最朴素的成像原理

先问大家一个问题:你小时候玩过小孔成像吗?拿个纸板戳个洞,阳光透过小孔在墙上投出倒像。摄像头的工作原理,本质上跟这个一模一样。

针孔模型假设光线是直线传播的。三维空间里一个点,经过小孔(光心),投射到成像平面上。这里有个关键点:成像平面上的像是倒立的。不过咱们的摄像头传感器和算法会自动把它正过来,所以平时你看到的照片是正的。

我个人习惯把针孔模型拆成三步来理解:

  1. 世界坐标系 → 相机坐标系:把物体从「世界位置」转换到「摄像头位置」来看
  2. 相机坐标系 → 图像坐标系:用相似三角形算出物体在成像平面上的位置
  3. 图像坐标系 → 像素坐标系:把物理位置映射到像素格子上去

这里有个公式,大家记一下:

u = f * (X / Z) + u0
v = f * (Y / Z) + v0

其中 (X, Y, Z) 是相机坐标系下的点,(u, v) 是像素坐标,f 是焦距, (u0, v0) 是光心在像素坐标系下的位置。

重点提醒: 这个公式看着简单,但它是整个摄像头模型的基石。你后面做标定、做对齐,全得靠它。我建议你把它抄下来贴在工位上。

4.2 畸变模型:现实世界没有完美的镜头

针孔模型是理想情况。但现实中的镜头,尤其是咱们车载上用的广角镜头,拍出来的照片是有「变形」的。你想想看,直线拍出来变弯了,这就是畸变。

畸变主要分两种:

  • 径向畸变:光线经过透镜边缘时弯曲得更厉害。离中心越远,变形越明显。拍出来的直线会变成向外凸(桶形畸变)或向内凹(枕形畸变)。
  • 切向畸变:镜头和传感器没装平行,有点歪。这个在量产车上比较常见,我遇到过好几次。

畸变模型用数学公式来描述:

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

这里 k1, k2, k3 是径向畸变系数,p1, p2 是切向畸变系数。r 是点到光心的距离。

我曾经踩过的坑: 做标定时只标了径向畸变,忽略了切向畸变。结果毫米波雷达投影到图像上,边缘区域总是偏几个像素。后来加上切向畸变参数,问题就解决了。所以,畸变模型一定要标全,别偷懒。

4.3 内参矩阵:摄像头的「身份证」

内参矩阵,说白了就是摄像头的「出厂设置」。它描述了摄像头内部的光学特性,包括焦距、光心位置、像素尺寸等。

内参矩阵 K 长这样:

K = [fx  0  cx
     0  fy  cy
     0   0   1]

其中:

  • fx, fy:x 和 y 方向的焦距(单位是像素)。注意,这两个值不一定相等,因为像素可能不是正方形。
  • cx, cy:光心在像素坐标系下的位置。理想情况下在图像正中心,但实际会有偏移。

内参矩阵的作用是什么?它把相机坐标系下的点,直接映射到像素坐标系。你想想看,有了内参矩阵,你就能知道一个三维点对应到图像上的哪个像素了。

我的小技巧: 拿到一个新摄像头,第一件事就是标定内参。我一般用 OpenCV 的棋盘格标定法,拍个二三十张不同角度的棋盘格照片,跑一遍 calibrateCamera 函数,内参和畸变系数就都出来了。整个过程也就十几分钟。

4.4 三者的关系:一个完整的成像流水线

好了,现在咱们把这三个东西串起来。一个三维点是怎么变成像素的?

  1. 世界坐标 → 相机坐标:用外参矩阵(旋转+平移)
  2. 相机坐标 → 归一化平面:除以 Z,得到归一化坐标 (x, y)
  3. 加畸变:用畸变模型对 (x, y) 做变形
  4. 投影到像素:用内参矩阵 K 把畸变后的坐标映射到像素 (u, v)

你看,每一步都离不开咱们今天讲的内容。所以我说,搞懂摄像头模型,是做好传感器融合的第一步。

一句话总结: 针孔模型告诉你「理想情况下怎么成像」,畸变模型告诉你「实际镜头有什么毛病」,内参矩阵告诉你「怎么把物理坐标变成像素坐标」。三者缺一不可。

4.5 实战建议:标定流程

最后,给大家一个标定流程的 checklist:

步骤 操作 注意事项
1 准备棋盘格标定板 棋盘格要平整,格子大小要精确测量
2 拍摄多角度照片 覆盖视野各个区域,至少20张
3 提取角点 用 findChessboardCorners 函数
4 标定内参和畸变 用 calibrateCamera 函数
5 验证标定结果 投影误差小于0.5像素才算合格

嗯,今天就到这儿。下一章咱们聊聊外参标定,也就是怎么把摄像头和毫米波雷达「对齐」到同一个坐标系下。到时候你会看到,今天学的内参和畸变模型,全都会用上。