机器视觉五大应用:计数、缺陷、尺寸、定位、识别全解析 干这行时间长了你会发现一件反直觉的事客户嘴里说的“做个视觉检测”到了产线上其实是五种完全不同的活。有人要你数一数包装里有没有少装零件这是计数判断有人要你看轴承表面有没有划伤这是缺陷检测有人要你量一下螺栓长度是否在公差范围内这是尺寸测量有人要机器臂把手机壳抓到流水线的固定位置这是引导定位还有人是想读懂电子秤显示屏上的数字把读数自动录进系统这是识别读取。它们都被统称为“机器视觉”但从硬件选型、算法设计到验收标准差别之大简直像五个行业。这篇文章就沿着这五条线把每一类应用的核心逻辑、落地套路和我踩过的坑拆开讲。适合刚入行的机器视觉应用工程师、正在评估技术方案的工艺和质量人员也想给那些打算系统规划机器视觉学习路线的人一个坐标系——先把五类项目分清楚比闷头刷一百个算法教程管用得多。1. 为什么要先给“机器视觉”分类而不是直奔算法1.1 “检测”这两个字害了多少项目我接过很多需求沟通对方开口就是“我们这边要上一套视觉检测”聊到第二句才明白他要的根本不是“检缺陷”而是把传送带上的不同物料数一遍或者读一个条码。类似的情况在项目里反复出现。原因很简单非视觉背景的人把一切“用相机代替眼睛”的都叫检测但在工程师眼里这五类应用的技术栈几乎不重叠。分类这件事不是学术洁癖。你需要在项目第一天就确认客户要的到底是数量、缺陷、尺寸、坐标还是字符串。这个决定直接影响你选什么相机、什么光源、什么镜头进而决定算法是阈值加连通域还是深度学习分割或者是九点标定加机器人通信。我见过最典型的翻车项目客户说“做一个外观检测”集成商按缺陷检测报价又是买高分辨率相机又是上深度学习服务器结果到场一看客户真正想解决的是料盘里有没有漏装零件一个再普通不过的计数项目。方案严重超配报价贵了三倍算法还因为过度设计变得难维护。所以你说先分类重不重要。1.2 五类应用的边界从图像输入到决策输出这里我习惯用“决策输出”来定义五类应用而不是用算法名应用类型核心输出典型场景常见技术路径计数判断多少个料盘漏装、泡罩包装缺粒、散料盘点阈值分割 连通域 形状筛选缺陷检测有没有问题、什么问题轴承划伤、螺栓毛刺、晶圆颗粒传统Blob分析 / 深度学习分割尺寸测量多少毫米、多少度螺栓长度、孔径、边缘间隙标定 亚像素边缘 几何拟合引导定位在哪里、怎么放机械臂抓取、对位贴合、装配引导手眼标定 坐标变换 位置补偿识别读取是什么内容、哪个码字符OCR、二维码/DPM码、仪表读数OCR引擎 / 解码库 / 小分类模型这五个方向可能在同一个整机项目里同时出现但往往会有一个主应用决定整体架构。比如一个电池组装线引导定位负责把电芯抓进夹具缺陷检测负责检查极耳焊接质量识别读取负责读电芯上的码并上传MES尺寸测量负责量极耳间距。每个工位是独立的视觉单元只是集成在同一个上位机里。做系统设计时先把每个工位的“决策输出”写清楚再去谈硬件和算法这是我能给的最实在的建议。2. 计数判断流水线上被严重低估的“数数”项目2.1 计数判断在产线上到底解决什么问题很多人觉得数数有什么难的不就是统计个数吗。但真正上过产线的人知道计数项目从来不是“数得对”就行而是要在节拍内、在有干扰的情况下、在长时间运行中一直数得对。电子制造业的料盘上密密麻麻排布着几百个电感或电容药厂的泡罩包装里要确认每一粒药都在五金车间的散料框里要统计螺栓数量防止漏发——这些都是计数判断的典型场景。这类项目通常没有复杂的缺陷判定逻辑但对鲁棒性的要求极高。同一批零件可能有轻微脏污、有毛刺、位置有旋转光照还会随早晚变化。计数项目的难点从来不是“能不能数出来”而是“在这么多干扰下能不能稳定数出来”。2.2 经典处理链路阈值、连通域、形状筛选计数项目百分之八十的工作在成像端而不是算法端。当你把打光做好背景和前景灰度拉开之后剩下的就是一套非常经典的图像处理流程。以OpenCV为例核心思路是这样import cv2 import numpy as np # 读图并转灰度 gray cv2.imread(part_tray.jpg, cv2.IMREAD_GRAYSCALE) # 大津法自动阈值把零件和背景分开 _, binary cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV cv2.THRESH_OTSU) # 开运算去噪去掉背景上的细小颗粒 kernel np.ones((3, 3), np.uint8) binary cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations1) # 找连通域 n, labels, stats, centroids cv2.connectedComponentsWithStats(binary) # 按面积范围筛选相当于软件里的“忽略点数” count 0 for i in range(1, n): area stats[i, cv2.CC_STAT_AREA] if min_area area max_area: count 1这段代码里的min_area和max_area其实就是很多视觉软件里那个“忽略点数”参数的底层逻辑。它的作用是过滤掉面积过小的背景噪声以及面积过大或者过小的非目标物。在Halcon里对应的就是thresholdconnectionselect_shapecount_obj这一套本质是完全一样的。2.3 遮挡重叠与“忽略点数”的坑计数项目真正的噩梦是零件叠在一起。一旦堆叠连通域会把两个零件当成一个整体数量直接少算。这时候你有三个选择第一改机械结构用振动盘或者斜坡让物料尽可能分散——这通常是最有效且最便宜的办法第二用分水岭算法做粘连分割但对严重重叠基本无能为力第三上目标检测网络比如训练一个小型的YOLO或者密度回归网络对小目标密集场景效果比传统算法好不少。另外要提醒一下“忽略点数”这个参数它看起来只是个数字实际上对结果影响极大。我接过一个料盘项目实际放了42个零件系统只数出40个。当时怀疑算法有问题各种调参数都没用后来发现是照明不均匀料盘两端的零件对比度偏低二值化后边缘被削掉一块面积跌破了下限被当成杂点忽略了。最后换了更均匀的面光源问题当场消失。所以遇到计数不准先别急着调代码先去看打光亮度是不是均匀。3. 缺陷检测从轴承划伤到晶圆颗粒最难统一的一类3.1 先给缺陷分类再谈算法缺陷检测是机器视觉里项目占比最高、也最容易返工的一类。难点在于“缺陷”这个词太宽泛了。我在实际项目里习惯先把缺陷分成三类表面缺陷划伤、压痕、脏污、涂层缺失、氧化变色。结构缺陷缺料、裂纹、毛刺、堵孔、偏心、断裂。功能性缺陷颜色偏差、透明件折射异常、装配错位。不同缺陷对应的成像方式和算法思路完全不同。以热搜里常被提到的轴承缺陷检测为例轴承内外圈是高反光曲面要检测滚道上的细小划伤通常需要用低角度环形光源打出亮暗条纹让划伤在特定角度下形成明显的灰度跳变否则直接上再好的算法也没有用。螺栓缺陷检测也是类似道理螺纹区域反光复杂普通打光会在螺纹牙尖形成大量伪影不做光学设计就做算法等于在垃圾数据里淘金。3.2 传统视觉的看家本领打光与Blob分析老工程师常讲“缺陷检测七分靠光三分靠算法”这句话是拿项目喂出来的。很多看似复杂的缺陷只要光打得对会变成非常简单的灰度异常然后一个threshold加Blob分析就能搞定。黑色塑料外壳上的刮伤用低角度光能把刮伤照成亮线和背景灰度差距很大透明玻璃的裂纹用背光暗场可以拍成暗线金属表面的磨削纹理异常需要调整光源角度让纹理方向暴露出来。这里还要提一下图像傅里叶变换。在织物纹理、金属磨削纹路这类周期性纹理产品上正常纹理在频域里会形成特定频率的尖峰而缺陷往往表现为频谱的局部异常。做一个陷波滤波把周期性纹理的频率抑制掉再逆变换回空间域缺陷区域就会从背景纹理中凸显出来。我在一个金属外观项目里就用过这个思路传统空间域算法怎么调都被纹理干扰频域滤波之后缺陷清晰得感人。缺点是频域处理对图像尺寸和计算耗时不太友好需要权衡节拍。3.3 深度学习时代DINO这类方法为什么进入工业圈传统算法最大的软肋是“未知缺陷”。生产线今天出现一种以前没见过的不良传统规则算法基本束手无策。深度学习分类网络能解决一部分问题但它依赖于大量标注样本——每一个缺陷类别都要收集几百上千张图在工业现场非常难凑齐。这几年自监督方法开始进入工业视觉的视野DINO和它的升级版DINOv2在2D缺陷检测里的对比讨论特别多。DINO的核心思路是先在大规模自然图像上做自监督预训练让模型学会“什么样的纹理特征才是正常的”然后再用少量甚至只是正常样本去判断图像某一块区域是否偏离了正常分布。这和工业场景简直就是天生一对正常样品一抓一大把带缺陷的坏品反而稀缺。在不少2D缺陷检测场景里DINO类特征做区域定位的效果已经明显好于随便训练的CNN分类模型。但也要泼一盆冷水DINO类模型对显存的要求比较高处理高分辨率图像时需要分块推理再拼接耗时偏大不太适合动辄几十毫秒节拍的在线检测。而且它擅长“知道这里不对劲”但未必能精确告诉你“是哪种缺陷”。实际落地时我经常采用的做法是用DINO/自监督模型做缺陷候选区域粗定位再配合一个轻量级分类网络做缺陷细分。两者结合既能降低样本需求又能兼顾产线节拍。3.4 样本、标注、误杀率缺陷项目真正的拦路虎聊了这么多算法我想说缺陷检测项目真正难住的从来不是算法而是样本和验收标准。以晶圆wafer这类半导体场景为例缺陷类型极其分散颗粒、划伤、水痕、光刻图形缺陷而且对误判的容忍度几乎为零。算法模型再好如果没有覆盖足够多的真实缺陷样本一上产线就会不停误杀最终被老板叫停。我的经验是做缺陷检测项目先建立样本采集计划别急着标数据。让产线实际跑一周把各种坏品图像攒下来尤其是那种“说不清是不是缺陷”的临界样本。标注时把“轻微缺陷”和“噪声干扰”分开甚至专门建一个“不确定”类让模型先学会区分确定与不确定减少误杀。验收的时候也别只看准确率同时盯漏检率和误杀率两个指标。只追求准确率模型会变得极其保守把好品全杀光准确率照样好看但产线根本没法用。4. 尺寸测量精度不是想出来的是算出来的4.1 标定像素距离到物理尺寸的桥梁尺寸测量项目的本质是让视觉系统输出“毫米”而不是“像素”。这个看似简单的需求第一步就会难住一批人像素尺寸怎么换算成物理尺寸答案是标定。最简单的办法是放一个已知尺寸的标准件或标定板拍一张图算出每个像素对应多少毫米。这里有个很常见的认知误区。很多人以为相机分辨率够高就能测准。实际上精度和分辨率是两回事。举个例子视野宽度10mm相机分辨率2448像素水平方向单像素对应约0.0041mm但这并不代表系统能量出0.004mm。因为边缘检测存在灰度过渡、镜头畸变、照明波动实际可靠精度通常按3到5个像素估算也就是0.012到0.02mm左右。如果这个精度不够要么换更高分辨率的相机要么缩小视野要么用亚像素算法把边缘定位精度再往上提。4.2 亚像素边缘与重复精度为什么同一个工件反复量结果总是有零点零几毫米的抖动因为图像边缘不是一条理想的黑白分界线而是一个灰度渐变带。亚像素算法就是利用灰度梯度做拟合把边缘位置定位到小数像素级别。但亚像素不是万能的它受限于成像质量。如果镜头解像力不够、光照不稳定、工件有微小振动亚像素反而会把噪声放大出现看着算法很高级、数据却乱跳的情况。提升重复精度的另一个关键细节是用“边缘找正”替代直接测量。比如你要测某个特征的长度不要直接测量坐标差而是先用一条稳定的边缘建立测量坐标系再在这个坐标系里做尺寸计算。这样做的好处是工件在视野里的微小旋转和平移会被坐标系抵消不会叠加到测量结果里。另外尺寸测量项目应该用统计指标来验收常见的是做GRR量具重复性与再现性分析而不是拿一张图量一次就宣布“精度达标”。4.3 温度、振动、夹具测量项目最大的“假想敌”尺寸测量项目里有一个特别容易背锅的环节。车间白班和夜班温差大金属零件随温度热胀冷缩视觉系统测出来的尺寸漂移了客户第一反应是“视觉不准”但真正常见的坑恰恰是“被测物本身变了”。所以做测量项目第一步不是调算法而是确认测量环境是否稳定。镜头选型上尺寸测量我最推荐优先考虑远心镜头。普通工业镜头有个毛病物距轻微变化放大倍率就会变被测物稍微高了一点低了一点测出来的尺寸就跟着变。远心镜头可以消除这个影响它在一定的景深范围内放大倍率基本不变是做精密测量的首选。螺纹测量也是一样普通镜头很容易因为对焦不实导致边缘模糊远心镜头加合适的照明能让牙型边缘稳定成像。最后提醒一句验证测量系统精度时一定要用经过计量校准的标准件做参照拿生产线上的被测产品当“真值”是项目里最常见的错误做法。5. 引导定位让机械臂“看得到”还得“摸得准”5.1 定位是看见引导是够到引导定位和前面几类应用有个本质区别它最终的输出不是一张结论图而是一组要交给机器人或运动控制系统的坐标。比如工件在传送带上位置漂移视觉系统拍下图像识别出工件的位置和角度然后把它换算成机器人的抓取坐标。很多人把“在图像里找到特征点坐标”等同于“完成了定位任务”这是两码事。图像上的一个点要变成机械臂末端真正能抓准的那个三维点中间隔着标定、手眼关系、机器人自身的重复精度一步不到位视觉看得很准机械臂照样抓偏。5.2 坐标系链条与手眼标定引导定位的理论基础是一整条坐标系变换链像素坐标系到图像坐标系再到相机坐标系再到机器人基坐标系最后到夹具或工具坐标系。每一级变换有一个矩阵串起来之后你才能从图像的(u,v)坐标推算出机械臂应该移动到的位置。实际项目里最常用的有两种手眼关系eye-in-hand相机装在机械臂末端相机跟着机械臂一起动。优点是视野灵活适合小范围高精度抓取缺点是对运动标定要求高。eye-to-hand相机固定在支架上机械臂在相机视野里工作。优点是视野大、标定一次管很久缺点是精度容易受到机械臂遮挡和视野边界的限制。九点标定是最经典的落地方法。操作步骤是让机械臂末端装一个针尖在视觉视野里走一个九宫格每个位置记录针尖的像素坐标和机械臂的机器人坐标九组对应点做仿射变换拟合得到一个像素坐标到机器人坐标的变换矩阵。这套流程看着简单实操中我踩过不少坑针尖在标定过程中被撞弯了、标定时有人动了相机支架、机器人走了实际坐标但记录错了位姿任何一个细节都会导致标定结果静偏差。如果机器人抓取时还需要对准角度就要额外做旋转中心标定。让机械臂带着一个特征点旋转多个角度视觉记录下特征点的像素轨迹拟合出旋转中心的像素坐标再和机械臂的旋转中心对齐。这一步很容易被忽略但做过你就会知道没有旋转中心标定的引导定位角度一偏就是砸工件的节奏。5.3 动态跟随把拍照延迟算进精度里很多产线不是停机拍照而是工件在传送带运动过程中就要完成抓取。这时候会出现一个“时间延迟误差”视觉拍下照片的瞬间工件在位置A画面传输、算法处理、坐标下发需要几十毫秒机械臂真正动作时工件已经跑到位置B了。如果不做补偿你看到的坐标永远比工件实际位置落后一段距离。这个补偿逻辑其实不复杂。假设传送带速度是100mm/s拍照到抓取的延迟是50ms那工件在这段时间里前进了5mm。如果不补偿就会有5mm的位置偏差。所以视觉系统要把传送带编码器速度或者测距数据纳入计算对坐标做一个前馈修正。还有一种做法是线阵相机加编码器触发通过编码器脉冲同步拍摄位置从根本上消除时间延迟带来的累积误差。动态跟随之类的方案最好在项目设计初期就和机械、电气确认清楚等设备到场再改往往要牵连结构和控制成本很高。6. 识别读取OCR、码读取和信息上云6.1 识别读取不只是OCR识别读取的范围比很多人想象得宽。它包括印刷字符OCR、一维码和二维码读取、DPM码识别直接在金属或塑料表面激光雕刻的微细点阵码还有各种仪表屏幕的数字读取。典型场景是电子元器件上的字符和二维码追溯生产线上扫一下信息自动进入MES系统形成数据闭环后面任何时候都能查到这颗料是什么批次、哪个机台产出来的。识别读取和前面几种应用关注点不同。它不关心零件整体长什么样只关心“读不读得到、读得准不准、速率能不能跟上节拍”。算法上字符类任务通常依赖OCR引擎和字形分类模型码类任务依赖解码库而系统集成上往往需要连接数据库、PLC和MES接口。真正做起来通信协议和数据格式的坑有时候比识别算法本身还多。6.2 数码管仪表读数一个被问烂但极其典型的场景机器视觉代码识别电子秤数值、仪表自动读数这类需求在行业里被问烂了但恰恰是最能说明识别读取项目本质的例子。电子秤显示屏上的数字基本上是七段数码管。处理逻辑很典型先定位数码管显示区域再分割出每一位数字然后利用七段数码管由a到g七个段组合成0到9的几何结构做一个段码识别或者训练一个小尺寸分类模型判断每一位。传统段码识别方法非常快稳定性也高但条件苛刻要求数码管亮度均匀、笔画完整、没有半亮和伪影。我接过一个磅秤读数项目一开始字符识别在“1”和“7”之间反复横跳怎么调参数都没用。排查半天发现是背光透过面板形成了一条斜向伪影恰好落在数字区域给段码判断造成了干扰。换了光源角度把伪影从数字区域移开问题立刻解决。所以识别读取项目遇到字符错乱第一反应永远是检查成像而不是疯狂换OCR引擎。6.3 深度学习OCR与码制选择传统OCR对规则印刷体很好用但一旦遇到变体字体、弯曲字符、复杂背景上的字符或者标签上有脏污遮挡就开始吃力。工业OCR这几年逐渐向深度学习迁移训练一个字符识别模型时关键在于收集现场不同状态的真实样本笔画残缺的、轻微脏污的、光照偏暗的都要有。只拿干净样本训练一上线就露馅。码读取方面的选型逻辑也值得单独说。如果产品表面打码空间小、要求信息量大DPM码往往是优先选择。DPM码直接打在金属或塑料表面没有标签对比度金属表面反光又严重普通光源经常读不出来。实际项目里常用同轴光、圆顶光或者多角度光源来压制镜面反射把码的对比度拉出来。有些工程师看到DPM码第一反应是换个更高端的读码器但很多时候问题出在光源角度不对而不是解码能力不行。6.4 现场字符残缺与泛化问题识别读取项目上线后最容易遇到的问题是“字符残缺率会随生产状态变化”。打印机喷头轻微堵塞字符笔画少了半截头两天还勉强能读磨损加重之后误读率直线上升。这种问题靠换模型治标不治本。我的建议是设置“白名单置信度阈值”双保险。当允许的码制有限、字符集固定时先做格式校验完全不符合规则的字符串直接判NG不给它“强行读出一个错码”的机会。同时给OCR结果加置信度门槛置信度低于某个阈值时宁可判NG送去人工复核也不要赌一把放过去。像晶圆ID识别这类场景读不到只是生产线停一下读错了会导致追溯信息错乱后面整批产品都被污染损失完全不是一个量级。7. 一个整线项目里五种应用如何共处7.1 需求清单到应用映射现在回到开头的问题一个复杂整线项目怎么把五种应用组织起来。我的做法是先画一张表把每个工位的输入、期望输出、应用类型、核心指标都列出来。比如来料工位要“识别物料型号并定位抓取点”那就是识别读取加引导定位组装工位要“检查外观并测量关键尺寸”那就是缺陷检测加尺寸测量成品工位要“读码并核对装配状态”那就是识别读取再加缺陷判断。这张表一出来项目架构、硬件选型和算法分工就全部落地了。7.2 硬件选型跟着应用走千万别用一套视觉硬件去硬扛所有需求。不同类型应用对硬件的要求差别很大缺陷检测要分辨率高、光源角度讲究表面类型和缺陷类型决定用低角度光、同轴光还是背光尺寸测量要优先远心镜头和低畸变相机测量环境温度还要稳定引导定位要帧率够高、曝光时间短减少运动模糊识别读取对景深和清晰度要求高码类需求甚至可以直接用专业读码器。我见过不少项目为了省一个相机钱非要用一套视野又大、精度又要求高的系统覆盖两种应用最后每种都做不好反复返工成本反而更高。7.3 核心应用先跑通再谈系统集成把五种应用塞进一个大系统时我习惯按风险排序来做技术验证。先做最不确定的部分通常是缺陷检测的样本验证和尺寸测量的精度验证这两块如果方案不成立整个项目基本就得换路线越早发现越好。计数判断、识别读取、引导定位的确定性相对高可以放到后期再做系统联调。如果是LabVIEW这类平台做上位机注意它内置的视觉模块处理传统算法很顺手但想嵌入深度学习模型一般得预留额外的推理服务接口否则后期集成会非常被动。7.4 验收标准要写在需求评审时最后一条经验特别土但特别管用验收标准一定要在需求评审阶段就定下来不要等设备到了现场再讨论“怎样算合格”。计数项目写清楚数量准确率缺陷检测项目写清漏检率和误杀率尺寸测量项目写清重复精度和GRR指标引导定位项目写清机器人的到位精度识别读取项目写清读取率和误读率。不定义清楚生产方觉得95%合格已经很好了客户却坚持99.5%才算达标项目验收就会变成拉锯战扯皮成本可能比开发成本还高。如果你现在刚开始琢磨机器视觉学习路线我的建议很朴素先在脑子里把这五类应用立住再找一两个实际项目从头跟一遍最后回来补卷积神经网络、傅里叶变换、手眼标定这些细节知识。按这个顺序走你会发现很多概念自然就串起来了不像零散刷教程那样学了记不住、记住不会用。机器视觉这行说到底不是比谁库调得熟是比谁能在项目现场快速判断“这是什么问题、该用哪一类方法、坑大概在哪里”。五类应用的分界就是这层判断力的第一块基石。