第一章 双目视觉基础
各位同学好,我是老张。在机器人行业摸爬滚打了十几年,今天咱们来聊聊双目视觉。说实话,我第一次接触双目视觉时,也被那些坐标系转换搞得头晕。但后来我发现,只要把基础打牢,后面的事情就顺了。
这一章,我们重点解决四个问题:双目视觉到底怎么工作的?视差和深度是什么关系?相机是怎么成像的?坐标系之间怎么转换?
核心观点:双目视觉的本质,就是模拟人眼。两只眼睛看同一个物体,角度不同,位置就有差异。这个差异,就是深度信息的来源。
1.1 双目视觉原理
说白了,双目视觉就是用两个相机从不同角度拍同一个场景。然后通过匹配左右图像中的对应点,计算出物体的三维位置。
我当年做第一个避障项目时,犯过一个低级错误——两个相机没对齐。结果算出来的深度全是错的。嗯,这里要注意:双目系统的两个相机必须严格平行放置,或者至少知道它们之间的相对位姿。
双目视觉的核心流程,我习惯分成三步:
- 图像采集:左右相机同步拍摄,获取两幅图像
- 立体匹配:找到左右图像中的对应点
- 三角测量:根据视差计算深度
你想想看,如果只有一只眼睛,你能判断距离吗?能,但精度差很多。这就是为什么机器人避障要用双目——深度信息是避障的核心。
个人经验:我在实际项目中,通常把双目基线(两个相机之间的距离)设在6-12厘米。太短了深度分辨率不够,太长了匹配难度增加。这个范围是我试出来的,你可以参考。
1.2 视差与深度计算
视差,就是同一个点在左右图像中的位置差。假设左图中点在像素坐标uL,右图中对应点在uR,那么视差d = uL - uR。
深度Z和视差d的关系很简单:
Z = (f * B) / d
其中:
- f:相机焦距(像素单位)
- B:基线长度(两个相机光心之间的距离)
- d:视差(像素)
为什么会这样?我画个图你就明白了。
从图上你能看到,目标点P在左右成像面上的位置不同。这个位置差就是视差d。物体越近,视差越大;物体越远,视差越小。
避坑指南:我曾经在室外场景中吃过亏——阳光太强导致图像过曝,视差计算全乱了。后来我加了自动曝光控制,才稳定下来。记住:图像质量直接决定视差计算的成败。
1.3 相机成像模型
相机成像,说白了就是把三维世界投影到二维图像上。最常用的模型是针孔相机模型。
针孔模型的数学表达:
u = f * (X / Z) + cx
v = f * (Y / Z) + cy
其中:
- (X, Y, Z):世界坐标系中的点
- (u, v):图像坐标系中的像素坐标
- f:焦距
- (cx, cy):主点坐标(光轴与成像面的交点)
我习惯把相机参数整理成矩阵形式,这样计算起来方便:
内参矩阵 K = [fx 0 cx]
[0 fy cy]
[0 0 1 ]
这里fx和fy分别是x和y方向的焦距。为什么会有两个?因为像素不一定是正方形的。我遇到过一些工业相机,fx和fy能差5%以上,这时候必须分别标定。
个人习惯:每次拿到新相机,我第一件事就是做标定。用棋盘格拍个20-30张图,跑一遍张正友标定法。别偷懒,这一步省了,后面全是坑。
1.4 坐标系转换
坐标系转换,是双目视觉里最容易出错的地方。我刚开始做的时候,经常把坐标搞反,算出来的深度是负的。你想想看,深度是负的,机器人往哪走?
双目视觉涉及四个坐标系:
| 坐标系 | 符号 | 说明 |
|---|---|---|
| 世界坐标系 | W | 描述物体在真实世界中的位置 |
| 相机坐标系 | C | 以相机光心为原点 |
| 图像坐标系 | I | 以成像面中心为原点(物理单位) |
| 像素坐标系 | P | 以图像左上角为原点(像素单位) |
转换流程是这样的:
- 世界 → 相机:通过外参矩阵(旋转R + 平移t)
- 相机 → 图像:通过内参矩阵K(透视投影)
- 图像 → 像素:通过缩放和平移(像素尺寸)
完整的转换公式:
Ppixel = K * [R | t] * Pworld
这里[R | t]是3×4的外参矩阵,K是3×3的内参矩阵。两者相乘得到一个3×4的投影矩阵。
避坑指南:我曾经在写代码时,把旋转矩阵和平移向量的顺序搞反了。结果算出来的点全飞到天上了。检查了三天才发现。记住:先旋转,后平移,这个顺序不能乱。
1.5 双目系统的标定
标定,就是确定相机的内参和两个相机之间的外参。没有标定,双目视觉就是空中楼阁。
标定步骤:
- 单目标定:分别标定左右相机的内参和畸变系数
- 双目标定:标定两个相机之间的旋转矩阵R和平移向量t
- 立体校正:对图像进行重投影,使左右图像的行对齐
立体校正这一步特别重要。校正之后,左右图像中同一个点就在同一行上。这样匹配时只需要搜索同一行,计算量大大降低。
核心要点:标定不是一次性的。温度变化、振动、镜头松动都会改变标定参数。我建议每隔一段时间重新标定一次,或者在系统中加入在线标定模块。
好了,这一章的内容就这些。双目视觉的基础打牢了,后面讲立体匹配和深度估计时,你就不会觉得吃力。记住我说的:坐标系转换别搞反,标定别偷懒,图像质量要保证。这三点做到了,你的双目系统就成功了一半。