去年在西南一家电池厂调试,客户非要把尺寸和外观检测塞到一个工位。我当时心里骂娘——这俩玩意从光路上就是互斥的。但合同签了,只能硬着头皮上。
尺寸检测靠的是亚像素边缘,外观检测靠的是灰度纹理。你要高分辨率看清轮廓,表面划痕在过曝下直接隐身;你要低角度光把浅坑拉出阴影,边缘就糊成了一团。所以一体检测算法,说白了是跟物理限制做搏斗。
标定误差是隐形杀手
讲到尺寸,第一个坑就是标定。工程师容易把像素当量当成一个常数,实际哪有那么便宜的事。即使远心镜头,视场边缘也有0.1%的放大倍率漂移。如果是普通蔡司镜头,桶形畸变更让你头疼。
正确做法是用陶瓷标定板,拍十几个姿态,用张正友法求相机内参和畸变系数,然后做逐像素的物理尺寸映射。这个流程在Halcon里叫calibrate_cameras,在OpenCV里就是calibrateCamera。步骤不复杂,但很多人图省事跳过了畸变校正,结果边缘处的尺寸偏差拉到0.05mm,客户直接退货。
我踩过最狠的一次,是标定板本身精度不够。后来换了德国产的玻璃基板,误差从10μm降到2μm,数据才稳下来。这钱不能省。

算法融合不是做加法

有人以为把尺寸算法和外观算法串起来就行,太天真。你最头疼的是两个结果互相矛盾怎么办——比如尺寸正好在公差带上,但表面有个芝麻大的暗点。
我的做法是分ROI并行。先用阈值分割把工件大致框出来,然后在这个区域内,一边跑Canny+最小二乘拟合直线算几何量,另一边跑梯度幅值统计找异常灰度簇。最后用一张决策表决定合格与否。
麻烦的是参数调整。Canny的高低阈值差太大会漏边缘,太小会陷入噪声;外观那块,梯度阈值要能滤掉纹理背景,又不能放过真缺陷。我们调了一个星期,最后用了自适应阈值——根据每个区域的灰度标准差动态设定。
顺带说一句,别迷信深度学习。样本量没有十万级,别碰CNN。我见过有同行用YOLO检测划痕,换了个来料批次直接失灵,原因是环境光变了。传统算法加一点统计特征,反而皮实。
光源设计比算法更头疼
算法再厉害,没有好的图像也是白搭。一体检测的命门就在光照上。
我们最终方案是可编程多光谱光源,一个同轴光打表面,一个蓝色背光打轮廓。控制器按时序点亮:先点亮同轴光拍一张表面图,再切到背光拍一张轮廓图,总周期30毫秒。这样算法拿到两张图,各取所需。
但时序控制是个坑——切换光源和相机曝光必须严格同步,我一开始用PLC硬顶,结果抖动大,后来换成专用的光源控制器,用硬件触发才解决。
机械上还要防振动。相机支架用30mm厚的铝板加三角形加强筋,别用那种细长的铝合金支柱。工件最好用气浮导轨送到工位,不然那点点震动足够让边缘漂移。

机械结构也不能掉链子

搞到最后,我发现算法环节的冗错率其实不高,真正拖后腿的是机械结构。比如工件的高度公差,如果超过远心镜头的景深,图像就虚了。必须加浮动压紧装置,把高度波动压到±0.01mm以内。
还有环境光干扰。虽然用滤光片,但不锈钢台面的反光还是会窜进图像。我们最后用黑色亚克力板把整个工位罩起来,才消停。
总得来说,一体检测算法不是纯软件问题,它逼着你把光学、机械、算法全串起来想。如果能重来,我绝对建议客户用双工位分步测,但既然要在一体机上做,那以上坑基本绕不开。
好了,这次就聊到这儿。如果你也在搞类似的东西,记住一点:标定用好的,光源留出余量,时序测试多跑几轮。别指望算法自己会适应烂硬件。