1. 3D视觉测量概述
1.1 从2D到3D:为什么我们非做不可?
做机器视觉这些年,我越来越觉得——2D视觉就像用一只眼睛看世界。你想想看,一张平面图像能告诉你什么?位置、角度、有没有缺陷,这些确实够用。但一旦遇到高度、深度、立体形状,2D就彻底没辙了。
我记得刚入行那会儿,有个项目要测量手机中框的平面度。客户拿来的样品,用2D相机拍出来全是平的——因为从正上方看,所有点都在一个焦平面上。可实际上呢?中框边缘翘起了0.15mm。用千分表打点测,一个产品要花3分钟。后来换成3D线激光,3秒搞定。这就是从2D到3D最直接的驱动力。
从技术演进来看,3D视觉大致经历了三个阶段:
| 阶段 | 代表技术 | 典型应用 | 我的评价 |
|---|---|---|---|
| 1.0 接触式 | 三坐标测量机(CMM) | 精密模具检测 | 精度高,但慢,还怕划伤工件 |
| 2.0 结构光/双目 | 光栅投影、双目立体视觉 | 电子元件高度测量 | 速度快了,但对环境光敏感 |
| 3.0 线激光/ToF | 线激光轮廓仪、飞行时间相机 | 在线全检、AGV避障 | 现在的主流,Halcon支持得最好 |
说白了,3D视觉不是要取代2D,而是补上2D缺的那一维。我现在的习惯是:能2D解决的问题绝不用3D,但一旦涉及高度、平面度、体积、间隙面差——直接上3D,别犹豫。
1.2 3D测量的三个核心概念
刚接触3D视觉的人,经常被一堆术语搞晕。其实你只要抓住三个东西:点云、深度图、视差。这三者就是3D数据的三种“长相”。
1.2.1 点云(Point Cloud)
点云是什么?就是一堆三维点的集合。每个点有X、Y、Z三个坐标,有时候还带灰度值或RGB颜色。你可以把它想象成用激光扫描仪给物体“打点”,打出来的点密密麻麻,就构成了物体的表面形状。
我在项目中遇到过最头疼的事:点云数据量太大。一个手机中框扫下来,轻松上百万个点。直接处理?Halcon都能卡死。所以后来我养成了习惯——先降采样,再处理。
sample_object_model_3d 做均匀降采样,一般保留10%~20%的点就够了。别贪多,精度损失几乎看不出来。
1.2.2 深度图(Depth Map)
深度图本质上还是一张图像,但每个像素的值不再是灰度或RGB,而是该点到相机的距离(Z值)。你可以把它理解成一张“海拔图”——越亮的地方离相机越近,越暗的地方越远。
深度图的好处是:处理速度快,因为它是2D结构。坏处是:丢失了X、Y方向的精确信息。所以深度图适合做快速检测,比如有没有缺料、有没有凸起。但要做高精度测量,还是得回到点云。
1.2.3 视差(Disparity)
视差是双目立体视觉的核心概念。简单说:同一个物体点,在左右两个相机里成像位置不一样,这个位置的差值就是视差。视差越大,物体离相机越近;视差越小,物体越远。
为什么提这个?因为Halcon的3D重建算法,底层就是靠视差图来生成深度图,再转成点云的。你如果做双目立体视觉项目,视差图的质量直接决定了最终测量精度。
1.3 Halcon 3D模块:到底能干什么?
Halcon的3D模块,我用了快十年。说实话,它是我见过最完整的商业3D视觉库。别的工具要么只能读点云,要么只能做标定,Halcon是从采集到测量到输出,一条龙全包。
下面这张图是我自己整理的Halcon 3D模块知识体系,你一看就明白:
从这张图你能看到,Halcon 3D模块不是零散的几个算子,而是一套完整的数据处理流水线。我个人最常用的几个算子:
- 标定相关:
calibrate_cameras、set_calib_data_cam_param——这是3D测量的地基,地基不稳,后面全白搭 - 重建相关:
disparity_to_point_3d、xyz_to_object_model_3d——把视差图转成点云,核心中的核心 - 测量相关:
distance_from_plane、fit_primitive_object_model_3d——拟合平面、测量距离,实战最常用
hdevelop 里的3D示例跑一遍,尤其是 calibrate_hand_eye_stationary_model_3d.hdev 和 measure_plane_distance.hdev。跑通了,你就有感觉了。
1.4 本章小结:你该带走什么?
这一章我们聊了三个东西:
- 从2D到3D的演进——不是替代,是互补。遇到高度、平面度、体积问题,果断上3D。
- 三个核心概念——点云是“真3D”,深度图是“伪3D”,视差是“桥梁”。三者的关系要理清。
- Halcon 3D模块——从数据获取到结果输出,一条龙。标定是地基,重建是核心,测量是目的。