1. 双目视觉基础:测距的起点
做机器视觉这些年,我接触过不少测距方案。结构光、TOF、激光雷达……各有各的脾气。但要说最贴近人类视觉的,还得是双目视觉。说白了,就是给机器装上两只“眼睛”,让它像我们一样判断距离。
这一章,我们先把地基打牢。双目测距的原理其实不复杂,但细节里藏着不少坑。我当年刚入行时,就因为在视差计算上栽过跟头,后来才明白——基础不牢,后面全是白搭。
1.1 双目测距的基本原理
想象一下,你用两只眼睛看一个物体。左眼和右眼看到的画面其实略有不同。这个差异,就是“视差”。大脑就是靠这个视差,来判断物体离你有多远。
双目相机模仿的就是这个过程。两个相机同时拍摄,得到左右两张图。然后找到同一个物体在两张图上的位置差异——也就是视差。视差越大,物体越近;视差越小,物体越远。
核心公式:
深度 Z = (f × B) / d
其中:
- Z — 物体到相机的距离(深度)
- f — 相机焦距
- B — 基线长度(两个相机光心之间的距离)
- d — 视差(同一物体在左右图像上的像素差)
这个公式看着简单,但实际用起来,每个参数都有讲究。我见过不少新手,上来就套公式,结果测出来的距离偏差很大。为什么?因为公式里的 f 和 B 都是理想值,而实际相机总有误差。
1.2 视差与深度的关系
视差和深度不是线性关系。这一点很重要。你想想看,物体离得近时,视差变化很敏感;离得远时,视差变化就迟钝了。
举个例子:
| 深度 Z (mm) | 视差 d (像素) | 视差变化 1 像素对应的深度变化 (mm) |
|---|---|---|
| 500 | 100 | 约 5.0 |
| 1000 | 50 | 约 20.0 |
| 2000 | 25 | 约 80.0 |
| 5000 | 10 | 约 500.0 |
看到没?距离越远,视差变化对深度的影响越大。这意味着什么?意味着远距离测距时,视差计算必须非常精确。差一个像素,距离可能就差了几十甚至几百毫米。
我的经验: 做远距离测距时,我一般会建议用亚像素级别的视差计算。整像素级别的精度,远距离根本不够用。曾经有个项目,客户要求 10 米处误差小于 1%,我们硬是把视差精度做到了 0.1 像素级别。
1.3 三角测量法
三角测量法,说白了就是几何问题。两个相机和物体之间,构成了一个三角形。已知两个相机的位置和角度,就能算出物体的位置。
具体来说:
- 左相机看到物体在图像上的某个位置
- 右相机看到物体在图像上的另一个位置
- 这两个位置加上相机光心,构成两条射线
- 两条射线的交点,就是物体的实际位置
理想情况下,两条射线应该交于一点。但实际中,由于噪声和误差,它们往往不会完美相交。这时候就需要用最小二乘法来求最优解。
注意: 三角测量法对相机标定精度非常敏感。我曾经遇到过一个案例,标定参数差了 0.1 度,结果 5 米处的测距误差直接飙到了 20 厘米。所以,标定这一步千万别马虎。
1.4 相机成像模型
要理解双目测距,必须先搞懂相机是怎么成像的。这里我简单讲一下针孔相机模型——这是最基础、最常用的模型。
针孔模型的核心思想:
- 光线从物体出发,穿过相机光心
- 在成像平面上形成倒立的像
- 通过数学变换,把三维世界坐标映射到二维图像坐标
数学上,这个映射关系可以写成:
s * [u, v, 1]^T = K * [R | t] * [X, Y, Z, 1]^T
其中:
- u, v — 图像像素坐标
- X, Y, Z — 世界坐标
- K — 相机内参矩阵(焦距、主点等)
- R, t — 相机外参(旋转和平移)
- s — 尺度因子
这个公式看着有点吓人,但实际用起来,其实就是几个矩阵乘法。我习惯把内参理解为“相机自己的脾气”,外参理解为“相机在空间中的位置和朝向”。
内参矩阵 K 长这样:
K = [fx, 0, cx
0, fy, cy
0, 0, 1]
fx, fy 是焦距(像素单位),cx, cy 是主点坐标。这些参数,都需要通过标定来获得。
1.5 知识体系总览
这一章的内容,我画了个图帮你理一理。双目测距的整个知识链条,其实就这几块:
嗯,这张图基本把这一章的核心内容串起来了。从基本原理出发,到视差与深度的关系,再到三角测量法和相机模型——每一步都是后面章节的基础。
一个小建议: 刚开始学双目测距,别急着调算法。先把相机模型吃透,把标定做好。我见过太多人,算法调得飞起,结果发现是标定参数有问题——白忙活一场。
好了,这一章就到这里。记住,双目测距的核心就一句话:视差是桥梁,深度是目标。后面的章节,我们会一步步深入,看看怎么把这个桥梁搭得更稳、更准。