第4章:相机内参回顾:针孔相机模型、内参矩阵与畸变参数

各位同学,欢迎来到第四章。在正式开始外参标定之前,我强烈建议大家先回头把内参这块儿夯实了。为什么?因为外参标定的精度,很大程度上依赖于内参是否准确。说白了,内参是相机的“出厂设置”,外参是相机在空间中的“站位”。设置错了,站位再准也没用。

这一章,我们就来系统地回顾一下相机内参的三大核心:针孔模型、内参矩阵、畸变参数。嗯,都是老朋友了,但咱们得用工程师的视角再审视一遍。

相机内参知识体系 针孔相机模型 内参矩阵 K 畸变参数 小孔成像原理 相似三角形 fx, fy 焦距 cx, cy 主点 像素坐标系 径向畸变 k1,k2,k3 切向畸变 p1,p2 目标:从3D世界点 → 2D像素点(去畸变)

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

针孔模型,说白了就是初中物理课上那个小孔成像实验。光线穿过一个小孔,在后面的屏幕上形成一个倒立的像。相机镜头虽然复杂,但核心思想没变——把三维世界投影到二维平面上。

数学上怎么描述?就是相似三角形。假设世界中的一个点 P(X, Y, Z),经过相机光心投影到成像平面上的点 p(x, y)。根据相似关系:

x = f * (X / Z)
y = f * (Y / Z)

这里的 f 是焦距,单位是毫米。但注意,这只是理想情况。实际相机里,成像平面是传感器(CCD/CMOS),我们最终拿到的是像素坐标,不是物理毫米坐标。所以需要引入内参矩阵来做单位转换。

💡 我的小经验: 很多初学者会混淆“焦距f”和“像素焦距fx”。前者是物理毫米,后者是像素。两者之间差一个像素尺寸因子。我在做第一次标定时,就因为这个换算搞混了,结果投影误差大得离谱。后来才意识到,OpenCV里标定出来的fx、fy已经是像素单位了,千万别再手动乘什么像素尺寸。

4.2 内参矩阵 K:从物理世界到像素坐标

内参矩阵 K 是一个 3x3 的上三角矩阵,它描述了相机坐标系下的3D点如何映射到图像像素坐标系。它的标准形式是:

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

我来拆解一下每个参数的含义:

参数 含义 单位 典型值范围
fx x方向上的像素焦距(f / dx) 像素 几百 ~ 几千
fy y方向上的像素焦距(f / dy) 像素 几百 ~ 几千
cx 主点x坐标(光心在像素坐标系中的位置) 像素 图像宽度的一半左右
cy 主点y坐标 像素 图像高度的一半左右

有了内参矩阵,完整的投影公式就是:

s * [u, v, 1]^T = K * [X_c, Y_c, Z_c, 1]^T

其中 s 是尺度因子(其实就是 Z_c),[u, v] 是像素坐标,[X_c, Y_c, Z_c] 是相机坐标系下的3D点。

⚠️ 注意: 内参矩阵中的 fx 和 fy 通常不相等!为什么?因为传感器像素不一定是正方形。我见过很多工业相机,像素是矩形的,fx 和 fy 能差 5% 以上。如果你强行假设 fx = fy,标定出来的外参会有系统性偏差。

4.3 畸变参数:现实总是不完美的

针孔模型是理想情况。但实际镜头有透镜,透镜就会引入畸变。畸变主要分两类:径向畸变和切向畸变。

4.3.1 径向畸变

径向畸变是沿着镜头半径方向分布的畸变。说白了,就是光线经过透镜边缘时弯曲得更厉害。它分为两种:

  • 桶形畸变:图像边缘向外凸出,像木桶一样。常见于广角镜头。
  • 枕形畸变:图像边缘向内凹陷。常见于长焦镜头。

数学上用三个参数 k1, k2, k3 来描述:

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^2 = x^2 + y^2,是像素点到光心的距离平方。k3 通常只在鱼眼镜头等大畸变情况下才需要。

⚠️ 我曾经踩过的坑: 有一次标定一个广角相机,我偷懒只用了 k1, k2 两个参数。结果在图像边缘区域,重投影误差始终降不下去。后来加上 k3,误差直接从 0.8 像素降到了 0.15 像素。所以,如果你的镜头畸变比较大,别省 k3。

4.3.2 切向畸变

切向畸变是由于镜头和传感器平面不平行(有安装倾斜)造成的。它用两个参数 p1, p2 来描述:

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]

切向畸变的数值通常比径向畸变小一个数量级。但别小看它,在精密测量中,这点偏差足以让三维重建结果偏掉几毫米。

4.4 完整的畸变模型

把径向和切向畸变合在一起,就是 OpenCV 里常用的畸变模型。畸变参数向量通常表示为:

dist_coeffs = [k1, k2, p1, p2, k3]

标定流程大致是:

  1. 拍摄多张不同角度的棋盘格图像
  2. 提取角点坐标
  3. 用最小二乘法同时优化内参和畸变参数
  4. 得到 K 矩阵和 dist_coeffs
💡 我的建议: 标定内参时,棋盘格图像至少拍 15-20 张。而且要让棋盘格出现在图像的各个角落——边缘、角落、中心都要覆盖。我见过有人只拍了 5 张正对着相机的图像,标定出来的畸变参数基本是错的。你想想看,畸变在边缘最明显,你都不拍边缘,怎么拟合出准确的畸变曲线?

4.5 为什么外参标定前必须知道内参?

这个问题很关键。外参标定的本质,是求解相机坐标系相对于世界坐标系的旋转和平移。但在这个过程中,我们需要把图像上的 2D 像素点反投影到 3D 空间。这个反投影过程,必须用到内参矩阵和畸变参数。

具体来说:

  • 先用畸变参数对图像做去畸变处理
  • 再用内参矩阵把像素坐标转换到归一化平面坐标
  • 最后结合外参,建立 3D-2D 的对应关系

如果内参不准,就好比你用一把没校准的尺子去量东西。量出来的外参,自然也是错的。所以,我个人的习惯是:每次做外参标定之前,先花 10 分钟重新标定一下内参。尤其是相机被拆装过、或者环境温度变化大的时候,内参可能会漂移。

📌 核心要点总结:
  • 针孔模型是基础,用相似三角形描述投影
  • 内参矩阵 K 包含 fx, fy, cx, cy,完成物理到像素的转换
  • 畸变参数包括径向 (k1,k2,k3) 和切向 (p1,p2),修正镜头缺陷
  • 内参不准 → 外参必歪,这是铁律

好了,内参这块儿我们就回顾到这里。下一章,我们将正式进入外参标定的核心内容。到时候你会发现,今天打下的内参基础,会派上大用场。

可可精品资料库