
LabVIEW 做双目视觉测距?精度不输激光雷达!
用两台普通网络摄像头 + LabVIEW,就能实现高精度测距。这套方案成本低、效果好,做机器视觉项目的值得一看!
为什么需要双目视觉?
单目相机拍出来的照片,没有深度信息------你知道画面里有东西,但不知道它离你多远。
双目视觉模仿人眼:用两台相机从不同角度拍摄同一物体,通过左右图像的差异(视差)来计算距离。
相比激光雷达、超声波等测距方式,双目视觉有几个明显优势:
- **成本低**------两台网络摄像头就行
- **精度高**------可以达到厘米级
- **结构简单**------不需要复杂的发射接收装置
- **信息丰富**------不仅能测距,还能做三维重建
这套系统用了哪些硬件?
这套系统硬件构成很清晰:
核心设备
|--------|------------------------------|---------------|
| 部件 | 型号 | 用途 |
| 双目相机 | 海康威视 DS-2CD3T86FWDV2-I3S × 2 | 图像采集,800万像素 |
| 步进电机 | VSMD113_045T | 精确控制相机间距(基线距) |
| 滑轨 | 滚珠式,有效行程1000mm | 承载相机移动 |
| 接近开关 | 磁性金属检测,4mm | 限位保护 |
| 电源 | NES-350-12,12V/29A | 供电 |
关键设计
右目相机安装在步进电机驱动的滑轨上,可以左右移动改变基线距(两个相机之间的距离)。基线距越大,测量远距离物体的精度越高。通过 RS-485 串口控制电机,定位精度很高。
软件系统是怎么实现的?
第一步:相机标定
用张正友的棋盘格标定法,采集10组不同角度的棋盘格图像,在 MATLAB 中完成标定。
标定结果示例:
```
左相机内参:
fx=1646.34, fy=1624.02
u0=653.20, v0=384.55
畸变系数:k1=-0.7473, k2=0.9373
右相机内参:
fx=1640.49, fy=1633.38
u0=613.96, v0=365.63
畸变系数:k1=-0.8916, k2=1.6568
```
即使是两台同型号的相机,内参也有差异,标定就是修正这些差异。
第二步:图像校正
标定完成后,用得到的参数对图像做两件事:
-
畸变校正------消除镜头桶形/枕形畸变
-
极线校正------让左右图像的极线平行,这样匹配点只在同一行上搜索,速度翻倍
第三步:图像匹配(核心!)
采用的算法是灰度值金字塔匹配 + 归一化相关度(NCC):
金字塔策略:先把图像缩小到1/4、1/16......在低分辨率下粗匹配,再回到高分辨率精匹配。这样既保证了精度,又把计算量降到了原来的几分之一。
NCC 公式(简化理解):计算模板图和搜索子图的灰度相似度,值越接近1000,匹配越完美。
第四步:三维重建
得到匹配点后,利用三角测量原理计算距离:
```
距离 Z = (焦距 f × 基线距 T) / 视差 D
```
公式很简单,但实际实现要考虑相机光轴是否平行、畸变校正精度等因素。
实验结果怎么样?
他们在室内和室外分别做了实验:
室内测试
随机选取笔筒、盒子、胶水瓶等日常物品,在不同距离下测量。测距误差率控制在较低水平。
室外测试
建立36个测试点位(6×6网格),用3D耗材盒子作为靶标移动测量。
影响精度的因素
|---------|----------|
| 因素 | 影响趋势 |
| 基线距越大 | 远距离精度越高 |
| 物距越近 | 精度越高 |
| 匹配相似度越高 | 精度越高 |
| 系统误差 | 需多次标定消除 |
实际应用:无人水质监测船
系统最终应用于无人船的测距与避障------在水面上自动识别障碍物并计算距离,保障航行安全。
对 LabVIEW 开发者的启示
1. LabVIEW 做视觉完全可行
很多人觉得 LabVIEW 在视觉方面不如 OpenCV/Python,但通过 ActiveX 调用相机、MATLAB 脚本节点做标定,LabVIEW 完全可以胜任视觉项目。
2. 混合编程是最佳方案
这套系统的技术栈是:
- **LabVIEW** → 界面、控制、图像采集
- **MATLAB** → 标定算法、图像校正
- **串口通信** → 控制步进电机
各取所长,才是工业项目的正确打开方式。
3. 机器视觉是 LabVIEW 的高附加值领域
做采集控制的人很多,但能做视觉 + 测控的团队不多。这个方向的项目附加值高,竞争相对小,值得深耕。