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

说到相机成像,很多人第一反应就是「小孔成像」。没错,针孔相机模型就是基于这个最朴素的物理原理。但实际工程中,我们用的镜头可不是一个小孔那么简单。今天我就带你把这个模型彻底吃透。

4.1 针孔相机模型:从3D到2D的魔法

针孔相机模型,说白了就是描述「三维世界里的一个点,是怎么落到二维图像上的」。我刚开始做SLAM时,总觉得这东西太简单,结果在标定环节吃了不少亏。

先看核心公式。假设世界坐标系中有一个点 P(X, Y, Z),它经过相机光心投影到成像平面上,得到像素坐标 (u, v)。这个过程可以用一个矩阵乘法来描述:

s * [u, v, 1]^T = K * [R | t] * [X, Y, Z, 1]^T

这里 s 是尺度因子,K 是内参矩阵,[R|t] 是外参矩阵。嗯,先别被公式吓到,我们一步步拆解。

核心思想:针孔模型假设光线沿直线传播,所有光线都通过一个点——光心。成像平面在光心后方,距离为焦距 f。

我个人习惯把投影过程分成三步:

  1. 世界坐标系 → 相机坐标系:通过旋转和平移,把点从世界坐标挪到以相机为中心
  2. 相机坐标系 → 归一化平面:除以 Z 值,得到归一化坐标 (x/Z, y/Z, 1)
  3. 归一化平面 → 像素坐标系:乘以内参矩阵,得到最终像素坐标

你想想看,第二步为什么要除以 Z?其实就是为了消除深度信息,把三维点投影到二维平面上。这也是为什么单目相机无法直接恢复深度——因为深度信息在投影过程中丢失了。

4.2 畸变模型:镜头不是完美的

理想很丰满,现实很骨感。实际镜头不是完美的针孔,光线经过透镜时会发生弯曲。这就是畸变。

我在项目中遇到过最头疼的事:用广角镜头做视觉SLAM,图像边缘的畸变大到离谱,特征点匹配全乱套。后来才意识到,畸变校正这一步没做好,后面全是白费功夫。

畸变主要分两类:

4.2.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 是径向畸变系数。一般只用 k1、k2 就够了,k3 是给大畸变镜头准备的。

我的经验:标定时如果发现 k3 的值特别大,先别急着用。检查一下是不是标定板没拍好,或者图像质量有问题。我曾经有一次 k3 标出来比 k1 还大,结果发现是标定板反光了。

4.2.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 就是切向畸变系数。一般这两个值都很小,如果标出来特别大,嗯,你得检查一下镜头是不是拧紧了。

4.3 内参矩阵:相机的「身份证」

内参矩阵 K 是相机最核心的参数,它描述了相机内部的几何特性。一旦标定好,只要镜头和焦距不变,内参就是固定的。

内参矩阵长这样:

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

各参数含义:

参数 含义 单位
fx, fy 焦距在 x、y 方向的像素长度 像素
cx, cy 光心在像素坐标系中的位置 像素

为什么 fx 和 fy 可能不一样?因为像素不一定是正方形的。有些相机的像素是矩形,所以 x 和 y 方向的焦距会不同。

避坑指南:我曾经在标定一个工业相机时,发现 cx、cy 不在图像中心。一开始以为是标定错了,后来查手册才知道,这个相机的 CMOS 传感器本身就没对准镜头光轴。所以别想当然认为光心就在图像正中央。

4.4 完整成像流程:从世界点到像素

把上面所有知识串起来,一个三维点最终变成像素坐标的完整流程是:

  1. 世界坐标 P → 相机坐标 P_c(外参变换)
  2. 相机坐标 P_c → 归一化坐标 (x, y)(除以 Z)
  3. 归一化坐标 (x, y) → 畸变坐标 (x_d, y_d)(应用畸变模型)
  4. 畸变坐标 (x_d, y_d) → 像素坐标 (u, v)(内参矩阵变换)

你想想看,如果我们要做去畸变,其实就是把这个流程反过来:从像素坐标出发,先反算畸变前的归一化坐标,再投影回去。

4.5 知识体系总览

下面这张图是我自己整理的相机成像模型知识结构,帮你理清思路:

相机成像模型知识体系 相机成像模型 针孔相机模型 畸变模型 内参矩阵 世界→相机坐标 归一化投影 径向畸变 (k1,k2,k3) 切向畸变 (p1,p2) 焦距 fx, fy 光心 cx, cy 完整流程:世界点 → 外参 → 归一化 → 畸变 → 内参 → 像素 应用:视觉SLAM、三维重建、AR/VR

4.6 实战要点总结

最后,我把自己这些年踩过的坑和积累的经验整理成几条:

  • 标定板要拍全:每个角落都要覆盖到,尤其是图像边缘。边缘的畸变信息最丰富
  • 多角度拍摄:至少拍20张不同角度的标定板图像。角度变化要大,但别让标定板出画面
  • 检查重投影误差:标定完成后,看看重投影误差。一般小于0.5像素就算不错了
  • 别迷信高次项:k3、p2 这些高阶参数,除非你的镜头畸变特别大,否则慎用

一句话总结:相机成像模型就是「世界坐标 → 相机坐标 → 归一化 → 畸变 → 像素」这个流水线。内参矩阵是这条流水线的「固定参数」,畸变模型是「修正项」。搞懂了这些,外参标定就成功了一半。

嗯,这一章的内容就到这里。记住,理论是基础,但真正让你成长的是动手实践。找个相机,拍几张标定板,跑一遍标定流程,你会发现这些公式突然就活起来了。