工业产线上,机器怎么"看"东西?答案不在算法里,在硬件选型的每一个细节里。

开场:一个真实的翻车现场

去年帮一个朋友调一条五金件检测线。缺陷检测算法在实验室跑得好好的,一上产线就各种误报。排查了半天,最后发现原因特别朴素——光源选小了。光源有效发光面积没覆盖住整个视野,画面中间亮、两边暗,边缘的工件特征被算法当成了缺陷。

一个两千块的光源问题,浪费了三天调算法。

这就是机器视觉的第一课:它是一个链式系统,光→镜头→相机→算法,环环相扣。任何一个环节的短板都会被后续环节放大。 算法再牛,喂给它的图像质量不行,结果就是垃圾进、垃圾出。

下面记录这条链路的学习要点。

硬件三件套:光源、镜头、相机

光源:最容易被低估的环节

很多工程师(包括以前的我)觉得光源就是"把东西照亮"。错。光源的核心目标是让目标特征和背景之间的对比度最大化

打个比方:你要在白纸上检测白色划痕,用白光正面打,什么都看不到。但换成低角度的条形光源,光线擦过表面,划痕边缘产生反射,背景是暗的,划痕是亮的——缺陷就"跳"出来了。

课程里讲了五六种常见光源,我按使用频率排个序:

  • 环形光源:最通用,360° 均匀照明,适合大多数表面检测。如果不知道用什么,先试环形光。
  • 条形光源:方向性强,擅长消除镜面反光。检测金属平面字符时,条形光比环形光好用得多——环形光容易在光滑表面打出大面积光晕。
  • 背光源:从底部打光,物体轮廓变成剪影。做尺寸测量、孔径检测时的标配。
  • 同轴光源:内置分光镜,光线垂直照射。专门对付高反光的镜面、抛光金属,能消除凹凸产生的阴影。
  • 穹顶光源:半球形漫射,360° 无死角。检测曲面工件(比如球形外壳)时的首选,普通光源打上去全是反光斑点。

还有一个容易忽略的点:光源颜色选择遵循互补色原理。红光照绿色物体,黑白相机下物体是黑色的;红光照红色物体,物体是白色的。想让红色字符在白色背景上更突出?用蓝色光源——红色字符吸收蓝光变黑,白色背景反射蓝光变亮,对比度直接拉满。

镜头:焦距只是起点

镜头选型的第一步是算焦距,公式不复杂:

焦距 = 工作距离 × 芯片尺寸 / 视场

但焦距选对了只是及格线。真正容易踩坑的是两个参数:

景深——简单理解就是"前后多大范围内的东西是清楚的"。景深越小,对焦平面以外的物体就越模糊。影响景深的三个因素:光圈越大景深越小,焦距越长景深越小,工作距离越近景深越小。做尺寸测量时,如果工件有厚度(比如一个盒子),景深不够就会出现"上面清楚、下面模糊"的问题。

畸变——普通定焦镜头天然有畸变,短焦是桶形畸变(像被捏扁了),长焦是枕形畸变(像被拉长了)。人眼看不出小于 2% 的畸变,但做精密测量时,边缘 1mm 的畸变就是实打实的误差。这时候就得上远心镜头——它的特点是"无论物体离镜头远近,在图像里的大小不变"。类比一下:普通镜头像人眼看东西,近大远小;远心镜头像用尺子量,不管尺子放多远,读数不变。

另外注意镜头和相机的接口匹配:C 口后截距 17.5mm,CS 口 12.5mm,差 5mm。CS 口相机接 C 口镜头要加 5mm 接圈,反过来不行。接口不匹配,图像就是糊的。

相机:一个公式定成败

相机选型的核心公式:

像素精度 = 视场 / 分辨率

意思是:图像上一个像素代表实际空间中多大的尺寸。

举个例子:用 500 万像素相机(2592×1944)拍 80mm 宽的视野,像素精度 = 80 / 2592 ≈ 0.031 mm/pixel。也就是说图像里一个像素对应实际 0.031mm。

经验值:要检测的最小特征,至少要在图像中占 2~3 个像素。 如果你要检测 0.1mm 的缺陷,像素精度至少要到 0.03~0.05mm/pixel,否则缺陷在图像里就一两个模糊的点,算法根本抓不住。

另一个关键选择是快门类型

  • 全局快门(Global Shutter):整个芯片同时曝光。拍运动物体不会变形,但贵。
  • 卷帘快门(Rolling Shutter):逐行曝光。拍静止物体够用,拍运动物体会出现"果冻效应"——本来是圆的东西拍出来是椭圆。

飞拍场景(物体在运动中拍照)必须用全局快门,而且曝光时间要满足:最大曝光时间 × 运动速度 < 像素精度。曝光时间太短,进光量不够,图像太暗,就得靠加大光圈或增强光源亮度来补。

从像素到结果:图像处理流程

硬件搞定,拿到图像了。下一步是把像素变成有用的信息

工业图像处理有一条标准流水线:

灰度化 → 滤波去噪 → 阈值分割 → 形态学运算 → 特征提取 → 结果输出

每一步都有工程取舍,不是"选最好的方法",而是"选最适合当前场景的方法"。

灰度化:为什么要丢掉颜色?

工业场景里大部分检测不需要颜色信息。RGB 彩图一个像素 3 个通道,灰度图只要 1 个通道,数据量直接减到 1/3,处理速度快得多。常用公式:Y = 0.299R + 0.587G + 0.114B,这个权重是人眼对三色敏感度的近似。

滤波:去噪还是保边,是个问题

  • 高斯滤波:去噪效果好,但会模糊边缘。适合噪声多但边缘不重要的场景。
  • 中值滤波:取窗口内像素的中值,保边能力强。对椒盐噪声特别有效。
  • 均值滤波:最简单,但会把边缘一起模糊掉,工业场景用得少。

实际项目里经常要组合使用:先高斯去噪,再用拉普拉斯算子锐化边缘。

阈值分割:把世界变成黑白

灰度图转二值图,关键在于找到合适的阈值。固定阈值在光照稳定的场景下好用,但产线上环境光一变就翻车。这时候用自适应阈值,让算法根据局部区域自动计算阈值。

形态学运算:修补分割结果的"美图秀秀"

阈值分割后,二值图经常有噪点、断裂、孔洞。形态学运算就是来修修补补的:

  • 腐蚀:缩小白色区域,去掉细小噪点,分开粘连的目标。
  • 膨胀:扩大白色区域,填补小孔洞,连接断裂的边缘。
  • 开运算(先腐蚀后膨胀):去噪点。
  • 闭运算(先膨胀后腐蚀):填孔洞。

特征提取:从像素到语义

最后一步是从二值图中提取有意义的特征——面积、周长、圆度、质心、外接矩形……比如判断一个缺陷是圆形的(可能是气泡)还是长条形的(可能是划痕),圆度 = 4π × 面积 / 周长²,越接近 1 越圆。

用 AI 辅助写 OpenCV 代码

下午做了一个很有意思的练习:用 AI 辅助写缺陷检测代码。模式是人定逻辑、AI 写代码——你告诉它"我要检测钢材表面缺陷,先灰度化,再高斯滤波,然后 Canny 边缘检测,最后形态学闭运算连接断裂边缘",它帮你生成完整的 OpenCV 代码。

这个模式在工业视觉领域特别实用。工程师最值钱的能力是判断用什么方法、怎么调参,而不是背 OpenCV 的 API。AI 帮你写代码,你来验收逻辑——这才是高效的协作方式。

我们还接触了 NEU-DET 数据集(东北大学钢材表面缺陷数据集),1800 张 200×200 灰度图,覆盖六种典型热轧钢带缺陷:裂纹、夹杂、斑块、麻面、氧化皮压入、划痕。这个数据集后面会用来训练深度学习模型。

踩坑与排查

几个实际项目中容易踩的坑,分享一下排查思路:

  1. 图像中间亮、两边暗 → 光源尺寸太小,没覆盖住视野。换大一号的光源。
  2. 图像整体模糊 → 检查镜头接口是否匹配(C/CS 差 5mm),或者对焦没对准。
  3. 运动物体拍出来变形 → 用了卷帘快门,换全局快门相机。
  4. 算法在实验室好用、产线上不行 → 八成是光照环境变了。检查光源亮度是否稳定,是否有环境光干扰。
  5. 边缘检测结果断裂严重 → 先做形态学闭运算连接,再提取轮廓。

核心收获与下一步

最大的收获不是记住了多少公式参数,而是建立了一个认知框架:机器视觉是一个系统工程,硬件选型和算法设计同等重要,甚至更重要。 光打好了,简单算法就能解决问题;光没打好,再复杂的深度学习也救不回来。

下一步要深入的内容:

  • 深度学习在缺陷检测中的应用(基于 NEU-DET 数据集)
  • 相机标定与坐标系变换
  • 实际项目的完整开发流程

硬件选型是门手艺活,公式只是起点,多动手打光、多看实际图像,才能练出直觉。*