ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

机器视觉系统从选型到落地:硬件、算法与现场调试全攻略

机器视觉系统从选型到落地:硬件、算法与现场调试全攻略 简介这是一套基于 Vue 的视觉系统前端项目适合有一定 Vue 基础、正在学习组件化开发或需要快速搭建可视化界面的开发者。项目采用标准 Vue CLI 工程结构从入口页面到视图组件、路由与状态管理均有清晰分层可帮助读者理解 main.js、App.vue 的启动逻辑也能直接通过 npm install 安装依赖、npm run serve 启动调试便于在此基础上扩展视觉功能模块npm run build、npm run lint 等脚本也已配置好可直接用于生产构建与代码检查。压缩包共 15 个文件包含 4 个 Vue 组件、4 个 JavaScript 逻辑文件、2 个 JSON 配置、1 个 HTML 入口文件以及 README、图标等辅助资料整体约 131KB体量轻、结构简单。从内容结构看components、views、router、store、assets 等目录分离明确适合作为 Vue 项目目录规范与前后端分离开发的入门样例。目前已有 2040 人学习下载对于需要参考完整工程骨架或做界面模块复用的开发者有直接借鉴价值。1. 视觉系统到底是什么给产线装一双能定量的眼睛连接器针脚有没有歪、药品说明书上的批号印没印全、手机中框边缘有没有划痕——这些活儿过去靠老师傅肉眼盯着现在靠一套视觉系统替人看。视觉系统的本质并不神秘用相机代替人眼用算法代替人脑的判断用光源和控制器对抗现场的光线干扰最终输出一个「OK / NG」信号或者一组坐标数据给 PLC。它解决的问题是人的眼睛会累、会漏、标准不统一而视觉系统能把「看起来差不多」变成「实测数值是多少」——检测、定位、测量、识别四大类需求覆盖了产线上百分之八十以上的质检工位。这篇文章写给两类人一类是刚接手视觉项目的设备工程师手里有工位需求但不知道从哪里选型另一类是被算法黑匣子困扰的老手想弄明白为什么同一套系统换个车间就翻车。我不打算铺开讲所有相机品牌和 SDK只讲一套从零搭起来的完整思路硬件怎么配、图像怎么采出来、算法怎么选、现场怎么调、最后怎么验证它真能扛住量产节拍。全程围绕「能落地」三个字展开所有参数和命令都按一线车间最常见的方式给出来。2. 视觉系统硬件选型先算清楚靶面、焦距和光源再谈算法视觉系统不是买了相机就能出图硬件匹配一旦出错后面算法再强也是白搭。我见过太多项目在算法阶段折腾了半个月最后发现是光源没选对换个角度打光原来要写的腐蚀膨胀全都不需要了。所以这一章按「相机 → 镜头 → 光源」的顺序把选型逻辑和计算公式讲透。2.1 相机选型分辨率不是越高越好先算视野和精度相机选型第一步不是看像素数而是算「在多大视野内看到多小的缺陷」。现场常见的误区是觉得 500 万像素一定比 200 万像素好实际上分辨率只需要满足最小检测特征占 3×3 到 5×5 像素就够了过分追求高像素只会拖慢帧率和图像处理速度还增加存储成本。计算公式很简单相机横向分辨率 ≈ 视野宽度 / 检测精度。比如要看的视野是 50mm 宽最小缺陷是 0.1mm那么横向至少需要 50 / 0.1 500 像素留出 2 到 3 倍冗余取 1500 到 2000 像素对应 200 万像素级别的相机就够了。真正要关注的是靶面尺寸和像元大小靶面决定镜头能不能覆盖全视野像元大小则影响低对比度下的灵敏度——像元越大感光面积越大弱光下表现越好但分辨率会受物理尺寸限制。接口选择上GigE 接口是最通用的网线长传 100 米没问题PoE 供电还能省一根电源线USB3.0 相机便宜、CPU 占用低但线长被限制在 3 米以内适合桌面级设备。如果是高速运动场景比如每分钟检测 200 个工件这时候优先考虑带硬件触发功能的相机具体触发逻辑放到第三章讲。2.2 镜头焦距用工作距离和视野反推别凭感觉买镜头选型有一个基本公式焦距 f 工作距离 × 靶面尺寸 / 视野宽度。举个例子检测距离是 200mm希望看到的视野是 50mm相机靶面宽是 6.4mm1/2.3 英寸常见规格那么 f 200 × 6.4 / 50 ≈ 25.6mm选一个 25mm 或者 35mm 的标准工业镜头都行。这里最容易被忽略的是「工作距离是否还能改」。很多设备结构已经定型镜头装上后发现焦距不对要么加延长环改变像距要么重新加工机械件挪相机位置。我的建议是选型阶段就把工作距离放宽 10% 到 15% 的余量同时预留镜头支架的上下调节槽给现场微调留出空间。镜头还分定焦和变焦、远心和非远心。定焦镜头畸变小、性价比高是产线视觉的主力远心镜头贵但能在一定高度范围内消除透视误差适合精密测量场景比如针脚共面度检测。非远心镜头下物体离相机近会显得大远会显得小如果被测物本身有 1mm 的高度差而测量精度要求 0.02mm普通镜头直接不够用必须上远心。2.3 光源是视觉系统的「命门」颜色、角度、频闪三件事光源决定图像对比度算法只是把对比度变成判定结果。现场最常见的教训是用白光打高反光的金属表面结果整个画面白花花一片什么特征都看不到。解决思路只有一条——让缺陷和背景的灰度差尽可能大。颜色选择上有个实用规律同色光照射同色物体物体会显得更亮异色光会被吸收显暗。打金属拉丝表面的划痕用低角度红光照射划痕处会因散射变暗背景保持亮对比度直接拉满。塑料件上的黑点缺陷用白色背光源从底下往上打黑点在亮场里变成清晰的黑色剪影。这些属于光学玄学范畴需要根据实际样品反复试但方向是先试低角度、再试同色光多数问题都能解决。频闪光源是另一个关键点。相机用硬件触发抓拍瞬间光源同步闪亮几十微秒把瞬间亮度拉高既能压住环境光干扰又不会因为持续发热导致光源衰减。现场用频闪模式时光源控制器需要接在 PLC 或相机的触发输出端不是简单接个 24V 电源就完事。2.4 一套最小硬件的选型参数清单我这里给出一套中等检测精度的参考配置覆盖前面讲的选型计算供第一套系统参考部件推荐规格选型依据相机500 万像素黑白 GigE靶面 2/3 英寸黑白对弱对比度更敏感彩色信息通常用不到镜头定焦 25mmC 接口光圈 F4-F8配合工作距离 200mm 满足 50mm 视野光源低角度环形红光带频闪控制器金属表面划痕与背景对比最强触发接近开关或光电传感器NPN 输出到相机避免自由运行造成的图像位置漂移工控机普通 i5 工控机8GB 内存不跑深度学习时完全够用这套配置不是唯一的正确答案但它适合六成以上的通用检测场景。如果你只做读码或简单的有无检测可以降低相机分辨率省成本如果做高精度测量需要换成远心镜头和更小视野。记住一个原则光源的优先级高于相机分辨率把光打好200 万像素能干出别人 1200 万像素的活儿。3. 从零搭一套视觉系统相机网络配置、触发采集与像素标定硬件到位后接下来的任务是把图像稳定地采到工控机里并让像素坐标能换算成物理尺寸。这个阶段最容易卡壳因为涉及到网络配置、SDK 调用和触发同步任何一个环节没理顺采集端就会不稳定。本章给出一套用 Python OpenCV GigE 工业相机的完整流程这套方案不需要购买商业软件非常适合原型验证。3.1 相机网络配置让工控机找到相机的三步操作GigE 相机连接不是插上网线就能自动出图。相机出厂默认 IP 往往是 192.168.x.x 的固定地址工控机网卡需要先配置在同一网段才能通信。大多数工业相机厂商会提供 IP 配置工具但更底层的方法是用命令行操作适合批量部署时脚本化配置。在 Windows 工控机上以管理员身份打开命令行把相机网卡 IP 设置为静态地址192.168.1.10确保和相机默认网段一致# 查看当前网卡名称记下连接相机的那块网卡的 idx netsh interface ipv4 show interfaces # 给相机网卡设置静态 IP注意别把工控机对外通信的网卡改掉了 netsh interface ipv4 set address name以太网 static 192.168.1.10 255.255.255.0设置完成后用ping 192.168.1.100测通相机默认 IP。如果 ping 不通先用厂商配套的 IP 工具扫描相机当前地址有些相机出厂是 DHCP 模式需要等它自动获取到地址再从工具里改成静态 IP。我的经验是直接把相机和工控机用一根网线直连不要经过交换机能省掉大量排查时间如果要走交换机必须确认交换机支持巨型帧且不会屏蔽广播包。相机固定好 IP 后在 Python 里用通用的 GigE 采集库验证连接。下面以常见的pypylon为例写一段最基础的取图脚本思路同样适用于其他品牌 SDK只是函数名不同# 最简单的 GigE 相机取图脚本 from pypylon import pylon import cv2 # 创建相机对象自动发现并连接第一台可用相机 camera pylon.InstantCamera(pylon.TlFactory.GetInstance().CreateFirstDevice()) camera.Open() # 设置相机参数触发模式打开等待外部信号触发 camera.TriggerMode.SetValue(On) camera.TriggerSource.SetValue(Line1) # 循环等待采集超时 5 秒触发信号来自接近开关 while True: grab camera.StartGrabbing(1) if camera.WaitForFrameTriggerReady(5000): frame camera.RetrieveResult(5000) if frame.GrabSucceeded(): img frame.Array cv2.imshow(capture, img) if cv2.waitKey(1) 0xFF ord(q): break frame.Release() camera.Close()这段代码把相机设置成外部触发模式信号源指定为相机的 Line1 输入引脚。接近开关每检测到一个工件就发送一个高低电平跳变相机才曝光一张这样每一帧图像的工件位置都在视野中央不会因为传送带运动导致位置漂移。参数说明TriggerMode设为 On 表示只响应外部触发TriggerSource选择 Line1 对应物理接线端口RetrieveResult的超时时间要大于触发信号的间隔否则会报超时错。3.2 触发接线与信号同步自由运行模式为什么会导致误判关于触发模式我要多强调几句。很多第一次搭系统的工程师为了省事把相机设为自由运行模式也就是按固定帧率连续拍摄。这种做法在小批量验证时看不出问题但一到高速产线就会暴露工件在视野里的位置是随机的前一张和后一张之间可能隔了大半个视野算法里所有基于固定坐标的 ROI 区域全都失效检测结果忽好忽坏。正确的接法是感应开关接近开关或光电传感器的 NPN 输出接到相机 I/O 输入端相机收到跳变沿就抓拍一帧。这里有一个容易踩坑的细节NPN 输出默认是低电平有效有些相机的触发信号需要高电平有效现场需要根据相机手册把 TriggerActivation 参数设置为 RisingEdge 或 FallingEdge。调试时可以通过手动短接触发引脚来确认相机确实能采到图排除接线问题的干扰。还有一种常见情况是相机触发了但抓拍到的工件位置偏移。原因是触发延迟——感应开关检测到工件的瞬间工件到相机视野中心还有一段物理距离这段距离乘以传送带速度就是位置偏差。解决办法是让感应开关的安装位置提前提前量等于传送带速度乘以触发延迟时间或者直接改用相机内触发加编码器反馈这是更高级的方案原理后面章节会展开。3.3 像素当量标定把像素数变成毫米数的关键一步采到图像只是第一步视觉系统最终要输出物理坐标或尺寸比如「针脚偏移了 0.15mm」。这需要通过标定把像素和实际物理尺寸对应起来术语叫像素当量单位是 mm/pixel。标定方法有很多种最实用的场景是固定工作距离下的平面标定适合大多数产线工位。最简单可靠的标定方式是用一个已知尺寸的标定板或标准量块放在工件实际检测位置同一高度拍一张图然后在图像里测量标定件的像素长度# 用已知宽度的量块做像素当量标定 import cv2 # 读取标定图像量块宽度假设为 20.00mm img cv2.imread(calib.bmp, cv2.IMREAD_GRAYSCALE) _, thresh cv2.threshold(img, 100, 255, cv2.THRESH_BINARY) # 找到量块边缘的外接矩形宽度即像素数量 contours, _ cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) rect cv2.minAreaRect(contours[0]) pixel_width max(rect[1][0], rect[1][1]) # 取较长边作为宽度像素数 # 像素当量 实际宽度 / 像素宽度 scale 20.00 / pixel_width print(f像素当量: {scale:.5f} mm/pixel)这段代码先用固定阈值分割出量块区域再用minAreaRect寻找最小外接矩形得到量块的像素宽度最后用已知物理宽度算出像素当量。逻辑说明阈值分割的前提是量块和背景对比度足够高这又回到了光源选择的优先级上如果分割出来的轮廓不平整说明打光有反光或边缘阴影这时候算出标定结果也是错的。标定精度有几个大坑第一标定件必须放在和被测物完全相同的焦平面上哪怕差 1mm视差都会造成当量误差第二相机和被测面要尽量平行倾斜角度超过 5 度时像素当量在全视野内不均匀这种情况下需要做透视校正而不能用一个固定比例第三光圈要固定在标定时的值因为光圈改变会导致镜头畸变量变化。标定不是做一次就一劳永逸微调过光源或镜头焦距后必须重新标定。3.4 离线仿真环境没有相机也能先跑算法的数据准备硬件调试有时很慢但算法开发不必等相机。我的做法是先用手机或普通相机把样品拍下来存成一批图片然后在电脑上离线跑算法验证。只要保证拍摄距离和角度跟实际差不多算法开发就能提前两三天启动还可以把各种形态的样本分门别类储存为后续深度学习的样本积累做准备。离线环境搭建只需要opencv-python和numpy读图、做预处理、验证 ROI 选区逻辑全部可以在没有相机的情况下完成。我建议第一次做视觉项目的人养成一个习惯每个调试阶段都把图像保存下来标记好当时的光源角度和参数形成图像日志。视觉调试最大的痛点是问题不可复现有图像日志才能对比「参数改动前 VS 改动后」的差异避免反复撞墙。4. 视觉系统的算法层传统图像处理与深度学习的边界图像采出来了标定也做完了接下来的问题是算法该怎么选这是视觉系统里最让新手困惑的地方因为可选的工具太多了——OpenCV 有几十种滤波和形态学算子深度学习框架又有各种模型可以套。我给出的选型标准很简单背景稳定则用传统视觉背景不可控或缺陷形态多变则用深度学习。这一章把两种路线的适用场景和实现路径讲透。4.1 传统视觉算法阈值分割和 Blob 分析为什么在产线依然能打在很多人的印象里视觉系统就是深度学习其实产线上一大半项目用传统算法就能解决而且稳定性更优。传统算法的核心是「人为定义规则」缺陷是有固定灰度特征的缺件是多了一块不该有的区域偏移是边缘位置移动了。写规则的过程直白可控出了问题工程师可以直接定位到是阈值高了还是 ROI 选偏了在现场排查效率极高。以注塑件缺料检测为例最常见的做法是灰度阈值分割加 Blob 面积过滤。缺料处通常透光或发暗在背光源照射下会形成明显的低灰度区域代码实现很直接# 注塑件缺料检测阈值分割 面积滤波 import cv2 import numpy as np img cv2.imread(part.bmp, cv2.IMREAD_GRAYSCALE) # 高斯模糊去噪保留大尺度灰度特征 blur cv2.GaussianBlur(img, (5, 5), 0) # 用固定阈值把暗部缺陷提取出来 _, binary cv2.threshold(blur, 80, 255, cv2.THRESH_BINARY_INV) # 形态学开运算去除细小噪点 kernel cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) opened cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel) # 找出连通域面积超过阈值的判为缺料 contours, _ cv2.findContours(opened, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) max_area max([cv2.contourArea(c) for c in contours], default0) if max_area 800: print(NG: 缺料) else: print(OK)这段代码的关键参数有三个threshold的阈值 80 由图像灰度直方图的波谷决定需要在样品上反复验证MORPH_OPEN的核大小影响对零星噪点的容忍度800是面积判据需要统计正常工件的最大的灰度块面积后设定。这套逻辑在产线上能稳定运行很久因为它依赖的是灰度差异而打光是可控的。需要留意的是固定阈值对光照变化极其敏感。如果同一个工位白天和晚上的环境光相差很大固定阈值就会翻车。解决办法是引入动态阈值——采集当前图像的灰度直方图以波峰位置为基准动态调整阈值或者改用差分法提前存一张没有缺陷的标准图当前图与标准图做差差值超过阈值的区域即缺陷。4.2 深度学习什么时候必须上弱对比、纹理缺陷与复杂背景传统算法也有明显的天花板。比如检测布料表面的织造缺陷、铝材表面的复杂纹理划痕、或者识别不同型号的混料零件这些场景特征千变万化人手写规则根本写不完整。这时候深度学习就派上用场了它本质上是从样本里自动学特征不再需要工程师设计「缺陷长什么样」。用深度学习的代价也很实际第一需要大量的标注样本一般每类缺陷至少需要几百张图才能训得稳定第二需要标注工具和训练流程样本收集本身就是一个持续几个星期的工程第三模型的推理结果不像阈值判断那样容易解释出了误判工程师很难从参数上找出原因这也是它被叫做黑匣子的原因。我的建议是先用传统算法做一轮把能筛掉的问题全部筛掉只让深度学习处理剩下那部分「人眼都难描述」的缺陷。这样即使深度学习偶尔误判影响面也小而且训练样本量可以控制在较小的规模。现场常见的部署方式是传统算法跑在 PLC 扫描周期内深度学习模型跑在独立的 GPU 工控机上判定结果汇总到上位机。4.3 样本采集与标注让深度学习模型真正过拟合不了的唯一路径深度学习在视觉系统里能不能落地七成取决于样本来不来得齐三成才取决于模型结构。工业缺陷有个特点分布永远是长尾的常见缺陷几百个罕见缺陷几个而恰恰是那几个罕见缺陷最容易造成漏检。所以样本采集不能靠运气要想办法主动制造缺陷或从已退回的 NG 品里持续补充。标注工具有很多选择通用做法是使用开源标注工具标注目标框或像素掩膜。标注的质量直接决定模型上限我的经验是标注之前先写一份标注规范明确什么才算缺陷、缺陷边界到底画在哪、重叠缺陷怎么处理。没有规范的标注集训出来的模型在验证集上指标高得吓人一到现场就露馅因为不同的人对同一种缺陷画框位置差异很大。训练集还应该包含大量的「OK」样本不能只喂缺陷图。实际产线上缺陷比例可能只有 0.5%如果不让模型见过足够的正常形态它会把一切微小灰度变化都判成异常。数据增强翻转、亮度抖动、随机裁剪可以作为补充手段但对工业场景帮助有限因为缺陷形态和光照在真实现场是相对固定的过度增强反而会破坏灰度的一致性和测量指标。5. 视觉系统调试避坑6 个让现场翻车的真实案例与排查方法视觉系统调试阶段是工程师脑细胞死亡最集中的阶段。很多问题表面上是算法不行深挖之后发现是硬件或环境问题。这一章把我在现场遇到过的典型翻车案例总结成六条踩坑记录按「现象 → 原因 → 解决」的顺序写清楚希望能帮读者绕开这些弯路。5.1 图像忽亮忽暗频闪光源与曝光时间不匹配现象系统在连续运行中采集到的图像亮度周期性变化有时候同一个工件在视野左侧偏暗、右侧偏亮算法的判定结果不稳定。原因光源配置成了常亮模式或者频闪控制器的触发信号没和相机曝光信号对齐。常亮模式下光源发热导致亮度随温度漂移而频闪模式如果触发提前或延后抓拍时灯还没完全点亮或已经开始熄灭。另一个常见诱因是相机的曝光时间设得比频闪光源的实际发光时间长拍到的画面里包含光源未点亮的区间整体亮度自然不稳定。解决把光源控制器接到相机的闪光输出端并确认相机的闪光同步延迟FlashDelay设置正确。将频闪时间和曝光时间做匹配遵循「曝光时间 ≤ 光源发光时间」的原则。更换为同品牌的光源控制器后用示波器观察光源驱动信号和相机触发信号确保波形跳变沿一致。5.2 上午稳定下午误判环境光干扰是个隐形变量现象同一套视觉系统上午检测良品率 99%到了下午阳光照进车间误检率突然升高到 10%而且集中在靠窗的位置。原因车间环境光随时间和天气变化自然光里的红外和紫外成分会干扰灰度图像的对比度。很多视觉工位为了节约成本没有加遮光罩或偏振片环境光直接叠加在光源照明上。解决从两个层面同时处理。硬件上安装遮光罩或柔性光帘把检测区域和外界光隔开软件上改用频闪光源加窄带滤光片的方式让相机只能看到光源波长的光环境光自然被隔离。这一步叫光学滤波是所有高稳定性视觉系统的标配。5.3 标定的像素当量隔天就变了镜头松动和热胀冷缩现象前一天标定结果是 0.0502 mm/pixel第二天同一位置重新测量同一个量块当量变成了 0.0521导致所有测量结果整体偏大。原因镜头锁紧环没锁到位振动导致镜头产生微小位移或车间温度变化使镜头金属筒和机身热胀冷缩改变了实际焦距。解决把镜头锁紧环拧紧并涂螺纹胶固定同时把标定频率设为每个班次开始前自动做一次用标准量块验证当量变化是否在容差范围内。检查机械结构确认相机支架不是直接安装在振动源上必要时加橡胶减震垫。5.4 外部触发信号时而灵时而不灵干扰信号窜入 I/O 线现象接近开关检测到工件后相机有时候拍得到有时候连续拍到两张间隔一长就会漏一拍。算法侧出现了之前从未出现过的空图或重复图。原因触发信号线长距离走线时与动力线绑扎在一起电机启停时产生电磁干扰导致信号沿出现毛刺相机误认为多次触发或漏触发。这种情况在伺服电机旁边尤其常见。解决把信号线换为双绞屏蔽线屏蔽层单端接地走线时与动力线保持 30cm 以上距离。在相机输入端并联一个 1kΩ 下拉电阻并短暂设置 5~10ms 的触发封锁时间用于过滤毛刺和抖动只在信号稳定后开始采集。5.5 算法在历史图上完美、在现场失灵ROI 坐标写死了现象工程师在离线仿真时把 ROI 区域固定在图像某个坐标上测试几百张历史图全部正确。设备装到现场后传送带振动导致工件位置有 2mm 的随机偏移ROI 框到缺陷区域外面算法彻底失效。原因没有做位置归一化ROI 坐标直接写死。产线机械结构不可能像仿真那样理想工件位置、角度、大小都会漂移。解决先做模板匹配定位找到工件在图像中的实际中心坐标再基于这个坐标映射所有 ROI 区域。只有定位稳定了后续的检测和测量才有意义。遇到角度旋转的场景需要用带旋转角度的匹配模板而不是简单的平移匹配。5.6 深度学习模型在测试集上 99% 准确率上线却漏检训练集和现场分布不一致现象模型在标注好的测试集上准确率 99%上线后第一天就连续漏检了一个未见过角度下的缺陷形态被产线停线投诉。原因训练集只包含了单一光源角度、单一曝光参数下拍摄的图像模型学到的特征与现场实际分布存在偏差。这本质上是数据分布漂移的问题。解决样本采集必须在实际工位上持续运行至少一个完整班次覆盖不同光源亮度、不同工件批次、不同皮带速度条件下的图像。上线后建立回流机制定期把新误判图补充到训练集里进行增量训练这是工业深度学习唯一可靠的长期路径。6. 视觉系统上线前必做的验证用重复性测试和灰度直方图给自己留后悔药系统调的差不多之后别着急宣布交付先花半天时间做一轮完整的验证。我见过的项目大部分问题是上线前没做量化评估凭着感觉说「应该没问题了」结果爬到客户产线上才暴露。这一章的验证方法都不复杂但能提前暴露 80% 的隐患相当于给项目上了一份后悔药。第一步是重复性测试同一个工件连续触发采集 30 次跑完整的检测流程记录每次的输出值。对于测量工位要关注 30 次测量结果的标准差一般要求小于容差的三分之一对于检测工位要确保 30 次判定结果完全一致不能出现五次 OK 五次 NG。如果重复性不过关优先排查光源闪烁和振动问题而不是调算法。第二步是灰度直方图检查拍摄一张典型的 OK 工件和一张 NG 工件分别统计图像灰度直方图确认前景和背景的灰度峰之间有明显的波谷。如果两个峰几乎重叠说明当前打光方案对比度不足任何阈值类算法都很难稳定工作。这一步能帮你判断到底该调光源还是调算法。第三步是做最坏情况测试把现场可能遇到的最恶劣条件复现一遍——光线最暗时段、传送带速度最快时、工件来料污染最严重时。用这些极端样本跑一遍系统看看有没有边缘情况没覆盖到。这一步不容易坚持但它决定了一个视觉系统项目到底是「演示能用」还是「量产稳定」。我个人的习惯是每次调完参数都要把相机参数、光源参数、图像样本、算法版本号完全对应地存进一个项目档案文件夹用日期命名。视觉系统的状态由几十个参数共同决定任何一处改动都可能影响最终输出没有版本记录就没有追溯能力出问题只能从头猜这是最大的时间黑洞。希望这些经验帮到你让你的视觉系统项目从第一天起就走在对的路上。本文还有配套的精品资源点击获取
返回列表