啤酒瓶瓶内残留液体的视觉检测,在灌装线上是个老难题,也是个硬骨头。
别小看瓶底那点残余液体——几毫升的碱液、消毒水或者前一道工序的冲洗水,混进下一批酒液里,轻则影响口感一致性,重则整批产品微生物超标。人工抽检?效率低、漏检率高,流水线每分钟几百个瓶子的速度下根本跟不上。所以这事得交给机器,而且是基于2D视觉的只能检测系统。

为什么是2D视觉,而不是3D?
很多人第一反应是“3D更高级”,但在这个场景下,2D视觉恰恰是最务实的选择。残留液体在瓶底呈现的是二维平面上的形态特征——液面的轮廓、反光区域的大小和分布、液体与瓶壁的接触线位置。这些信息,一张高质量的二维灰度图就够用了。3D点云数据量大、处理慢、成本高,对于“有/无残留”这样一个二分类问题来说,属于杀鸡用牛刀。
2D视觉的优势很直白:高速——工业相机每秒能拍上百帧;低成本——硬件方案成熟;算法轻量——不需要跑复杂的点云重建。在一条每小时处理几万只瓶子的产线上,速度就是一切。
光,才是真正的关键
2D视觉检测里有个容易被外行忽略的细节:照明方案比相机分辨率更重要。
残留液体是透明的,普通前光打上去,液体几乎“隐形”。真正有效的做法是背光照明+低角度环形光的组合策略。背光让瓶身轮廓变成一个均匀的亮区,而残留液体因为折射率不同,会在亮背景上形成一块暗斑——这就是最经典的“暗场检测”原理。低角度环形光则负责捕捉液体表面的镜面反射,让原本透明的液膜在图像上“现形”。
一套好的光源方案,能把微量的残留液体放大成图像上明显的灰度差异。剩下的工作,就是算法的事了。
算法怎么“看”到那几毫升的液体?
图像拿到手之后,算法要做几件事:
第一步,ROI提取。瓶子在传送带上会有位置偏差,得先用边缘检测找到瓶底区域,裁出感兴趣的区域。这一步不难,但很考验鲁棒性——瓶型不同、脏污程度不同,边缘检测的参数得自适应。
第二步,灰度分析。在ROI内统计灰度直方图。干净的瓶底在背光下呈现均匀的高灰度值,而有残留液体的区域会出现明显的灰度低谷。最简单的做法是设定一个灰度阈值——低于这个值就算“有残留”。但实际产线上,瓶底可能有划痕、标签残胶、甚至霉斑,这些都会干扰阈值判断。
第三步,形态学滤波。这才是区分“真残留”和“假阳性”的关键。残留液体的形态通常是连续的不规则区域,而划痕是细长的线条,霉斑是多点散布的颗粒。通过开运算、闭运算、连通域分析这些经典的形态学操作,算法能把真正的液体区域从各种干扰中剥离出来。再计算一下连通域的面积和圆度,基本就能给出“过”还是“废”的判断了。
那些让工程师头疼的现实问题
理论说起来简单,上了产线才知道坑有多深。
瓶壁上的冷凝水是最常见的干扰源。刚从洗瓶机出来的瓶子,内壁挂满水珠,算法很容易把水珠误判为残留液体。解决思路是在检测工位之前加一段吹风干燥区,或者采用多帧对比——连续拍几张,动态变化的区域才是真正的液体,静态的水珠反而被过滤掉。
瓶底字符和浮雕是另一个麻烦。很多啤酒瓶瓶底有品牌字母或者容量标识,这些凸起的玻璃在背光下回产生阴影,灰度值和残留液体非常接近。一种做法是提前建立瓶型模板,把固定字符区域屏蔽掉;另一种是用差分法——先拍一张空瓶的基准图,后续检测时做图像差分,只有变化的区域才进入判断逻辑。
产线速度带来的挑战更直接。瓶子在高速运动中,曝光时间必须短到足以冻结运动模糊,同时又不能短到图像太暗。这需要工业相机、镜头光圈、光源亮度的精密配合。每秒处理几十兆图像数据,算法还得在几十毫秒内给出判定结果——这对嵌入式处理器的性能是实打实的考验。
2D视觉的边界在哪里?
必须承认,2D视觉不是万能的。
当残留液体量极少(比如只有零点几毫升),铺在瓶底形成一层极薄的液膜时,2D图像上的灰度差异会非常微弱,接近噪声水平。这时候可能需要引入多光谱成像——不同波长的光对液体的穿透和反射特性不同,用红外或者紫外光辅助,能增强微弱信号的对比度。但本质上,这还是在2D图像的框架内做文章,并没有跳到3D去。
另一个方向是深度学习的引入。传统的阈值法和形态学操作需要人工调参,对不同瓶型、不同污损程度的适应性有限。用卷积神经网络做像素级分割,直接把液体区域标出来,泛化能力确实更强。但代价是模型推理需要GPU算力,产线上的工控机未必扛得住,而且训练数据的标注成本不低。
所以目前行业里主流的做法,还是传统图像处理为主、深度学习为辅的混合方案。能靠阈值解决,绝不上模型;模型只用来处理那些传统方法搞不定的疑难杂症。
说在最后
啤酒空瓶的残留液体检测,说到底是一场光与算法的配合战。2D视觉在这个场景里站稳脚跟,靠的不是花哨的技术噱头,而是靠谱、高速、成本可控这三个硬指标。把光源调好、把算法做稳、把干扰项一个一个干掉——这套思路放在任何一条灌装线上,都能跑出漂亮的检测数据。