1. 为什么值得系统梳理机器视觉这件事
我在几个不同类型的产线现场都做过视觉相关的项目,从最开始只会调调相机曝光、画画检测框,到后来需要自己算精度、选镜头、定光源、扛节拍,中间踩过的坑远比看过的教程多。机器视觉这四个字听起来很宏大,但真正落到工程现场,它其实是一整套围绕“让设备看懂画面并做出判断”的工程方法论。它解决的问题很具体:人眼看久了会疲劳、会走神、会漏检,而一台配置得当的视觉系统可以连续几个月保持同一套判定标准,稳定输出结果。
这篇是我打算写成一个系列的第一篇,核心任务是把机器视觉的整体轮廓讲清楚。它是什么、由哪些部分构成、每个部分在工程里承担什么职责、什么场景适合上视觉、什么场景上了就是给自己找麻烦。不管你是刚入行的工程师、正在评估要不要上视觉方案的产线负责人,还是和我一样从电气、机械、软件某个方向转过来的技术人,看完这一篇至少能建立一张完整的认知地图,知道后面每一块该往哪个方向深挖。
我特别想强调一点:机器视觉不是买个相机装上就能跑的东西。它更像一条链子——光源、镜头、相机、采集、算法、通信、执行,任何一环掉链子,整条链子就废了。新手最容易犯的错误是把九成精力放在“算法选型”上,实际上很多现场问题根本不在算法,而在光打歪了、镜头选错了、工件位置重复精度不够。所以我这篇会按“系统构成—场景判断—核心环节—常见坑”的顺序铺开,把每个环节的原理和取舍讲透,并且在关键位置给出可复现的参数计算和现场经验。这也是这个系列后面所有分篇的地基。
2. 机器视觉到底是什么,先把边界划清楚
2.1 从人眼到相机:一个直观的功能类比
想理解机器视觉,最好的方式不是背定义,而是拿人眼看东西的过程来对照。人看一个零件,眼睛是成像器件(相当于相机),瞳孔和晶状体调节焦点(相当于镜头和光圈),环境光或者灯光把物体照亮(相当于光源),视网膜把光信号转成电信号(相当于图像传感器),大脑负责判断这个零件有没有划伤(相当于算法)。
这个类比的价值在于,它直观地告诉你:大脑再聪明,眼睛瞎了也白搭。我在现场见过太多案例,工程师在算法上折腾了两天,最后把侧光条往后挪了三公分,问题当场消失。所以做机器视觉,第一反应不应该是“用什么深度学习模型”,而应该是“这个特征在成像上有没有被清晰、稳定地表达出来”。特征在图像里是糊的、对比度是低的、或者和背景混在一起的,再强的算法也是在做无用功。
从工程定义上讲,机器视觉是指用图像采集装置获取目标对象的图像信息,再由计算单元对图像进行处理、分析和理解,最终输出检测结果或控制指令的一套系统。它强调的是“自动”和“非接触”,这两个特性决定了它在高速产线、危险环境、高洁净场景里天然有优势。
2.2 和图像处理、计算机视觉的边界在哪
这三个词经常被混着用,我在面试和带新人的时候都会专门澄清一遍。机器视觉偏向工程系统,它的终点是“做出一个可用的判断或者动作”,比如判定合格与否、输出坐标给机械手抓取、触发剔除气缸。计算机视觉更偏学科和算法研究,关注的是如何从图像中提取语义信息,很多时候目标是“理解”。图像处理则更基础,关注的是像素层面的变换,比如滤波、增强、二值化、形态学操作,它是前两者的底层工具。
这个边界划分的意义很实在:做机器视觉项目,你不仅要懂算法,还要懂机械安装、光电触发、通信时序、产线节拍,甚至要懂现场的气压、温度、电磁干扰。很多从纯算法背景转过来的朋友,算法能力很强,但在现场会卡在“相机触发信号和传送带编码器对不上”这种问题上。反过来,从电气转过来的朋友,硬件摸得很快,但对图像质量的判断缺乏敏感度。一个成熟的机器视觉工程师,是这两端都能打通的人——或者至少知道去哪里找对应的人。
2.3 一条完整的视觉系统链路拆解
我习惯把一套机器视觉系统拆成七个环节来看,这个拆法在项目评估和问题排查时都很好用。
| 环节 | 核心职责 | 典型部件 | 掉链子的常见表现 |
|---|---|---|---|
| 被检测对象 | 提供稳定的、可成像的特征 | 工件、标签、表面 | 位置漂移、反光随机、污渍误判 |
| 光源 | 制造特征对比度 | 环形光、条形光、同轴光、背光 | 对比度不足、阴影干扰、频闪 |
| 镜头 | 把目标成像到传感器上 | 定焦、远心、微距 | 视野不对、畸变大、边缘模糊 |
| 相机 | 光电转换与数字化 | 面阵、线阵、3D | 分辨率不够、拖影、噪点高 |
| 采集与触发 | 保证图像与工件同步 | 光电开关、编码器、采集卡 | 抓拍偏、漏拍、重拍 |
| 算法处理 | 从像素到判定 | 传统规则、模板匹配、深度学习 | 阈值漂移、过拟合、泛化差 |
| 通信与执行 | 输出结果驱动动作 | IO、总线、PLC、机械手 | 时序错、丢信号、动作滞后 |
这张表我在内部做方案评审时基本会拿出来对照一遍。经验是,绝大多数“视觉做不出来”的抱怨,最后定位到的都不是第七环前面的算法,而是前三环的成像或者第五环的同步。尤其是光源和触发这两块,投入不大但收益极高,是整个系统里性价比最高的部分。
3. 场景判断:什么该上视觉,什么不该上
3.1 适合上视觉的四类典型场景
不是所有检测都值得上视觉。我一般从四个维度判断:重复性高、规则可描述、节拍允许、人眼可判。这四个条件越满足,上视觉的成功率越高。
第一类是尺寸与位置测量。孔位、间距、角度、轮廓,这类任务的特征几何明确,用亚像素边缘配合标定换算,精度可以做到很高。我在一个精密冲压件项目里用远心镜头加背光做轮廓测量,重复性做到了比现场传统量具还稳。
第二类是外观缺陷检测。划伤、脏污、缺料、异色、变形,这类是目前需求最大也最容易翻车的方向。它的上限和下限差别极大——明显黑点检测和微弱色差检测完全是两个难度量级。
第三类是存在性与装配正确性。螺丝有没有打、卡扣有没有扣到位、标签有没有贴、方向有没有装反,这类任务只要在成像上把“有”和“没有”的差异拉开,用传统的模板匹配或者分类器就能很稳。
第四类是定位与引导。告诉机械手零件在哪、角度是多少,配合标定把像素坐标换算到机器人坐标系。这类任务对重复精度要求高,对成像稳定性要求同样高,因为它直接影响抓取成功率。
反过来,我也见过一些不该硬上的场景:缺陷形态随机且没有样本可收集的、工件定位本身重复精度就很差的、要求的检测精度已经逼近甚至超过光学衍射极限的、以及产线环境油污粉尘严重到防护成本超过检测本身价值的场合。这些情况我会建议先做物理改善或者改用其他传感手段,而不是一味堆视觉。
3.2 传统规则算法和深度学习的选型逻辑
这是目前最常被问到的问题,我给的建议一直是“先传统,后深度”,而不是“深度一定更好”。
传统规则方法的优势在于确定性高、可解释、部署成本低、不需要训练数据。边缘、阈值、模板匹配、斑点分析这些工具,如果特征稳定,几百毫秒内就能给出结果,而且出错时你能明确知道是哪一步出的问题。它的短板是对光照变化、工件姿态变化、表面纹理变化敏感。
深度学习方法的优势是对复杂纹理、弱对比度、非规则缺陷的适应性强,能学到人很难显式描述的判别依据。但它的代价很实际:需要足够的样本、需要标注、需要训练和验证、需要推理算力,而且一旦现场光照漂移,模型可能悄悄失效而你不容易发现。
我的判断原则是:能用几何和灰度差异清晰描述的,比如尺寸、位置、存在性,优先传统方法;无法用规则穷举的,比如布面瑕疵、复杂表面纹理异常、字符残缺,考虑深度学习;还有一个中间档,用深度学习做检测定位、再用传统方法做精确量测,这个组合在实际项目里非常好用。
注意:上深度学习之前,先问自己能不能收集到至少几十到上百个“真实发生过的”缺陷样本,并覆盖不同类别。验证集上漂亮不代表现场能用,现场分布和训练分布不一致是常态。
3.3 精度、节拍、成本三者的现实平衡
这三个指标永远在打架。精度靠更高的分辨率、更好的镜头、更稳的机械结构,节拍靠更快的曝光、更快的算法、更强的算力,成本则限制着你在这两端能走多远。
我通常的做法是先算出“物理极限”。假设要检测 0.05mm 的缺陷,按经验至少需要 3 到 5 个像素覆盖这个特征,取 4 个像素,那么单个像素的物理尺寸就要小于 0.0125mm。如果视野是 100mm 宽,那么横向像素数至少要 100 / 0.0125 = 8000 像素。这个数字一出来,你立刻就知道该往高分辨率、多相机拼接甚至线阵扫描的方向选,而成本也基本定型了。
节拍同理。假设产线速度每秒 2 件,那么从触发拍照到输出结果必须压缩在 500ms 以内,还要留出通信和执行的时间,留 30% 余量,算法实际预算约 350ms。这个预算直接决定你能不能上重模型,也决定要不要用硬件触发配合 ROI 裁剪来省时间。把这两笔账提前算出来,再谈选型,能避免很多“方案做完了发现成本翻倍”的尴尬。
4. 核心部件选型:每个环节都在决定上限
4.1 光源:性价比最高也最容易被低估的一环
我一直认为光源是机器视觉里投入产出比最高的部分。同样的相机和算法,光打对了,检测难度可能直接下降一个量级。
常见的光源类型和适用场景是这样的:
- 环形光:通用性最强,适合平面缺陷、字符、一般外观检查。缺点是容易在反光件表面形成环状高光。
- 条形光:可灵活布置角度,适合打侧光突出纹理、划痕、压印。低角度打光对表面凹凸非常敏感。
- 背光(透射光):从工件背后打光,得到高对比度剪影,测尺寸、测轮廓、测孔位的首选。
- 同轴光:光路与成像光路同轴,适合高反光平面上的字符和细微缺陷,能压掉表面反光。
- 圆顶光(穹顶光):内壁漫反射形成均匀照明,适合曲面、高反光金属件的通用检查。
- 点光源与组合光源:用于局部强化或者复杂工件的多角度照明。
选光型的核心思路是“让要检测的特征和背景在灰度上分开,同时让干扰特征消失”。举个实际例子,检测金属件表面的浅划痕,如果正面均匀打光,划痕和基底几乎一个灰度;改成低角度条形光从侧面打,划痕边缘产生明暗过渡,对比度立刻出来。这个思路比换更贵的相机有效得多。
提示:能用结构光或者明暗场切换解决的对比度问题,不要指望靠提高相机位深解决。8bit 和 12bit 拉不回来一个在物理上就不存在的光强差异。
还有一个常被忽视的点是光源的稳定性。频繁调光、老化、供电波动都会导致阈值漂移。我在一个长期运行的项目里吃过这个亏,最后是通过固定光源输出、加装遮光罩、把曝光时间和增益锁死才彻底稳住。光源不是装上就完了,它需要在整机环境下重新验证一次实际效果。
4.2 镜头:视野、工作距离、畸变三笔账
镜头选型的核心是三个参数的联立:视野(FOV)、工作距离(WD)、传感器尺寸。它们满足一个简单关系:视野 / 传感器尺寸 = 工作距离 / 焦距。
举个具体计算。假设我用一个 1/1.8 英寸传感器,靶面宽度约 7.2mm,需要检测 100mm 宽的视野,安装空间只允许 400mm 的工作距离,那么需要的焦距 f = 7.2 × 400 / 100 = 28.8mm,选 25mm 或者 35mm 的定焦镜头再微调工作距离即可。这类计算我建议每个项目都动笔算一遍,别凭感觉买镜头,买回来发现视野差一大截的情况太常见了。
除了这三个参数,还要看几个容易翻车的指标:
- 分辨率匹配:镜头的光学分辨率要能支撑传感器像素密度,低分辨率镜头配高像素相机,出来的图是糊的,等于白花钱。
- 畸变:广角镜头边缘畸变明显,做测量必须做畸变校正,或者干脆选远心镜头。
- 景深:工件高度有波动时,景深不够就会部分失焦,尤其是微距和高放大倍率场合。
- 远心镜头:消除透视误差,测量高精度工件的首选,代价是贵、体积大、工作距离固定。
4.3 相机:面阵还是线阵,分辨率和帧率怎么算
相机选型先定类型。面阵相机一次曝光得到整幅图像,适合绝大多数静止或者短暂停顿的检测;线阵相机逐行扫描,适合卷材、连续运动的长条状物体,比如带材、织物、印刷品,它能在运动方向获得很高的等效分辨率。
分辨率怎么定,还回到那个“特征至少覆盖几个像素”的原则。经验值是:稳定检测用 3 到 5 像素,高精度测量用 5 到 10 像素,亚像素算法可以进一步提升但不要指望它突破光学极限。
帧率怎么定,用节拍倒推。如果产线每秒流过 2 个工件,每个工件需要拍 1 张,那理论帧率 2fps 就够,但实际要考虑触发抖动和漏拍风险,我一般会留 3 到 5 倍余量。如果是运动中的工件,还要算运动模糊:曝光时间内工件的位移不能超过允许的模糊量。假设传送带速度 500mm/s,允许模糊 0.05mm,那么曝光时间必须小于 0.0001s,即 100 微秒,这个约束会直接影响光源亮度和相机灵敏度的选择。
还有一个常被忽略的参数是快门类型。卷帘快门在高速运动下会产生果冻效应,全局快门才适合动态拍摄,选型时务必确认。
4.4 触发与同步:图像和工件必须对得上
这一环是现场故障的高发区。视觉系统需要知道“什么时候拍”,两种方式:软触发和硬触发。
软触发由软件发指令,简单但时序不确定,受操作系统调度影响,高速产线上容易拍到偏位。硬触发由光电开关、编码器等外部信号直接触发相机,时序精确,是产线的标配做法。我经手的项目里,凡是节拍紧的,一律硬触发。
对于连续运动的工件,还要考虑用编码器同步。编码器每转输出固定脉冲数,相机按脉冲触发,保证每个工件都在同一相对位置被拍到。这要求编码器分辨率足够,也要求机械传动没有明显回差,否则同一批工件拍出来的位置还是会漂。
注意:触发调试时一定要看实际抓拍的图像,而不是看软件界面上的计数。我见过计数器正常但拍到的全是空画面的情况,原因是光电开关的响应时间没算进去。
5. 算法与处理流程:从像素到判定的完整路径
5.1 图像预处理:别急着上花活
预处理的目标是让后续的特征提取更稳,不是把图变好看。常用的有灰度转换、滤波去噪、形态学操作、对比度增强、ROI 裁剪。
我的经验是预处理越少越好,能用光源解决的不要用算法修。因为每多一层处理就多一组参数,多一组参数就多一处漂移风险。滤波能压噪点,但也会钝化边缘,做亚像素测量时尤其要谨慎。形态学开闭运算对去除小噪点、填补断裂很有效,但结构元大小要按实际特征尺度定,不能照抄。
ROI 裁剪是性价比极高的一步,既减少计算量提升速度,又缩小干扰区域。工程上我习惯把 ROI 定得尽量紧,紧到只包住特征加一点余量,这对稳定性和节拍都有好处。
5.2 特征提取与判定:几类主流方法的适用面
传统方法里,常用的有这么几类:
- 阈值分割与斑点分析:适合高对比度的缺陷、异物、缺料,配合面积、周长、圆度等特征做判定。
- 边缘检测与亚像素量测:适合尺寸、间距、角度测量,卡尺工具、边缘对工具是主力。
- 模板匹配:适合定位、存在性检测、方向判断,对旋转和缩放可以开相应搜索。
- 形态学与轮廓分析:适合形状异常、毛刺、缺口。
这些工具组合使用的灵活度其实非常高,很多看起来复杂的检测任务,用“定位 + 局部区域 + 多特征判定”就能解决。真正的难点不在工具本身,而在判定逻辑的设计:单一特征容易误判,多个特征加权或者串联判定会稳很多。
深度学习这条路,常见的用法有分类(判断有无缺陷、缺陷类型)、目标检测(找出缺陷位置)、语义分割(输出缺陷区域像素级轮廓)、异常检测(只用良品训练,找出偏离正常分布的区域)。最后这种在缺陷样本稀缺的场景特别实用。
5.3 标定与坐标换算:测量值的可信度从哪来
做测量和引导的项目,标定是绕不过去的环节。简单说是建立像素坐标和物理坐标之间的映射关系。
平面测量用九点标定就够:让标定板或者标准件在视野内取九个位置,记录像素坐标和对应的物理坐标,拟合出变换矩阵。这个流程做起来不难,但细节决定精度:标定点要覆盖整个工作视野、标定板要放平、镜头畸变要先校正、温度变化大时标定需要复验。
手眼标定用于引导机械手,复杂度高一些,需要考虑相机和机器人的相对安装关系,分“眼在手上”和“眼在手外”两种构型。这块我建议第一次做的时候留足时间,标定误差会直接传导到抓取误差,而且它不像算法参数那样可以事后微调。
6. 现场落地:那些文档里不会写的坑
6.1 常见问题速查与排查顺序
我把现场遇到的问题整理成一个对照表,排查时按顺序走,能从大概率到小概率覆盖。
| 现象 | 高概率原因 | 排查动作 |
|---|---|---|
| 图像整体偏暗或偏亮 | 曝光、增益、光源衰减 | 先查光源输出,再看曝光参数是否被改 |
| 检测结果时好时坏 | 光照波动、工件位置漂移 | 对比良品与误判品的原始图像差异 |
| 边缘位置跳变 | 反光、对焦不准、振动 | 检查打光角度、景深、安装刚性 |
| 漏拍或重拍 | 触发时序、信号干扰 | 用示波器看触发信号,核对滤波设置 |
| 通信偶发丢包 | 线缆、接地、总线负载 | 换屏蔽线、查接地、降通信频率测试 |
| 长期运行后精度下降 | 光源老化、镜头污染、机械松动 | 建立定期复检机制,锁定关键参数 |
排查的核心方法是“回到原始图像”。所有判定都来自原始图,先把图保存下来看,比在算法层猜要快十倍。我在项目里会强制打开异常图像保存功能,误判时自动存图,这是最省时间的调试手段。
6.2 环境、安装与长期稳定性的经验
视觉系统的稳定性一半靠选型,一半靠安装和环境。
安装刚性是最容易被忽视的。相机和光源的支架如果刚性不足,产线振动会让图像轻微抖动,短曝光下表现为模糊,长曝光下表现为位置漂移。我吃过一次亏,支架用了细长的铝型材,机器一开就抖,最后换成厚壁方管加斜撑才解决。
环境光干扰同样致命。车间窗户透进来的自然光随时间变化,会让阈值在一天之内漂移。解决办法是加遮光罩、把工件区域围起来,或者用高亮光源压过环境光。这个成本很低,但很多项目到最后才想起来。
镜头和光源的清洁要纳入日常维护。油污、粉尘在镜头上积累是渐进的,等你发现检测变差的时候,可能已经过了几周。我建议在保养计划里明确写上清洁周期和清洁方式,用无水乙醇加无尘布,别用纸巾干擦。
温度对测量的影响在精密项目里必须考虑。相机传感器发热会导致暗电流变化,机械结构热胀冷缩会影响工作距离。高精度场合我会留出预热时间,等系统热稳定后再做标定和验证。
6.3 从方案到验收:怎么定义“做成了”
这一步经常被含糊处理,最后导致验收扯皮。我的做法是在项目开始就把验收标准量化下来:用多少件样本、覆盖哪些缺陷类型、检出率要求多少、误检率上限多少、连续运行多长时间算稳定。
样本的选择尤其关键。不能只用容易的样本验证,必须包含边界样本和历史上真实发生过的难检样本。我一般会要求客户提供至少几十件包含各类缺陷的实物,做出样本库,分成调参集和验证集,验证集在调参期间不许看,最后一次性跑。
还有一个实操建议:把“过检”和“漏检”的成本分开评估。漏检流出到客户手里代价高,过检只是内部返工,两者的阈值设定方向应该不同。这个权衡必须提前和产线、品质部门对齐,不能由视觉工程师单方面拍板。
7. 我个人在这个方向上的一点体会
做机器视觉这些年,我越来越觉得这个领域的门槛不在某一个单点上,而在“全局感”。新手容易盯着算法,老手知道先看光、看机械、看节拍。一个方案能不能成,往往在选型阶段就定了七成,后面的调试只是把那三成补上。
如果你正准备入门,我的建议是先找一台相机、一个镜头、一个可调光源,自己搭一套最简单的测量或者缺陷检测,把从打光到出结果的全流程走一遍。这个过程里你会真正理解什么叫对比度、什么叫景深、什么叫触发时序,这些体感是看多少篇文章都换不来的。等这套东西跑通了,再往深处走,无论是学传统算法还是深度学习,都会快得多。
这个系列后面我会继续往下拆,光源的具体打法、镜头和相机的选型计算、标定的实操细节、传统算法和深度学习的落地对比,每一块都会给出可复现的参数和现场记录。这一篇先把地图铺开,后面逐块填内容。