成像几何基础:从针孔到立体视觉

大家好,我是你们的老朋友。今天咱们来聊聊立体匹配的根基——成像几何。说实话,这部分内容我当年学的时候也觉得挺枯燥的,但后来在实际项目中吃过亏,才明白这些基础有多重要。你想想看,如果连相机怎么成像、视差和深度怎么换算都搞不清楚,后面做代价聚合、视差优化,那不就成了空中楼阁吗?

好,咱们直接进入正题。这一章我会从最经典的针孔相机模型讲起,然后延伸到双目立体视觉系统,最后把极线几何和视差深度关系说透。嗯,这里要注意,每个概念我都会结合自己的项目经验来讲,希望能帮你少走弯路。

2.1 针孔相机模型

针孔相机模型,说白了就是用一个数学公式来描述「真实世界中的点是怎么映射到图像上的」。我记得刚入行时,总觉得这东西太理想化,实际相机哪有这么简单?但后来发现,几乎所有立体视觉算法都建立在这个模型之上。

先看核心公式。假设世界坐标系中有一个点 P = (X, Y, Z),它在图像平面上的投影为 p = (x, y)。那么有:

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

其中 f 是焦距。这个公式看起来简单,但背后藏着两个关键假设:

  • 光线直线传播:没有透镜畸变,光线穿过小孔直接到达成像平面
  • 倒立成像:实际图像是倒着的,但我们通常做翻转处理

我在实际项目中遇到过一个问题:用手机摄像头做双目测距,结果误差特别大。排查了半天,发现是手机镜头畸变太严重,针孔模型根本hold不住。后来加了畸变校正,精度才上来。所以这里要提醒大家:针孔模型是基础,但实际应用时一定要考虑畸变参数

核心要点:针孔模型建立了3D世界到2D图像的映射关系,是立体视觉的数学基石。但真实相机存在畸变,需要先做校正。

2.2 双目立体视觉系统

单目相机只能得到2D信息,丢失了深度。那怎么办?人类给了我们启发——用两只眼睛。双目立体视觉系统就是模仿人眼,用两个相机从不同角度拍摄同一场景,然后通过视差计算深度。

一个标准的双目系统包含:

  • 左相机:主相机,通常作为参考
  • 右相机:辅助相机,与左相机保持一定基线距离
  • 基线 B:两个相机光心之间的距离,这是深度估计的关键参数

我个人习惯把双目系统分成两类:

类型 特点 适用场景
平行光轴系统 两个相机光轴平行,成像平面共面 室内、近距离测距
汇聚光轴系统 两个相机光轴相交于一点 远距离、大场景

我建议初学者先从平行光轴系统入手,因为它的极线是水平的,处理起来简单很多。我曾经在做一个室外大场景项目时用了汇聚系统,结果极线校正那一步就折腾了两周,真是血的教训。

避坑指南:搭建双目系统时,基线长度不是越大越好。基线太长,近距离物体视差过大,匹配困难;基线太短,深度分辨率不够。一般根据目标测距范围来选,我常用的经验值是:基线 ≈ 目标距离的 1/10 到 1/20。

2.3 极线几何与对极约束

极线几何,听起来很高大上,其实核心就一句话:左图上的一个点,在右图上对应的匹配点一定在某一条直线上。这条线就叫极线。

为什么会这样?你想想看,左图上的点 pl 对应着空间中的一条射线(从光心出发经过 pl 的射线)。这条射线在右相机上投影,就是一条直线——极线。所以匹配点一定在这条线上,这就是对极约束。

对极约束的数学表达是:

prT * F * pl = 0

其中 F 是基础矩阵(Fundamental Matrix),它编码了两个相机之间的相对位姿和内部参数。这个公式告诉我们:只要知道 F,就可以把二维搜索降到一维搜索,效率提升可不是一星半点。

我记得有一次做实时立体匹配,原始算法在全图搜索,帧率只有5fps。后来加上对极约束,把搜索范围限制在水平极线上,帧率直接飙到30fps。嗯,这就是理论指导实践的好例子。

关键理解:对极约束将匹配搜索从二维降为一维,是立体匹配加速的核心手段。实际应用中,我们通常先做极线校正,让极线变成水平线,这样处理起来更方便。

2.4 视差与深度的关系

终于到了最核心的部分——视差和深度怎么换算。说白了,视差就是同一个空间点在左右图像上位置的差异。对于平行光轴系统,视差 d 定义为:

d = xl - xr

其中 xl 和 xr 分别是左右图像上的水平坐标。那么深度 Z 和视差 d 的关系是:

Z = (f * B) / d

这个公式太重要了,我建议你把它刻在脑子里。它告诉我们:

  • 视差越大,物体越近(分母大,Z小)
  • 视差越小,物体越远(分母小,Z大)
  • 深度与视差成反比,不是线性关系

这里有个容易踩的坑:视差是整数像素时,深度是离散的。比如 f=500像素,B=0.1米,那么视差 d=10 时 Z=5米,d=11 时 Z≈4.55米。你看,相邻视差对应的深度差有0.45米。这就是为什么亚像素精度在立体匹配中那么重要——它能显著提升深度分辨率。

注意:深度误差与距离的平方成正比。也就是说,物体越远,深度估计的误差越大。我在做自动驾驶项目时,50米外的物体深度误差可能达到±2米,但5米内的误差只有±5厘米。所以双目立体视觉更适合中近距离应用。

知识体系总览

下面这张图是我手绘的本章知识结构,帮你理清脉络:

成像几何基础 针孔相机模型 3D→2D映射 焦距f、光心 畸变校正 双目立体视觉 左右相机 基线B 平行/汇聚系统 极线几何 对极约束 基础矩阵F 一维搜索 视差与深度 Z = fB/d 反比关系 亚像素精度 核心逻辑链 针孔模型 → 双目系统 → 极线约束 → 视差深度换算 立体匹配的数学基础与物理约束

这张图把四个知识点串起来了。你看,从针孔模型到双目系统,再到极线几何,最后落到视差深度关系,这是一条完整的逻辑链。每个环节都不可或缺。

个人建议:学这一章时,不要死记公式。找个双目摄像头,拍几张照片,自己算算视差和深度,感受一下反比关系。我当年就是这么干的,效果比看书好十倍。

好了,成像几何基础就讲到这里。这些概念会贯穿整个立体匹配课程,后面讲代价计算、代价聚合时,我们还会反复用到。记住一句话:基础不牢,地动山摇。把这一章吃透了,后面的路就好走了。


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