干视觉检测这几年,我越来越明白一个道理:框架的灵活性,不是靠多写几个if-else就能实现的。早期我做过一套看似“万能”的检测程序,当时觉得只要把几种算法堆进去、用参数开关切换,就能适配不同产品。结果第一个现场就把我打脸了——同一套代码,换个光源角度,检测率直接从98%掉到70%;换一种材质,原本稳定的阈值分割直接崩溃。
后来我把整个检测系统重新拆开设计,才摸索出今天要聊的这套思路:一套灵活的视觉检测框架,核心不是某个算法有多强,而是成像层、算法层、业务层之间能不能真正解耦,能不能用配置驱动的方式去应对不同产品、不同产线、不同判定标准。这篇文章把我在多个检测项目中验证过的方法、踩过的坑、以及具体的实现细节一次性讲清楚,适合正在搭视觉检测系统、或者想把手头“写死的检测程序”重构得更灵活的读者参考。
1. 先想清楚:你的检测框架到底要应付哪些“变”
很多人一上来就选算法、调参数,其实方向反了。框架设计的第一步,是把“变化”本身列清楚。视觉检测场景的差异,我总结下来主要来自三个层面。
1.1 被检物的形态与表面特性差异
这是最直观的变化。同一条产线上,可能上午检的是金属冲压件,下午换成塑料外壳,甚至还要兼容印刷品和玻璃制品。它们的形状、反光特性、颜色、纹理完全不同。
举个例子,金属件通常有强烈反光,普通漫射光拍出来全是高光斑块,你必须在光源结构上做文章;而塑料件表面可能是磨砂的,对比度低,需要特定角度光才能把缺陷“逼”出来。更麻烦的是,有些产品表面有复杂纹理,比如碳纤维编织纹路,缺陷信号和纹理信号混在一起,算法层必须做纹理抑制,否则误报率会高到没法用。
如果框架在设计之初就把这些差异当成“常态”而不是“异常”,你自然会把光源、相机参数、预处理算法、检测逻辑全部做成可配置项,而不是写死在代码里。
1.2 检测类型与判定标准的差异
同样是视觉检测,业务诉求可能完全不同。有的工位只需要做尺寸测量,比如检测手机中框的长宽、孔径、平面度,核心是亚像素边缘定位,对畸变校正和标定精度要求极高;有的工位做外观缺陷检测,比如划痕、脏污、压伤、缺料,这类检测没有固定模板,更多依赖图像特征和统计模型;还有的工位是字符识别与校验,需要读码、读字符、比对生产批次,核心是OCR的准确率和速度。
更要命的是判定标准会随客户、批次、甚至当天质检人员的口径发生变化。同一个缺陷,上周还允许2mm以下的划痕,这周客户突然要求1mm以上全拒。如果你的框架里判定阈值是散落在代码各处的魔法数,这种变更是灾难级的。
1.3 产线节拍与部署环境的差异
有些视觉系统装在高速冲压线上,每分钟几百件,相机曝光窗口只有几毫秒,这就要求框架支持硬触发、频闪光源,并且图像处理算法要足够快;有些工位则是离线抽检,节拍慢但检测项极多,可能需要多相机、多工位并行,甚至需要机械手配合做“拍-判-分”联动。
部署环境差异还会影响硬件选型:产线震动大会导致图像抖动模糊,你需要更短的曝光时间和更合理的相机固定方式;现场光照不稳定的,需要加遮光罩并用主动光源。这些内容作为框架设计者要考虑进去,因为你的架构必须允许这些参数被灵活配置,而不是换一个项目就重新写一套软件。
2. 整体架构:把“检测”拆成三个可替换的层
搞清楚要应付哪些变化之后,就能回答一个关键问题:什么应该固定,什么应该灵活。我的做法是,把整个视觉检测拆成三个物理和逻辑上相互独立的层,每一层内部只管好自己的事。
2.1 成像层:光源、相机与光学组件的解耦
成像层是视觉系统的“眼睛”,也是很多时候最容易偷懒的地方。很多人图省事,直接买一个一体式工业智能相机,把镜头、光源、处理器集成了。这种方案的优点是部署快、开箱即用,但缺点是灵活性差——换个产品形态往往意味着整台设备都要换,没法在现有硬件上做光源结构或相机参数的调整。
我更推荐的做法是:把光源控制器、相机、镜头分开选型,中间用标准接口通讯。比如光源控制器通过串口或IO控制亮度,相机通过GigE或CameraLink传输图像,镜头是C接口可更换的。这样当产品规格变化时,你只需要换镜头、换光源角度、调整光源亮度,软件里改几行配置就行,用不着推倒重来。
在光学设计上,还要提前预留“多方案切换”的物理条件。比如我习惯在检测工位上设计可旋转的环形光源支架,同一个工位可以方便地在低角度、高角度、同轴光之间切换。这个设计看似是机械结构的小心思,实际是软件灵活性的物理基础。
2.2 算法层:算法组件化与流程编排
算法层是整个框架的核心中枢,也是“灵活性”体现最明显的部分。我主张把图像处理相关的能力抽象成一系列独立、可复用的算法组件,每个组件做一件确定的事,输入是图像或中间数据,输出是结构化的结果。比如:
- 预处理组件:灰度化、滤波、直方图均衡、畸变校正、透视变换
- 定位组件:模板匹配、形状匹配、特征点匹配
- 测量组件:边缘提取、拟合直线/圆、距离角度计算
- 缺陷检测组件:灰度阈值、差影、纹理分析、深度学习分割
- 识别组件:OCR、条码/二维码读取
这些组件对外暴露统一接口,内部实现可以千差万别。组件的输入输出全部用结构化数据,比如检测结果统一用“区域+置信度+特征值”的方式表达。这样做的好处是,上层业务逻辑只依赖结果结构,不关心某一次检测是用了阈值分割还是深度学习,替换算法实现时完全不用改业务流程代码。
在组件之上,还要有一套流程编排机制。因为一次检测往往不是单个算法能搞定的。比如检一个五金件,先要模板匹配把工件定位到标准姿态,然后在定位结果的基础上测量孔径尺寸、检查表面划痕、读取表面字符。这些步骤之间是有依赖关系的,且对于不同产品,步骤的先后和参数完全不同。把流程编排做出来,用配置来定义“先做什么、再做什么、每步用什么算法、以什么参数运行”,才能实现真正的产品级适配。
2.3 业务层:结果判定、统计与联动
业务层处理检测完成后的事:判定OK/NG、记录检测数据、输出统计报表、与PLC或机械手联动。这一层同样需要灵活,因为不同产线的执行逻辑差异太大。
比如有的产线要求检测到NG就立即停机并报警,有的产线希望NG品被自动剔除但产线不停机,还有的产线需要按批次统计良率并生成趋势图。如果这些逻辑全部围绕具体产品写死,每次调整都要改代码,现场维护人员的压力会非常大。
我的建议是,业务层采用规则引擎 + 事件订阅的方式:检测结果以事件形式广播,业务规则(比如“连续3件NG触发停线”“某缺陷出现比例超过X%时报警”)独立配置。这样产线逻辑的调整可以不经过软件开发者,由现场工程人员直接配置完成。
3. 核心板块实操:成像系统怎么做到“一套硬件,多种打法”
架构设计说完了,接下来进入实际操盘层面。先从成像系统开始——这部分选型和参数配置的经验,直接决定了后续算法层的发挥空间。
3.1 光源方案的选型逻辑与常见组合
光源是机器视觉里“性价比”最高的一个环节。很多看似复杂的检测难题,其实就是光源没选对。我见过不少人算法调试三天解决不了的问题,换个打光角度十分钟就解决了。所以在框架里,光源配置必须是一等公民。
常打交道的光源类型就这么几种,我快速过一遍适用场景:
| 光源类型 | 典型效果 | 适合检测场景 |
|---|---|---|
| 低角度环形光 | 突出表面凹凸、划痕 | 金属、塑料表面缺陷 |
| 高角度环形光 | 均匀照亮整体 | 外形轮廓、定位匹配 |
| 同轴光 | 消除反光、看清平面纹理 | 镜面、玻璃、晶圆 |
| 背光源 | 突出轮廓、黑背景亮工件 | 尺寸测量、孔位检测 |
| 条形光源 | 定向照亮,角度灵活 | 大平面、纹理表征 |
| 穹顶光源 | 漫射均匀,无阴影 | 曲面、反光多材质工件 |
| 组合光源 | 多角度分层控制 | 复杂检测需求,分时拍摄 |
实话说,没有任何一种光源是万能的。我的框架做法是把光源结构设计成模块化可插拔:同一个检测工位上预留多个光源安装位,不同产品使用不同光源组合时,软件里的“光源配方”就能描述用哪几路、各路的亮度和频闪时序。这是成像层灵活性的关键。
关于光源亮度的选择,有实测经验分享:要避开相机传感器的饱和区,不要把图像拍得“太亮堂亮堂”。很多新手误认为图像越亮越好,实际拍到过曝后,亮区域的灰度级被截断,缺陷细节反而丢失。我的做法是用灰度直方图检查,把目标区域的平均灰度控制在相对灰度值的60%到80%之间,留出一定的动态范围给缺陷信号。
3.2 相机、镜头、触发方式的配置要点
相机选型主要看分辨率和帧率怎么平衡。分辨率高,视野内能覆盖的细节就多,但图像数据量大了,处理耗时和通讯带宽都上去了。我的经验是:不是分辨率越高越好,而是刚好满足检测精度要求就好。有一个实用公式:一个像素对应的物理尺寸 = 视野宽度 / 传感器水平像素数。对于1mm的缺陷,如果你希望它至少占据3到5个像素,那你需要的视野宽度和分辨率就可以直接计算出来。
举个例子,检测一个宽度30mm的五金件,要求最小缺陷0.1mm清晰可见。要让0.1mm占3个像素,每像素物理尺寸就是约0.033mm,那么水平方向需要的像素数就是30/0.033,大约909个像素。选1200万像素分辨率的相机就绰绰有余,完全没必要上2500万像素。这个公式我在现场反复用,能帮很多人省掉不必要的硬件成本。
镜头方面,我最关心的两个参数是焦距和畸变。定焦镜头的精度和稳定性永远优于变焦镜头,所以框架里优先推荐定焦。畸变小与否,直接影响尺寸测量的精度,在需要精确测量的场景,选低畸变镜头或加一层标定校正。
触发方式上,高速产线必须用硬触发,也就是通过PLC或编码器给相机发脉冲信号触发拍照,保证每一帧都在准确的位置和时刻采集。软件触发只适合静态或低速场景。框架里应支持配置触发源(软件、IO、编码器)、触发延时和曝光时间。曝光时间的换算也有通用方法:如果产线速度是每秒200mm,视场宽度50mm,曝光时间如果设为2ms,那么运动模糊就是0.4mm,这个值如果超过了你要检测的最小缺陷尺寸,图像就会发糊。这时就得缩短曝光或用频闪光源把运动“冻结”住。
3.3 如何通过参数化让同一套硬件快速适配不同产品
成像层参数化的核心,是把所有和拍摄相关的参数放进一个“拍照配方”里。我的配方文件一般包含:
- 相机参数:曝光时间、增益、白平衡、感兴趣区域
- 光源参数:各路光源开关、亮度值、频闪延时时序
- 触发参数:触发源、触发延时、触发模式
- 镜头参数:是否需要自动对焦、焦点位置(如果用液态镜头)
现场切换产品的时候,操作人员只需要在界面上选择产品型号,系统自动加载对应的拍照配方,再执行一次“刷新配方”动作,所有硬件参数在几百毫秒内下发完成。这比让工程师拿笔记本连上相机一个个改参数要高效得多,也几乎没有出错的可能。
为了验证配方是否有效,我还会在框架里加一个“图像质量自检”功能:换配方后,自动抓一帧图像,检查对比度、亮度、清晰度是否在预先设定的合理区间。比如清晰度可以用图像梯度的方差来衡量——图像越模糊,高频信息越少,梯度方差越小。如果自检不通过,系统直接报警而不是拿一张废图去跑算法。这个功能帮我在多个现场拦下了“误配参数”的事故。
4. 核心板块实操:算法层如何封装成“积木式”组件
算法层是灵活性框架里最花心思的部分。我见过太多项目,号称用了深度学习、用了高级算法,但代码结构是一大坨main函数加各种flag开关,看代码的人想死的心都有。做框架,一定要有清晰的分层意识。
4.1 把常用算法封装成统一接口
统一接口到底长什么样?我拿一个典型的预处理组件来说明。在Python风格的框架里,我习惯这样定义组件基类:
class VisionComponent: def __init__(self, config: dict): self.config = config def initialize(self): """加载模型、预计算标定表等初始化工作""" pass def process(self, image, context): """ 核心处理函数。 image: 输入图像(numpy数组或图像对象) context: 上下文数据(dict),用于在组件间传递中间结果 返回: 处理结果(dict),至少包含states状态和data数据 """ raise NotImplementedError def dispose(self): """释放资源""" pass这里的context和返回的dict是组件间解耦的关键。举个例子:定位组件输出的模板匹配结果(位置坐标、角度)会写进context,后续的测量组件直接读取context里的定位结果去确定测量区域,而不需要自己再去全图找工件。这样每个组件都只依赖数据,不依赖其他组件的具体实现。
组件的配置文件也是标准化的,比如一个阈值分割组件被调用的JSON配置可能是:
{ "type": "ThresholdSegmentor", "name": "find_dark_defect", "params": { "threshold_mode": "adaptive", "block_size": 31, "c_value": 2, "min_area": 50, "max_area": 5000 } }这个配置的意义在于,组件的“参数”和“代码”彻底分离了。数据科学家可以专注调param,软件工程师可以专注优化组件内部实现,二者通过结构化配置交互。
4.2 用“检测流程脚本”替代写死的主流程
有了组件,还要有“怎么把这些组件串起来”的机制。我最不喜欢看到的是在代码里写死step1(); step2(); step3();这种固定顺序,因为不同产品的检测流程差异很大。
我的做法是设计一个“检测流程描述文件”,用类似流水线的语义来描述一次完整检测。比如一个外壳检测流程:
{ "name": "shell_inspection", "version": "1.2.3", "steps": [ {"name": "grab_image", "type": "CameraCapture", "params": {}}, {"name": "locate_shell", "type": "ShapeMatcher", "params": {"target": "shell_model", "min_score": 0.8}}, {"name": "check_scratch", "type": "SurfaceDetector", "params": {"region_from": "locate_shell", "relative_offset": [10, 20], "width": 300, "height": 200, "sensitivity": 0.6}}, {"name": "read_datecode", "type": "OcrReader", "params": {"region_from": "locate_shell", "model": "datecode_2024", "min_confidence": 0.7}}, {"name": "check_dimension", "type": "EdgeMeasurer", "params": {"start_from": "locate_shell", "distance_tolerance": [49.8, 50.2]}}, {"name": "decide_result", "type": "ResultAggregator", "params": {"logic": "all_ok"}} ] }这种“步骤列表”的写法有几个好处。一是可读性好,稍微培训一下,现场工程师都能看懂某个产品是怎么测的。二是可调试性好,框架里可以单步执行流程里的某一步,比如只跑“read_datecode”不看其他步骤,排查问题快得多。三是天然支持分支,后面再加个“if defect in scratch then skip dimension”的条件控制,也只是在配置里加节点类型的事。
这套流程编排机制,本质上就是把原来的“代码逻辑”变成了“数据描述”。当你把检测步骤、参数、顺序都变成可配置数据后,新产品的接入工作,就不再是提需求给开发改代码,而是配置工程师在界面上拖一拖、填一填。
4.3 参数自动配比与多产品配方切换
流程文件能解决问题,但还不够“聪明”。我遇到的一个现实问题是:同一款产品,换了不同批次原料,颜色深浅、表面粗糙度会有波动,原来的固定参数不再适用。
解决思路是给框架增加“参数推荐器”。它可以在调试阶段根据当前图像质量指标,自动建议一组参数范围。比如目标区域对比度过低时,推荐把曝光增加、或把分割阈值调低。这里用的不是魔法,而是一套基于图像统计特征的简单启发式规则,以及从历史调试记录里学习到的经验映射。
调试阶段推荐参数,运行阶段自动加载对应产品配方。配方的管理也要规范:产品A、产品B的检测流程和参数分别存储,每个配方带版本号,切换产品时校验一下配方的适用版本,防止拿旧版本的参数去检新批次产品。流程切换的耗时也要优化,理想情况是相机预热、模型加载这种耗时操作在系统空闲时就提前完成,真正收到切换指令时,只需要更新参数和坐标,几百毫秒内完成。
5. 实战复盘:三次典型产品切换,框架到底顶不顶用
理论讲多了,来点实际案例。我用自己的框架在多个模拟项目和现场调试中做过产品切换验证,这里讲几个有代表性的场景,让读者直观感受“灵活”二字的含金量。
5.1 案例A:从金属刻字检测切换到塑料喷码检测
当时的场景是,工厂同时生产金属铭牌和塑料外包装,两种产品都在同一个视觉工位做字符读取。金属刻字是激光雕刻的,字符是灰色的,和金属底色反差很小,光线打上去还会反光,原来用的是低角度环形光加灰度模板匹配;塑料喷码是墨水喷射的,字符黑度高、背景浅,但位置可能略微倾斜。
在旧系统里,这两个产品要用两套独立的程序,切换需要退出当前程序再加载另一个程序,耗时两分钟不说,程序之间还经常出现配置错乱。框架改完之后,我做了两件事:第一,把光源改成多路可切换,同一个工位上低角度光和同轴光都有,配方里指定不同产品启用不同光源;第二,把算法流程里原本用“模板匹配+灰度比较”的处理,拆成了“定位组件”和“字符识别组件”,通过替换识别组件实现在灰度匹配和OCR之间的切换。
结果就是现场切换一个产品,操作员在触摸屏上选一下,确认拍照自检OK,整个过程不到5秒,识别率稳定在99.5%以上。这套框架没有增加任何特殊的算法,只是把原有的检测流程拆开重组了。
5.2 案例B:同名缺陷在不同颜色背景下的参数迁移
有个项目要检测外壳表面的划痕,但外壳本身有黑、白、红、蓝四种颜色。在黑白相机图像里,同样的划痕在不同颜色背景上的灰度表现完全不同——白色外壳划痕是暗痕,黑色外壳划痕反而变成比背景亮的亮痕,红色外壳则是前景与背景灰度差特别小,肉眼都难分辨。
一开始团队的做法是对每种颜色单独调一套阈值,四套参数加起来维护工作量很大,而且每次原料批次波动都要重新调参。后来在框架里加了“颜色空间自适应预处理”:图像先做颜色通道分离,根据产品配方选择能最大化“缺陷-背景对比度”的通道,再进行自适应阈值分割。比如红色外壳,红色通道里缺陷和背景的灰度差可能很小,但蓝色通道或绿色通道里,两者的差异就明显得多。这个选择过程也写成了算法组件,参数配置里只需指定“优先通道策略”。
改造后的参数只有一个“对比度灵敏度”和“最小面积”,四种颜色共用一套检测逻辑,漏检率和误检率都不升反降。这个案例给我的启发是,框架的灵活性不等于参数无限多,而是通过聪明的预处理,把多变的问题转化成稳定问题。
5.3 案例C:新工位部署时只改配置不改代码
最体现框架价值的是新工位部署。有次接到一个新需求,给另一条产线增加一个紧固件检测工位,要检测螺丝是否漏装、有无滑牙。功能上看,这和现有的“小件定位+区域检查”逻辑高度重合。
在框架下,我做的事情是:在新的配置工程里加载基础流程模板,替换定位模型,把检测区域坐标改成新工位螺丝位置坐标,把判定规则改成“任一区域NG则整体NG”,然后下载到现场设备。没有写一行新代码,整个部署从调试到跑通用了半天,连现场操作员都能独立操作了。
假设没有这套框架,这种新工位通常要重新写一个控制台程序,哪怕逻辑再相似,也要经历编码、编译、烧录、调试的整个流程。框架的“配置即开发”理念在这里带来的效率提升,用数据说话就是5倍以上。
6. 现场问题排查与避坑经验
框架搭起来了,真正考验它的是现场运行阶段。下面这些坑,我基本都踩过一遍,整理出来给读者避雷。
6.1 光源一致性导致的“假缺陷”
框架上线后最让人抓狂的问题之一,就是同一产品同一个缺陷,有时候检得出、有时候检不出,甚至同批次产品差异很大。查来查去,很多时候不是算法问题,而是光源不稳定。
光源在长时间运行后,发光效率会衰减,亮度会缓慢下降;另外工厂供电电压波动也会直接影响光源亮度,尤其是一些便宜的非稳压电源,晚上用电高峰期和白天亮度能差10%以上。这个问题在框架里要有监测手段:用标准色卡或参考件定期拍一帧“基准图”,统计图像整体灰度的漂移情况,一旦偏离基准值超过设定范围,提示现场做光源校核或更换。
另一个容易忽视的点是光源的频闪频率。用频闪光源配合硬触发的场合,光源控制器给出光脉冲的时机必须与相机曝光窗口严格同步。不同步的话,图像会一半亮一半暗,而这个“亮度不均”在算法里可能被误判成缺陷。框架里要把触发延时和光源延时的匹配做成配置项,切换产品时一起切换。
6.2 曝光与频闪导致的误判误检
有一次在现场排查一个隐藏缺陷漏检问题:小的划痕时有时无。后来发现不是算法灵敏度不够,而是相机曝光时间和频闪的配合有问题——曝光时间设太短,光源还没来得及稳定到最大亮度曝光就结束了,图像整体偏暗,暗弱的划痕就沉到噪声里去了。
解决思路是,把曝光时间、光源点亮时刻与稳定时间、触发延时三者做成联动配置。我的经验值:LED光源点亮后需要几微秒到几百微秒达到稳定亮度,具体时间取决于光源驱动电路。在光源触发菜单里,优先设置“先点亮光源,等稳定后再开曝光”的时序,用示波器或看图像亮度变化来确认稳定窗口。这个细节不做,算法再强也救不回烂图。
6.3 配方文件“污染”与权限管理
框架灵活了,配置项多了,随之而来的问题是“谁都能改配置”。以前程序参数被工程师藏得很深,现场不容易改;现在配方面向操作员开放,就容易出现误操作。
我的做法是给配方面板加“三级权限”:操作员只能看检测结果和启动/停止,技术员可以切换产品配方和微调个别参数,工程师才拥有修改流程结构和保存新配方的权限。另外,每次保存配方都自动记录变更日志,包括谁改的、改了哪些参数、改动前后的值。一旦检测质量出现波动,看日志可以快速定位是不是有人动了参数。
还有个容易忽略的坑:参数校验和。配方文件在编辑、拷贝、传输过程中可能出现损坏,如果检测到配方文件的校验和与标准不一致,必须拒绝加载并提示重新导入,防止带着“坏配方”跑检测。我吃过一次亏,一个配方文件从U盘拷贝到设备时损坏,系统加载后所有尺寸测量全部偏了0.5mm,排查了很久才定位到是文件问题。
6.4 切换耗时的优化
多产品切换是灵活框架的重要指标,但“切换”不能只关心里面配置加载快不快,还要看整个系统的就绪时间。我实测过一大类工业相机,冷启动时初始化SDK加打开设备往往要好几秒甚至十几秒,如果每次切换产品都重新初始化相机,操作员体验会非常差。
优化做法有两种。一是常驻运行:相机、光源、控制器在整个系统启动时初始化一次,之后切换产品只切换“流程配置”和“参数”,不重启硬件。二是预热机制:在系统空闲时提前实例化常用算法的模型,比如把OCR模型、深度学习分割模型全部加载进内存,切换时只做数据指针替换。经过这两步优化,我做的框架在实际项目里做到了切换产品到首张检测图出结果用时低于800毫秒。注意,这个数字不含产线上产品传送的时间,纯指视觉系统的响应时间。
6.5 过度拟合与样本覆盖不足
最后聊一个算法层面的常见陷阱。我见过一些团队用深度学习做缺陷检测,在调试阶段准确率能到99%,一进入量产就频繁误报或者漏检。最常见的原因是训练样本过度拟合了调试期的环境:所有照片都是在同一个日光灯环境、同一个相机增益参数下拍的,现场量产时的光照、曝光条件稍有变化,模型就失效。
框架的应对方式有两层。第一层是成像层做归一化:通过前面讲的光源控制、曝光参数管理,让现场采集的图像尽量和调试期采集的图像在亮度、色温上保持一致,把环境差异挡在图像采集之前。第二层是算法层加“域自适应”组件:模型训练时允许输入不同风格样本,或部署时用少量新样本做一个快速微调。这套组合拳下来,模型的稳定性会显著提升。
7. 一些写作之外的经验总结
这套灵活的视觉检测框架,我在不少模拟项目和现场验证过之后,最大的体会是:灵活框架的本质是“把变的东西变得易变,把不变的东西沉淀成标准”。再用一句话概括,就是“先硬后软、先光后算、配置驱动、版本管控”。
先硬后软的意思是,硬件选型和机械结构设计阶段就要为灵活性铺路,光源支架能不能旋转、相机接口是不是标准、控制器能不能通过程序控制,这些决定了软件层的上限。很多项目走到软件阶段发现“这也不可调那也不可换”,往回追溯都是硬件阶段埋下的坑。
版本管控这点特别想多说一句。很多小团队做视觉系统,代码会做版本管理,但检测配方、标定文件、流程配置这些“数据资产”往往散落在U盘和聊天记录里。我强烈建议把这些全部纳入版本管理,每次变更都留记录。因为你永远不知道哪天一个客户要求三个月前的检测标准,没有版本记录就只能凭记忆恢复,现场就会很被动。
最后分享一个实操小技巧:给框架增加“测试模式”。除了正常的工件检测模式,还有一个测试模式,可以上传历史图片回放检测,用于验证参数变更是否有效。这个模式在调试和售后排查中极其好用——回放现场拍下的坏样本,比在产线上反复试料要快得多,也不耽误正常生产。我私下算过,有了测试模式,现场问题排查时间平均能缩短一半。如果你正在做自己的视觉检测框架,强烈建议把这个功能放在优先级最高的列表里。