第二章 相机成像模型与标定基础

做双目视觉这些年,我最大的体会是——标定是灵魂,模型是骨架。很多新手一上来就调立体匹配参数,折腾半天效果还是差,回头一看,原来是标定就没做好。嗯,这章我们就从最基础的针孔模型讲起,把相机怎么「看」世界这件事彻底说清楚。

本章核心脉络:针孔模型 → 畸变矫正 → 标定原理 → 标定板选择

相机成像模型与标定 ① 针孔相机模型 ② 透镜畸变 ③ 张正友标定法 ④ 标定板选择与制作 四步走:从理论模型到工程实践

2.1 针孔相机模型——相机是怎么「看」的?

说白了,针孔模型就是用一个数学公式描述「三维世界里的点,怎么映射到二维图像上」。你想想看,光线从物体表面反射,穿过镜头中心(光心),打在传感器上——这就是最朴素的成像过程。

我个人习惯把这个模型拆成四步走:

  1. 世界坐标系:物体在真实空间中的位置 (X, Y, Z)
  2. 相机坐标系:以光心为原点,Z轴指向镜头前方
  3. 图像坐标系:在成像平面上,单位是毫米
  4. 像素坐标系:最终图像上的行列坐标 (u, v)

核心公式其实就一个投影关系:

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

其中 K 是内参矩阵,[R | t] 是外参。内参决定了镜头本身的特性,外参决定了相机在世界中的位置和朝向。

我的经验:刚开始做双目时,我总搞混内参和外参。后来我给自己编了个口诀——「内参是相机的基因,外参是相机的位置」。基因不变,位置可以变。这样就好记多了。

2.2 透镜畸变——理想很丰满,现实很骨感

针孔模型是理想情况。但实际镜头嘛……嗯,总会有偏差。这就是畸变。我在项目中遇到过最头疼的情况——标定出来的内参看着没问题,但双目校正后图像就是不对齐。查了半天,原来是畸变参数没给对。

畸变主要分两种:

径向畸变(Radial Distortion)

说白了就是镜头边缘的弯曲。离中心越远,变形越明显。常见的有两种:

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

数学上用泰勒级数来建模:

x_corrected = x * (1 + k1*r^2 + k2*r^4 + k3*r^6)
y_corrected = y * (1 + k1*r^2 + k2*r^4 + k3*r^6)

其中 r 是像素到光心的距离,k1、k2、k3 是径向畸变系数。一般用 k1、k2 就够了,k3 是给鱼眼镜头准备的。

切向畸变(Tangential Distortion)

这个是因为镜头和传感器没有完全平行安装造成的。说白了就是「装歪了」。公式也不复杂:

x_corrected = x + [2*p1*x*y + p2*(r^2 + 2*x^2)]
y_corrected = y + [p1*(r^2 + 2*y^2) + 2*p2*x*y]

p1、p2 就是切向畸变系数。

避坑指南:我曾经在调试一款工业相机时,发现标定结果反复跳动。后来才发现——镜头没锁紧!每次移动相机,镜头都会轻微晃动。所以,标定前务必检查镜头是否固定。这是血的教训。

2.3 相机标定原理——张正友标定法

说到标定,就绕不开张正友标定法。这是1998年张正友教授提出的方法,用一张棋盘格就能搞定内参和外参。为什么它这么流行?因为简单、实用、精度够。

核心思想就三步:

  1. 拍多张棋盘格照片:从不同角度拍摄,至少10-15张。我建议20张左右,覆盖视野的各个区域。
  2. 提取角点:找到棋盘格上每个黑白格子的交点。
  3. 求解参数:利用角点的世界坐标和像素坐标,建立方程组,用最小二乘法求解。

具体来说,张正友法利用了棋盘格是平面这个特性(Z=0),把问题简化了。它先忽略畸变,求出内参的闭式解,然后再用最大似然估计优化所有参数(包括畸变系数)。

关键点:张正友法要求棋盘格是平面的。如果标定板不平整,标定结果就会出问题。我见过有人用打印纸贴在弯曲的纸箱上标定……结果可想而知。

2.4 标定板的选择与制作

标定板选得好,标定就成功了一半。我个人习惯根据场景选择:

标定板类型 适用场景 优点 缺点
棋盘格(Checkerboard) 通用场景,室内/实验室 角点检测简单,成本低 需要整张可见,边缘角点易丢失
圆点阵(Circle Grid) 大视场角、广角镜头 圆心定位精度高 检测算法稍复杂
ChArUco板 部分遮挡场景、大视野 部分可见也能标定 需要额外解码库
高精度玻璃板 工业级、高精度需求 平面度极高,精度最好 贵,易碎

制作标定板时,有几点要注意:

  • 打印精度:用激光打印机,不要用喷墨。喷墨的墨点扩散会影响角点精度。
  • 衬板:贴在平整的硬板上,比如亚克力板或铝板。我推荐3mm厚的亚克力,性价比高。
  • 尺寸:每个格子边长20-30mm比较合适。太小了角点检测不准,太大了又不好覆盖视野。
  • 格子数:建议9×6或11×8(内角点)。奇数×偶数可以避免方向歧义。

我的小技巧:标定板不要做得太大。够用就行。太大的标定板容易弯曲,反而引入误差。我一般做A3纸大小,贴在亚克力板上,用了两年都没变形。

嗯,这一章的内容就到这里。模型是基础,畸变是现实,标定是桥梁,标定板是工具。把这四块吃透了,后面的双目校正和立体匹配才能站得住脚。


专注资料整理