做机器视觉这些年,我见过太多项目在产线上翻车。翻车原因千奇百怪,但最后复盘时几乎都能追到同一个源头:光没伺候好。图像上那条你死活找不到的缺陷,不是算法不够聪明,而是光根本没把它拍出来。所以《机器视觉技术十讲》第二讲,我想认真聊聊工业光学系统设计。这讲不扯玄学,只说清楚两件事:为什么光学是视觉项目的生死线,以及从照明、镜头到相机匹配,怎么一步步把光学系统落地。你如果刚开始学机器视觉,或者手里正压着一个打光不定的项目,这一讲能让你少走大半年弯路。
1. 为什么90%的视觉项目折在“光”上
1.1 算法是下游,成像是源头
每个机器视觉项目,本质上都是一条数据流水线:光源把目标特征“翻译”成灰度图,镜头和相机把这些光信号变成数字图像,算法再从图像里找特征、做判断。大多数人在学机器视觉时,把所有精力都砸在算法环节——滤波、边缘提取、模板匹配、深度学习——上来就问用哪个算子、调什么参数。这没有错,但忽略了最要命的前提:如果图像里压根没有你想要的细节,算法再强也是无米之炊。
我习惯用一个特别土的比喻:视觉系统就像人眼加大脑。大脑再聪明,眼神不好,看什么都是糊的。你让一个近视五百度不戴眼镜的人去数钞票,他只会告诉你满眼都是“花不棱登”的一片。工业视觉也一样,光源、镜头、相机负责把“钞票上的数字”清楚投射到视网膜上,算法负责“认清数字”。前者做不到,后者一定完蛋。
更麻烦的是,算法写错了,改代码很快;光学方案做错了,往往要换灯、换镜头、加遮光罩、改结构件,周期以周为单位。一个项目从需求评审到量产导入,少则一个月多则半年,光学试错的时间和金钱成本极高。这也是为什么我会在视觉项目里坚持“先处理光,再谈算法”。特别是做零件缺陷检测、字符识别这类对细节敏感的项目,打光方案没定稿之前,我根本不敢碰算法模型。
1.2 光学翻车的常见现场
说几个我自己经历过的场景。第一个是金属零件表面缺陷检测。客户给了一堆不锈钢垫片,要求区分表面划伤和合格品。一开始我们用常规环形光直接打,结果金属表面亮得像镜子,反光区域在图像里白花花一片,配合视觉软件检测出的“缺陷”一抓一大把,过检率飙到三成。后来换了低角度暗场照明,让划痕把光散射进镜头,合格品区域保持黑暗,特征一下就跳出来了。这个案子从头到尾,算法只用了最简单的阈值分割,真正解决问题的是光路。
第二个是电子秤数码管读数识别。客户想做自动读取测试工位上的称重数值。数码管本身会频闪,再加上车间顶上日光灯的干扰,拍到的图像有时数字缺笔画,有时出现叠影。最开始大家怀疑算法不够好,换了好几种OCR模型,准确率还是上不去。后来把相机曝光时间压到微秒级,配上可频闪的条形光源,与数码管刷新频率错开,画面才稳定下来。这时候做电子秤数值识别,难度直接降了一个数量级——你都不用上深度模型,传统的模板匹配就能跑得很顺。
这两个例子都指向同一个结论:多数死在“光”上的项目,不是真的无解,而是大家习惯性地先怪软件,不愿意回头检查光学。我在机器视觉社区里看过太多求助帖,描述完现象后贴一堆算法参数,最后给出现场照片,一眼就能看出是打光不均或曝光不合理。但提问的人往往已经陷在算法里好几天了,这很可惜。
1.3 为什么光学容易被系统性低估
这不是某一个人的问题,而是行业的学习路线和项目分工造成的。你去搜机器视觉学习路线,十份里九份是从图像采集协议开始,然后OpenCV、Halcon、LabVIEW、深度学习一路往上。很少有人告诉你,在学所有算子之前,应该先弄明白一盏环形灯和一条条形灯的区别、同轴光和背光各自适合什么场景。教材和课程都默认光学是“硬件工程师的事”,可中小项目里根本没有专职光学工程师,最后只能靠做软件的现场硬扛。
再加上视觉方向的社区、社群也偏重算法讨论,大家晒出来的都是模型效果图、识别率曲线,很少有人晒光源打到什么角度、镜头光圈开多少、曝光时间设多少。这就让新手产生一种错觉:机器视觉约等于写图像处理代码。其实产线交付时,客户根本不关心你有多少行代码,只关心误判率和节拍;而误判率十有七八是光学方案决定的。
所以要我说,一条值得推荐的机器视觉学习路线是“光学先行、算法跟上”:先学会分析目标表面的反射特性,再学打光套路;先看懂镜头和相机的匹配计算,再学标定。这套基本功一旦建立起来,你再看社区里的求助帖,会发现自己能一眼戳中要害。
2. 工业光学系统设计的核心要素拆解
2.1 照明:决定“能不能看到”的第一关
工业光学系统设计,起点永远是照明。很多人以为照明就是把目标照亮,真的不是。照明的核心任务是“制造对比度”:让要检测的特征和背景之间形成稳定、可复现的灰度差异。同一个划痕,换个角度的光,可能从黑色变白色;同一个字符,换一种光源,可能从清晰变糊。
光源的选择其实是一张地图。我按自己的经验整理过一张简化表:
| 光源类型 | 适用场景 | 典型特征 |
|---|---|---|
| 环形光源 | 通用照明、字符识别、大面积外观 | 安装方便,45°-90°打光均匀 |
| 条形光源 | 较大平面、边缘检测、划痕 | 角度可调,适合低角度暗场 |
| 同轴光源 | 高反光表面、镜面、平整亮面 | 光线垂直照射,避免镜面反射进镜头 |
| 背光源 | 轮廓测量、毛刺检测、透明件 | 物体成黑色剪影,边缘锐利 |
| 穹顶光源 | 球面、曲面、强反光件 | 漫射均匀,抑制反光 |
| 线扫光源 | 连续运动、大幅面检测 | 与线扫相机配合,能量集中 |
选型的核心原则:先看被测面是漫反射还是镜面反射,再看特征是凸起还是凹陷、是吸光还是反光。金属镜面用同轴或穹顶,毛糙面用低角度或环形,透明或半透明件、测轮廓就用背光。这个表解决不了所有问题,但能帮你避开最粗的坑。
除了光源类型,角度和波长同样关键。低角度光会凸显表面划痕和台阶,高角度光适合读取平面印刷字符;红光对红光表面有弱化作用,蓝光波长短,对小细节的分辨更稳。对彩色目标,尽量用互补色光来拉大灰度差;对黑底白字,白光是基础,特殊情况下用单色光可以去掉颜色干扰。
偏振和频闪也是两个常被忽略的杠杆。在镜头前加偏振片,能滤掉来自金属表面的镜面反射,只保留漫反射成分,这对高亮件特别管用;可频闪光源则能配合相机曝光,在微秒级瞬间“冻住”运动目标,同时大幅压制环境光。电子秤数值识别那个案例,靠的就是频闪加短曝光。
2.2 镜头:决定“拍到多清楚”
光源把特征“翻译”成明暗之后,镜头负责把这些明暗准确地映射到相机靶面上。镜头选错,图拍出来要么太小,要么糊成一片,要么边缘变形。
镜头有四个参数绕不开:焦距、视场角、景深、畸变。焦距决定了同样工作距离下能拍到多大的范围,视场(FOV)和焦距、靶面尺寸之间是纯几何关系,后面我会带大家算一遍。景深则决定了目标在深度方向上有偏差时还能不能保持清晰,光圈越小景深越大,但进光量也越少,需要光源补足。畸变主要影响尺寸测量,普通工业镜头在边缘多少有点变形,高精度尺寸测量要用远心镜头或做标定补偿。
接触过机器视觉的人应该都听过“远心镜头”。它和普通镜头的最大区别在于:平行光入射,放大倍率在工作距离内几乎不变,所以物体前后移动时,图像大小不变。对测量类项目,比如零件尺寸、位置度检测,远心镜头几乎是标准答案。代价是体积大、价格贵,视野也受限,不是所有场合都用得起。
选镜头时还要注意接口和像圈。C接口和CS接口差一个垫圈,不能搞混;镜头的最大像面尺寸必须覆盖相机靶面对角线,否则画面四周是黑的或虚的。我见过不少人买了大靶面相机,却配了个小像圈镜头,画面边缘全是暗角,排查了半天还以为是相机坏了。
2.3 相机与传感器:把光变成数字
镜头把光汇聚到靶面上,相机里的图像传感器完成光电转换。这里最容易搞混的是分辨率、靶面尺寸和像元尺寸的关系,但三者的选择必须跟镜头重新匹配一遍。
分辨率不是越高越好,它要和视场、光源、算法耗时一起看。同样的视场下,分辨率越高,像素精度越高,但图像数据量变大,处理时间变长,光源要求也往往更苛刻。合理思路是“按最小特征定像素精度”:经验上,最小特征在图像里至少占3~5个像素才稳。比如要检测0.05mm的瑕疵,视场50mm,用500万像素相机(约2448×2048),长边像素精度约50/2448≈0.0204mm/pixel,0.05mm的瑕疵约占2.4个像素,就偏激进,可能要换更高分辨率相机或缩小视场。
靶面尺寸要和镜头像圈匹配,同时影响视野和景深。同样的焦距,靶面越大视野越大,但同样像素数下像元尺寸也越大,感光性能更好。工业相机里常见的1/1.8"、2/3"、1"指的就是靶面对角线长度,选的时候别只看数字,要看传感器实际尺寸。
快门方式也是一道坎。卷帘快门读取速度慢,拍高速运动物体会出现“果冻效应”,画面里的运动件会歪掉;全局快门一次性曝光,适合运动捕捉。再加上曝光时间和光源频闪的配合,基本能解决绝大多数运动模糊问题。黑白相机在大部分工业检测里比彩色相机更吃香,因为黑白传感器没有滤色片,感光效率高、图像更细腻,对灰度特征更敏感。
2.4 环境光学:隐形的敌人
最后想强调一个特别容易被忽略的环节:生产车间的环境光。太阳光、棚顶荧光灯、旁边电焊弧光、相邻工位的照明,都会在成像上叠加噪声。你实验室里拍得漂漂亮亮,一上产线就废,多半是环境光在作怪。
应对手段不是跟环境光硬拼,而是把视觉系统和环境“隔离”。物理上可以加遮光罩、挡板,把目标区域罩起来;策略上可以用单色光源加窄带滤光片,只让特定波长的光进镜头,把杂光拒之门外;软件上可以用频闪、短曝光,让环境光在曝光时间内几乎不起作用。
另外,温度、震动和灰尘也在光学系统里捣乱。镜头受热会轻微变形,焦点漂移;机械振动会让图像在取图瞬间抖动;镜片积灰直接导致图像发雾。这些都需要在机械设计和日常维护里提前考虑。光学设计不是一个“调完就完事”的环节,它是一套要在现场持续维护的系统。
3. 实操:从需求到落地的光学系统设计流程
3.1 需求量化:先定精度、视场、工作距离和节拍
我每次接项目,第一步不是开电脑找算法,而是拉上客户把四个数敲死:最小特征尺寸、检测视场、镜头工作距离、单件节拍。这四个数直接决定像素精度、镜头焦距和曝光窗口。
举例,客户要检测一个轴承端面上的打标字符是否完整,最细笔画宽度0.08mm;端面直径25mm,留点余量,视场定在30mm×30mm;安装空间有限,工作距离只能给到120mm;产线节拍要求每秒检测1件,曝光时间最好不超过2ms。
先算像素精度:用500万像素相机,靶面约6.4mm×4.8mm,长边分辨率2448,视野30mm,像素精度=30/2448≈0.0123mm/pixel。最细笔画占0.08/0.0123≈6.5个像素,够稳。如果要检测0.05mm的微小划痕,同样视野下就只能占约4个像素,也还行;如果客户要求0.03mm,那要么缩视场,要么上更高分辨率相机,要么换远心镜头配合小视野。
工作距离120mm是个关键输入,待会儿算焦距时要用。节拍决定曝光窗口,如果2ms曝光还偏暗,就只能靠加大光源功率或提高增益,但增益会让噪声变大,所以光源反而是优先选项。这几个数看起来简单,但十有八九的项目翻车都能追到它们没对齐。
3.2 照明选型与验证:打光要“试”出来
需求定完,接下来做照明验证。别指望第一盏灯就一步到位,光学是靠现场试出来的。我会准备几种光源样品:环形、同轴、低角度条形、背光,再带一支偏振片,用一个简易支架在实验台上模拟实际角度和距离。
打光验证有个标准动作:先拍一张目标图,盯着“目标特征与背景的灰度差”看。比如划痕检测,如果划痕在图像里比周围暗,其他区域又均匀,那这个角度和光源类型就对了;如果特征和背景分不开,就换角度、换距离、换光源类型。我会在每种方案下连拍几十张,看灰度波动,因为产线上不可能让你一张张微调。
测光源均匀性同样是必做项。好的打光方案应该保证整个视场内灰度波动尽量小。我给自己定的经验阈值是:感兴趣区域的灰度均值波动不超过灰度的5%~10%,越靠近测量项目要求越严。如果发现中间亮四周暗,就考虑加大工作距离、用多个光源组合或换穹顶光源。这个阶段所有结论都要拍照存档,方便后面写光源规格书和安装图。
3.3 镜头与相机匹配计算:公式和实例
照明方向定了,再回到镜头计算。焦距的近似公式是:焦距f = 工作距离WD × 靶面尺寸S / 视场FOV。注意这里S和FOV必须是同方向,比如都用长边或都用高度。还用上面那个例子,靶面长边6.4mm,FOV长边30mm,WD=120mm,f = 120×6.4/30 = 25.6mm。市面常见的定焦镜头有16mm和25mm,25mm更接近,视场30mm没问题;如果想留安装余量,可以选16mm,但工作距离或视场要相应调整,实际要重算。
选完后还要验一道:镜头分辨率能不能喂饱相机。相机的像元尺寸如果是2.9μm,那镜头在靶面上的光学分辨率至少要比2.9μm更细,否则镜头成了瓶颈,拍的图会发软。正规镜头会给MTF曲线或极限分辨率参数,选型时让供应商给一份就行。要是图省事,先按“目标空间频率”粗算:镜头分辨能力 = 1/(F数×波长),F2.8配白光时理论极限约几百线对/mm,通常够用,但边缘画质仍然建议实测。
景深也要核算。景深近似公式为DOF = 2×F数×容许弥散圆×工作距离²/焦距²,具体推导就不展开了。容许弥散圆可以取一个像元尺寸大小,比如0.003mm。如果项目里有高度差,要求±1mm内清晰,可以调小光圈(加大F数)把景深撑大,代价是进光量下降,需要补光。光圈、景深、亮度永远是三角关系,现场就是要根据图像效果来回权衡。
3.4 现场安装、对焦和软件联调
镜头算完,光源试完,到了装机阶段。固定顺序我推荐从相机开始:先把相机安装到位,接上镜头,再把光源按验证位置固定。固定光源的支架要够稳,不能用那种一碰就歪的磁吸小架子,否则隔几天图像就变一次,算法参数全废。
对焦有技巧。工业镜头上有光圈环、对焦环,有的还有锁定螺丝。先开大光圈让画面亮起来,在软件实时画面里一边看边缘清晰度一边拧对焦环,对准后再把光圈收到目标档位,锁定焦点。注意别在收光圈之后再对焦,因为景深变了,焦点位置可能轻微漂移。
联调阶段我会把曝光时间、增益、光源亮度固化到参数表里,关掉相机的自动曝光和自动白平衡。自动曝光在实验室很好用,上了产线容易因为目标切换或环境微变导致灰度跳变,风险太大。参数固化后,再用机器视觉开发环境(比如LabVIEW的视觉模块)写一个小的读取流程,验证字符识别或缺陷检测的稳定性。
如果后面要引导机器人抓取,还需要做像素坐标到机器人坐标的转换。常见做法是九点标定:机器人在视野内走九个已知位置,反馈给视觉系统,算出一个单应性矩阵;然后视觉检测到的像素坐标经矩阵换算成机器人基坐标系下的位置。这里有个小陷阱:标定板、相机和机器人末端必须固定牢固,任一动一次都要重新标定。坐标系对齐后,再配合位置补偿,机器人才能准确落脚。若中间目标上有杂点、噪声点,还要在算法里设置过滤条件,把那些面积过小的忽略点数排除掉,标定精度才能稳。
3.5 参数记录和可复现交付
最后一步,把所有光学参数整理成一份清单:光源型号、照射角度、距离、亮度等级、镜头型号、光圈值、工作距离、相机曝光、增益、是否加偏振片、遮光罩尺寸。这份清单的价值在于:换一台设备、复制产线、故障恢复时,能按单子原样复现。很多项目验收后几个月出问题,翻回去一看,换了一个光源型号,图像灰度变了,还以为算法坏了,其实是光学参数漂移了。
参数记录不仅是交付文档,也是故障定位的基线。我一般还会存一张“标准参考图”和对应的视觉参数配置,这样无论过了多久,都能用同一输入图回归验证算法是否正常。这套习惯让我省了很多远程救火的麻烦。
4. 常见问题与排查技巧实录
4.1 图像过曝或欠曝
图像整体白成一片或黑成一团,第一时间不是调算法,而是查三件事:光圈、曝光时间、光源强度。有的项目用了自动曝光,目标变亮变暗时灰度自动漂移,误判接踵而至,建议直接关闭自动曝光固定参数。如果固定参数后仍然过曝,先缩小光圈或降低光源亮度;欠曝则反过来。还有一个细节:光源用久了会衰减,同一亮度等级产出的光强下降,图像会慢慢变暗,所以参数表里最好同时记录光源电流或功率,定期校准。
4.2 金属表面反光和镜面干扰
高反光表面在图像里出现“白斑”,看起来就像缺陷,其实是镜面反射。排查时先试两个动作:把光源角度调低,让镜面反射光不进入镜头;或者在镜头前加偏振片,并保持光源处的偏振片与镜头处偏振片方向正交,把镜面反射光滤掉。如果还不够,就换成同轴光源或穹顶光源,用均匀漫射把高光压下去。反光问题的核心是“控制光路方向”,而不是后期图像处理,靠软件磨皮只会损失真实细节。
4.3 图像发虚、跑焦、景深不足
目标清晰度不够时,先确定是焦点没对准还是景深不够。前者在画面里看某个固定平面的清晰度,微调对焦环;后者表现为近处清楚了远处又虚,比如带高度差的零件,需要缩小光圈增加景深。光圈收到F8甚至F11通常能明显改善,但要同步加强光源亮度,否则图会变暗、噪点上来。对高精度测量,还是优先考虑远心镜头+适当光圈,从光学结构上把景深和畸变问题一起解决。
4.4 运动模糊
拍运动目标时图像出现拖影,多半是曝光时间太长或光源频闪没跟上。解决办法是缩短曝光时间,最好配合可频闪光源,在曝光瞬间打出一个强光脉冲,等效于“凝固”工件。相机选型时优先全局快门,不要在运动场景里用卷帘快门。计算允许的最大曝光时间可以用经验公式:最大曝光时间≈0.5×像素精度/运动速度。比如像素精度0.02mm/pixel,运动速度100mm/s,最大曝光时间≈0.0001s,也就是100μs。对高速场景,这些算完心里就有底。
4.5 灰度不均匀和边缘暗角
图像中间亮四周暗,最常见的两个原因:光源照射范围不够,或镜头像圈小于相机靶面。光源问题很好判断,把光源移远或换大尺寸光源;镜头像圈问题需要换镜头,不能靠软件补偿。还有一类情况是环境杂散光叠加造成的局部亮斑,例如旁边有其他工位的光照过来,这时加遮光罩比调算法更有效。排查不均匀问题我的习惯是拍一块标准漫反射白板,直接看灰度平面的起伏,哪里不平补哪里。
4.6 机器人抓取时坐标对不上
视觉检测明明很准,机器人却抓偏,十有八九是坐标标定和机构变形的问题。第一步确认九点标定是否做过,标定板或相机是否被动过;第二步检查安装面的水平度和刚性,视觉支架的微小形变都会导致末端位置偏差;第三步在算法里排除误检点,比如零散杂点被当成目标,换算出的坐标自然偏了。我以前遇到一个案例,视觉每次都能检测到目标,但机器人角度总差几毫米,最后发现是视觉支架被产线震松了,紧固后重新标定立刻恢复。所以视觉和机器人配合的项目,机械固定和定期复标是保命的底线。
最后说点个人体会。我常年泡在机器视觉社区里,看到最多的问题不是“这个算法怎么写”,而是“我这个图为什么这么烂”。十次里有八次,我把现场照片拿到手,第一眼就能看出光源角度不对、曝光参数没固化或者镜头畸变太明显。这些问题都不是靠更贵的相机、更高级的算法能解决,而是回到光学设计本身。所以对准备入行或者正在做视觉方向的朋友,我真心建议把照明和镜头这部分当第一优先级的功课来做。你省下的不是调试时间,而是整个项目的命。下一讲我会聊聊相机标定和坐标系转换的细节,把光学和机器人之间的桥梁搭起来。