机器视觉这个词近几年被说得很多,但真正在现场把一条视觉线跑稳的人并不多。我接触过的项目里,从3C零件的外观检测、五金件的尺寸测量,到包装线上的字符识别和定位抓取,机器视觉的核心逻辑其实一直没变:用相机代替人眼,用算法代替人脑做判断,最后把判断结果交给执行机构。这一篇作为系列的开头,我不打算堆概念,而是把机器视觉到底在解决什么问题、一条完整视觉链路怎么搭、参数怎么算、坑在哪里,一次性讲清楚。不管你是刚接触这块的在校学生、想转方向的电气工程师,还是准备上第一条视觉产线的项目负责人,这篇都能给你一个能落地的整体框架。
1. 先搞清楚机器视觉到底在解决什么问题
1.1 从人眼看东西说起:一套完整的视觉系统长什么样
人眼判断一个零件合不合格,其实是四步:光打到零件上反射进眼睛,视网膜成像,大脑比对“合格品长什么样”,然后手去把不良品挑出来。机器视觉把这四步拆成了硬件和软件两半,硬件负责“看得见”,软件负责“看得懂”,执行机构负责“动手”。
具体拆开就是五个环节:光源与打光、镜头与相机(成像)、图像采集与传输、图像处理与决策算法、通信与执行。这五块任何一块掉链子,整套系统都跑不起来。我见过太多项目,算法组熬夜调模型,最后发现是打光角度差了两度,换个光源位置问题直接没了。
这里有个认知偏差要先纠正:很多人以为机器视觉的难点在算法,其实在工业现场,成像质量决定了算法天花板。一张对比度低、边缘模糊、反光过曝的图,再强的算法也只能靠猜。所以我在做方案评估时,永远是先看能不能拍出一张“人眼一看就清楚”的图,拍不出来,后面全是空谈。
注意:评估阶段一定要拿到实物样品实拍,不要用供应商给的“标准样品图”做决策。供应商的样图往往是挑了最好的打光条件拍的,跟你现场的实际工况差得远。
1.2 机器视觉、计算机视觉、图像处理,这三个词别再混着用
这三个词经常被混着说,但它们的目标、评价标准和工程约束完全不同,混用会导致方案选型跑偏。我做个对照表,这个表我在内部培训时反复用,效果挺好:
| 维度 | 图像处理 | 机器视觉 | 计算机视觉 |
|---|---|---|---|
| 核心目标 | 改善图像本身的质量 | 用图像做出工业判断或动作 | 让机器理解图像内容 |
| 典型任务 | 去噪、增强、滤波、压缩 | 尺寸测量、缺陷检测、定位引导、字符识别 | 目标检测、语义分割、行为理解 |
| 评价标准 | 主观视觉质量、信噪比 | 准确率、误检率、漏检率、节拍 | 精度、泛化能力、鲁棒性 |
| 处理方式 | 像素级变换 | 确定性算法为主,规则明确 | 学习型算法为主,统计推断 |
| 失败代价 | 图不好看 | 停线、误判、批量报废 | 结果不可靠但不一定立刻出事 |
| 工程约束 | 相对宽松 | 节拍、稳定性、可追溯性极严 | 算力、数据量约束为主 |
关键在于第三列和第四列的区别:机器视觉是工业属性,它要求每次结果都一样、可复现、可追溯,所以传统上偏好确定性算法——同样的输入必须给出同样的输出。计算机视觉是统计属性,它允许“大概率正确”。你把一个深度模型直接搬到产线上,今天判合格明天判不良,产线班长会来找你麻烦的。
这也是为什么工业界长期是“传统算法打底、深度学习补位”的格局,而不是一味上模型。理解这个差异,你就理解了后面所有选型取舍的底层逻辑。
1.3 什么场景该上机器视觉,什么场景不该上
不是所有检测都值得上视觉。我一般用三个问题筛:
- 第一,缺陷有没有稳定的视觉特征?如果缺陷是“内部裂纹”“材质硬度”“气味”,相机拍不到,那就该上超声、X光或者测力,别硬上视觉。
- 第二,人的判断一致性如何?如果两个老师傅看同一个件能吵起来,说明标准本身模糊,这时候上视觉等于把模糊标准固化,误检率会很高。先把判定标准量化,再谈自动化。
- 第三,节拍和精度要求硬件撑不撑得住?需要检测 5 微米的特征、同时节拍要求 20 毫秒一件,这个组合在当前常规配置下就很难兼顾,需要重新评估工艺。
反过来,机器视觉最擅长的是这几类:尺寸与位置测量(精度稳定、重复性好)、有无与装配完整性检查(逻辑简单、收益高)、表面缺陷检测(依赖打光设计)、字符与条码识别(成熟度高)、定位引导抓取(机器人配合)。这些场景有个共同点:判定逻辑能写成明确规则。
我个人的经验是,凡是能用“测量”和“有无”解决的,绝对不要用“分类模型”解决。能用卡尺量出来的东西,就不要让模型去猜。这不是技术保守,是成本与稳定性的权衡——测量类方案的调试周期通常以天计,模型类方案以周计,而且后续样本漂移还要持续维护。
2. 一条完整的视觉链路是怎么搭起来的
2.1 光源与打光:整个项目成败的七成在这里
业内常说“视觉项目七成靠打光”,这话不夸张。打光的本质不是“把东西照亮”,而是人为制造对比度——让该被检测的特征和目标在图像里差异最大化,同时把不需要的背景和干扰压下去。
常见打光方式我整理成下面这张表,选型时可以直接对着查:
| 打光方式 | 光路特点 | 最适合的场景 | 常见坑 |
|---|---|---|---|
| 背光(透射) | 光从背面穿过来,物体成剪影 | 外形轮廓、孔径、尺寸测量 | 不透明件才有轮廓,内部缺陷看不到 |
| 环形光 | 四周斜射,漫反射均匀 | 一般表面字符、装配有无 | 反光件容易中心过曝 |
| 同轴光 | 光路与镜头同轴,只收垂直反射 | 镜面、金属平面、细小划痕 | 平面度差一点点就整片发黑 |
| 低角度暗场 | 光几乎贴着表面掠射 | 划痕、凹坑、毛刺、纹理缺陷 | 对工件摆放角度极敏感 |
| 穹顶光(漫射罩) | 半球漫射,无方向性 | 曲面反光件、球面字符 | 整体对比度偏低,需配合高动态 |
| 条形光/线光 | 长条均匀光斑 | 大幅面扫描、线扫配合 | 两端光衰,中间亮两边暗 |
选打光的顺序我一般是:先判断特征类型(是轮廓、是划痕、是颜色差、是反光差),再定光路,最后调角度和亮度。顺序反了,就会陷入“换个光源试试”的盲目试错。
实操上有几个动作很关键:光源和镜头轴线夹角从 15° 开始逐步加大,每次 5°,边调边看图像对比度;亮度不要一上来拉满,先到 60% 左右再微调,拉满容易过曝把细节烧掉;如果工件有多个朝向,考虑用多光源分区频闪,而不是一锅端。
注意:调光时一定要把相机参数固定(曝光、增益锁死),只看光源和角度的影响。把相机和光源同时调,你永远不知道该归因给谁。
2.2 镜头与相机:分辨率、视野、精度三者怎么算
这一段是新手最容易翻车的地方,因为很多人是先买了相机再想选什么镜头,顺序完全错了。正确顺序是:先定视野和精度需求,再算所需分辨率,再选相机,最后由工作距离和靶面反推焦距。
核心公式就三个:
单像素精度 = 视野尺寸 ÷ 相机单方向像素数 所需像素数 = 视野尺寸 ÷ (最小特征尺寸 ÷ 特征所需像素数) 镜头焦距 ≈ 工作距离 × 相机靶面尺寸 ÷ 视野尺寸先看精度计算。假设视野 100mm × 100mm,相机像素 2448 × 2048(约500万),那么单方向单像素精度 = 100 ÷ 2448 ≈0.041mm/px。意思是图像里一个像素代表实际 0.041 毫米。
再反过来做选型。客户要求检测 0.15mm 的缺陷,经验上一个特征至少占 3 到 5 个像素才比较稳(低于 3 像素,边缘检测会非常敏感于噪声)。按 4 像素算,需要的单像素精度 = 0.15 ÷ 4 =0.0375mm/px,那么单方向所需像素 = 100 ÷ 0.0375 ≈2667px。所以 2448 不够,得往上选一档,2400万级别的或者缩小视野。
这里有个常见误区:很多人只算“够不够”,不算“余量”。我的做法是算出来之后至少留 30% 余量,因为实际现场的工件位置有偏差、镜头有畸变、边缘像素不总是理想值。刚好卡在临界值的方案,上线后一定是三天两头报警。
再看镜头焦距。相机靶面是 2/3 英寸(约 8.8mm × 6.6mm),视野 100mm,工作距离 300mm,那焦距 ≈ 300 × 8.8 ÷ 100 =26.4mm,就近选 25mm 的定焦镜头。如果你算出来是 8mm 以下或者 75mm 以上,就要回头审视工作距离是不是设得不合理,或者该换靶面尺寸。
靶面和视场角的关系也值得说一句:在同样视野下,靶面越大的相机配的焦距越长;靶面小的配短焦。短焦镜头的畸变通常更大,长焦的相对平坦。所以对测量类项目,我倾向“大靶面 + 中长焦 + 远一点的工作距离”,图像畸变更可控。
镜头参数上还有几个必须核对的:分辨率要匹配相机像素尺寸,比如相机像素 2.4μm,镜头至少要能分辨这个量级,否则等于白买高像素;畸变率对测量类要控制在 0.1% 以内;景深要覆盖工件的高度波动,景深不够就会出现“中间清楚两边虚”。远心镜头能解决畸变和景深问题,但视野小、价格高、工作距离固定,一般用在精密测量上。
2.3 采集、处理、通信、执行:后端链路的取舍
成像之后是数据流。接口这块,主流是三档:千兆网口、USB3.0、Camera Link/CoaXPress。选型的核心是带宽和线缆长度。
算一下带宽:500 万像素、8bit 灰度图,单帧数据量 = 2448 × 2048 × 1B ≈5MB。如果节拍要求 100ms 一帧(10fps),数据率就是 50MB/s。千兆网的实测有效吞吐一般在 100MB/s 上下,勉强够;但如果要 30fps,就是 150MB/s,千兆网就顶不住了,得上多网口或者换接口。
我一般建议:低帧率、中远距离、要多相机同步的,用千兆网;高帧率、线缆短的,用 USB3.0;超高速、强抗干扰的,用 Camera Link 或 CoaXPress。千兆网还有一个好处是线缆可以拉 100 米,USB3.0 超过 5 米就要加延长器,还容易掉线。
处理端的选择取决于算法复杂度:传统算法跑在普通工控 CPU 上就够了,500万图做几次滤波加阈值,单帧 10 到 30 毫秒;深度学习推理要么上独立显卡,要么用带推理加速的嵌入式计算盒。这里要算的是总节拍预算——曝光时间 + 传输时间 + 处理时间 + 通信往返 + 执行机构动作时间,全部加起来必须小于产线节拍。我见过一个项目算法处理 80ms,相机曝光 5ms,但通信用了 60ms 的串口轮询,最后总节拍超了。
通信层最常用的就三种:数字 IO(触发和结果输出,最可靠,延迟微秒级)、TCP/IP 或 Modbus TCP(传数据和参数,方便但延迟不确定)、串口(老设备兼容,慢)。我的原则是:触发和急停用硬件 IO,参数和统计用网络,两者别混。曾经有项目用网络触发相机,网络一抖动就漏拍,改成硬触发立刻好了。
执行端就是 PLC、机械手、气动剔除装置这些。这里的关键是握手时序:视觉给出 OK/NG 信号,PLC 必须回一个“已收到”的应答,否则视觉会重复发或者不敢发下一帧。这个握手逻辑没写清楚,现场就会出现“最后一个件没被剔掉”这种诡异问题。
3. 核心参数与算法环节的实操要点
3.1 精度预算表:从毫米级需求倒推硬件
做方案时我习惯画一张精度预算表,把误差一层层拆开。因为客户说“精度 0.05mm”,这个词本身是模糊的——是重复精度、是绝对精度、还是单次测量的分辨率?不拆开,后面一定吵架。
一张完整的预算表大致是这样(假设需求:测量 10mm 长度的尺寸,重复精度要求 ±0.02mm):
| 误差来源 | 典型量级 | 控制手段 |
|---|---|---|
| 单像素分辨率 | 0.01~0.04mm | 提高像素数或缩小视野 |
| 边缘检测算法误差 | 0.1~0.5 像素 | 亚像素拟合,用灰度重心而非二值边缘 |
| 镜头畸变 | 0.05%~1% | 标定补偿,或改远心镜头 |
| 工件定位偏移 | 0.01~0.1mm | 先做基准定位再测量,别用绝对坐标 |
| 温度漂移 | 每 10℃ 约 0.01% | 热机 30 分钟后标定,或加温度补偿 |
| 光源衰减 | 每月 1%~3% 光强 | 定期校白、锁定曝光、监测图像均值 |
| 机械振动 | 不确定 | 加固支架、缩短曝光、触发同步 |
把这些按均方根合成,如果总误差超过需求的 1/3,方案就偏紧了。为什么是 1/3?因为现场还有大量不可预见的因素,给两倍余量是行业里比较稳妥的做法。
实际操作中,我的经验是:测量类项目的预算表要写进方案文档,让客户签字确认“精度是在什么条件下达成的”。否则验收时对方拿卡尺一量差了 0.05mm,就开始扯皮。
3.2 图像预处理与特征提取的关键动作
算法链路这块,传统流程基本是固定的:灰度化 → 滤波去噪 → 增强 → 分割 → 形态学处理 → 特征提取 → 判定。听着简单,但每一步的参数都有讲究。
灰度化:如果是检测颜色差异,就别灰度化,直接在色彩空间里做,比如比较色相或者用通道差值。我做过一个检测标签颜色深浅的项目,转成灰度之后红和绿亮度几乎一样,完全分不出来,换成色彩空间里的饱和度通道一下就清晰了。
滤波:高斯滤波适合平滑随机噪声,但会糊边缘;中值滤波对椒盐噪声有效,且保边;双边滤波保边好但慢。测量类项目我倾向“轻度高斯 + 亚像素边缘拟合”,因为过度滤波会让边缘位置偏移,直接影响尺寸结果。
分割:固定阈值只在光照极稳定的环境下可用。稍微讲究一点就用自适应阈值或者大津法自动求阈值。但真正稳的做法是先做背景归一化——把当前图和一张“空背景参考图”做差分,光照波动就被抵消了。这招在流水线上非常管用。
特征提取:测量用亚像素边缘、拟合直线/圆;缺陷用连通域分析(面积、长宽比、圆度、灰度均值);定位用模板匹配或者几何特征匹配。这里有个细节很多人忽略:连通域筛选用“面积 + 形状 + 灰度”三个维度组合,只看面积会把大片浅淡污渍和小的深色黑点混为一谈。
下面是一个缺陷检测的伪代码流程,我脱敏后贴出来,逻辑是通用的:
# 输入:当前图像 cur,背景参考 bg,标定得到的像素当量 mm_per_px gray_cur = to_gray(cur) gray_bg = to_gray(bg) # 光照归一化:差分消掉整体亮度漂移 diff = abs(gray_cur - gray_bg) diff = gaussian_blur(diff, kernel=3) # 自适应阈值,阈值系数按历史图像统计给出 thr = adapt_threshold(diff, k=2.5) mask = diff > thr # 形态学:先开运算去孤立噪点,再闭运算填小孔 mask = morph_open(mask, r=1) mask = morph_close(mask, r=1) regions = connected_components(mask) for r in regions: if r.area_px < 30: continue # 面积下限,滤掉噪点 if r.aspect_ratio > 8: continue # 细长异物,单独归类 if r.mean_intensity < 25: continue # 太浅,判为反光伪影 report_defect(r, area_mm2 = r.area_px * mm_per_px ** 2)这段代码里最值钱的不是逻辑,是那三个阈值。阈值不能拍脑袋定,得用一批真实样本跑统计:拿 200 张良品图跑一遍,统计所有被检出的连通域面积分布,取 99.7% 分位作为下限;再拿 100 张不良品跑一遍,看真正缺陷的面积下限在哪。两条线中间的区域才是安全区。这个动作叫“阈值标定”,比调参玄学靠谱得多。
3.3 传统算法与深度学习怎么分工
这是近几年被问得最多的问题。我的回答一般是:看缺陷的“可描述程度”和“样本可得性”。
能写成规则的,用传统算法:尺寸、角度、位置、有无、孔数、字符(配合成熟的识别引擎)。这些任务规则明确,传统算法快、可解释、不需要训练数据、出问题能查。一个测量项目的调试周期通常 3 到 7 天。
写不成规则的,才考虑深度学习:不规则的划痕、织物纹理缺陷、铸造件表面、复杂背景下的目标识别。这类缺陷人眼也说不出明确规则,只凭“看着不对”。这时候模型能学到的恰好是你描述不出来的那部分。
但上模型有三个硬门槛,缺一不可:
- 样本量:分类任务每个类别至少几百张有效样本,分割任务要求更高。样本不够,模型学到的是噪声。
- 标注一致性:同一批图两个人标出来的结果必须高度一致。我见过标注标准不统一,模型训练出来在产线上误检一半的案例。
- 可维护性:模型上线后必须持续收集新样本做迭代,否则几个月后随着来料变化,准确率会缓慢下滑。这是很多项目“验收通过、半年后报废”的根本原因。
实际工程里我更倾向混合方案:传统算法负责定位和粗筛,把可疑区域裁出来交给模型做精细分类。这样模型只需要处理一小块区域,推理快、样本需求也少。实测下来,这种结构在多数场景里是性价比最高的。
提示:模型上线后一定要留“影子模式”运行一段时间——模型照常推理,但不参与判定,只记录结果,跟人工复判结果对比。等误检漏检稳定了,再切到正式判定。这一步能避免大量现场事故。
4. 从零跑通一个检测Demo的完整过程
4.1 环境与最小可运行链路
我建议所有新手都从一个最小闭环开始,不要一上来就搭完整系统。最小闭环的定义是:相机能出图、图上能看到你要检测的特征、算法能给出一个结果、结果能显示在界面上。四件事齐了,剩下的都是在这个骨架上加东西。
硬件清单可以很简单:一台工业相机加配套镜头、一个可调光源(哪怕是手动调的)、一个稳固的支架、一台工控机或普通电脑。支架这块别省,我用过便宜支架,一碰就晃,图像一直在抖,调参调到怀疑人生。
软件层的结构我一般是这样分层的:
采集层 -> 相机SDK封装,统一成 grab() 返回图像 处理层 -> 算法模块,输入图像输出结构化结果 决策层 -> 阈值判定、结果合并、OK/NG输出 通信层 -> 与PLC或上位机的协议交互 界面层 -> 实时图、结果、参数、日志分层的意义在于可替换。相机换型号只改采集层,算法升级只改处理层,界面随便换。我见过把采集、处理、界面全写在一个大文件里的代码,客户换个相机型号要改三天。
4.2 标定与坐标转换(像素到毫米)
这是机器视觉里最容易被跳过、又最容易出问题的一步。相机拍出来的坐标是像素,产线要的是毫米,中间必须做标定。
最常用的是棋盘格标定:拿一块已知格距的标定板,在视野里拍多张不同位姿的图,算法算出内参(焦距、主点、畸变系数)和外参。日常快速标定也可以只做单应性标定——把一个已知尺寸的标准件放在视野里,量出对应像素数,得到 mm/px 比例,够用且快。
但单应性只解决了“比例”,没解决“畸变”。视野边缘的畸变在 0.5% 量级时,对 100mm 的视野就是 0.5mm 的误差,测量项目直接废掉。所以我的原则是:测量类项目必须做畸变校正,检测类项目可以只做比例标定。
坐标转换的核心就一行:
实际坐标(mm) = (像素坐标 - 原点像素) × mm_per_px + 原点实际坐标同时要处理旋转。如果工件在视野里是斜的,你的测量结果会随摆放角度变化。解决办法是先用定位模板找到工件的基准边或基准孔,建立工件坐标系,然后所有测量都在这个坐标系里做。这一步叫“基准对齐”,是让测量结果不随工件摆放变化的唯一正解。
标定还有个实操细节:标定要在热机之后做。相机和镜头通电后有温升,焦点会有微小漂移。我习惯让设备跑 30 分钟再标定,之后每班次校一次零点。这个习惯帮我躲过好几次“早上好晚上坏”的诡异故障。
4.3 节拍与稳定性验证
Demo 跑通不等于能上线。上线前必须做两件事:节拍验证和稳定性验证。
节拍验证要拆到毫秒级。我在实际项目里踩过的坑是,算法处理 25ms 很快,但图像从相机传到内存花了 45ms,界面刷新又占了 15ms,总时间翻了三倍。所以计时不能只测算法段,要从触发信号发出开始计时,到结果信号输出为止。用示波器看两个 IO 的边沿差是最准的。
稳定性验证更关键,方法是连续跑 8 小时,记录每一帧的处理结果、耗时、图像均值。跑完看三张曲线:耗时是否随时间上升(内存泄漏或缓存堆积)、图像均值是否漂移(光源衰减或温漂)、误检率是否随时间变化(漂移导致)。这个测试不通过,方案再好也别上线。
我自己的经验值是:连续 8 小时误检率波动不超过 0.3%,单帧耗时波动不超过 15%,图像灰度均值漂移不超过 5%,这三条达标了,现场基本能稳住。
5. 常见问题与排查实录
5.1 现场最常踩的坑速查表
下面这张表是我这些年积累的,基本都是文档里不写、但现场天天遇到的:
| 现象 | 最可能的原因 | 排查动作 |
|---|---|---|
| 图像整体模糊 | 对焦没对、景深不够、支架振动 | 先看静态件是否清晰,再看动态件是否拖影 |
| 亮度忽明忽暗 | 环境光干扰、光源未与曝光同步、光源老化 | 遮住环境光对比,检查频闪触发线,测光源电流 |
| 边缘位置漂移 | 灰度不均、阈值固定、镜头脏污 | 换自适应阈值,测图像均值是否变化,擦镜头 |
| 同一工件结果不一致 | 工件摆放角度变化、基准未对齐 | 加基准定位,检查夹具定位精度 |
| 相机频繁掉线 | 网线质量、巨帧未开、带宽超限 | 换屏蔽网线,检查网卡巨帧设置,降帧率测试 |
| 通信偶尔丢包 | 用网络做触发、协议无应答机制 | 改硬件IO触发,协议加序号和重发 |
| 前期正常后期误检升高 | 光源衰减、来料批次变化、模型漂移 | 建立校白机制,统计良品图分布,定期更新样本 |
| 测量结果整体偏移 | 标定时间点不对、热漂移 | 热机后重新标定,加温度补偿或定期校零 |
这张表里我特别想强调“边缘位置漂移”和“前期正常后期误检升高”这两条。前者往往不是算法问题,是镜头脏了——产线环境粉尘多,镜头一周不擦就有薄薄一层,图像对比度悄悄下降,阈值就不适用了。后者是维护问题,很多人以为项目验收完就结束了,其实视觉系统是个需要持续照料的活体。
5.2 一些不太写在文档里的经验
第一条,先解决“看得见”,再解决“看得懂”。我带的项目里,前三天基本都在打光和拍照,一行算法代码都不写。等能拍出一张特征清晰、背景干净、对比度足够的图,算法往往两天就调完了。反过来,跳过这三天直接写算法,往往要折腾三周。
第二条,把参数暴露出来,别写死。曝光、阈值、面积上下限、ROI 区域,全部做成界面上可调的参数,并且存配置文件。产线换料、换批次的时候,操作工能自己微调,不用每次都叫你过去。这一条能省掉你 80% 的售后电话。
第三条,日志比界面重要。每次判定都要存:时间戳、图像路径(或缩略图)、关键测量值、判定结果、耗时。出问题时能回溯。很多现场的争议是“到底这一件是良还是不良”,有日志就能当场对账,没日志就只能扯。
第四条,别相信“这个光源是标准的”。每个项目的工件表面状态都不一样,喷砂件、拉丝件、镜面件、镀膜件,对光的响应差得远。我现在的习惯是项目启动就备三四种光源现场试,试完再定,而不是让供应商推荐一个“通用款”。
第五条,客户说的精度,一定要追问。“精度 0.02mm”这句话,我会追问四个问题:是重复精度还是绝对精度?是在什么温度下?是测同一个件的同一位置还是不同件?是单次测量还是多次平均?这四个问题的答案不同,方案成本能差三倍。
第六条,给系统留个“手动复判”的出口。任何视觉系统都不可能 100% 准,一定要有一个机制让人工介入——把 NG 件挑出来放到复判工位,人看一眼决定放行还是报废。这不叫方案不完善,这叫工程务实。
6. 这个系列后续准备怎么展开
这一篇讲的是骨架,后面我打算按“成像—算法—工程”三条线往下拆。成像这条线会说镜头选型的细节、远心与非远心的取舍、频闪同步的接线;算法这条线重点讲亚像素测量、模板匹配的鲁棒性设计、以及轻量模型在产线上的落地方式;工程这条线讲标定流程、通信协议设计、还有上线验收的检查清单。
我个人的建议是,如果你刚开始接触这个方向,别急着学各种算法库的函数,先花两周时间把“怎么拍出一张好图”这件事搞明白。买一个可调光源、一块标定板、几个不同表面状态的工件,自己拍、自己调角度、自己看对比度变化。这两周的手感,比看十篇算法论文有用得多。我在带新人的时候,这一步从来没省过。
至于那些动不动就说“上深度学习解决一切”的声音,我的看法是:模型是很强的工具,但它是放大器——你前面的成像做好了,它放大的是效果;成像一团糟,它放大的只是不确定性。这个系列后面的每一篇,我都会尽量把“为什么这么做”讲透,而不是只给一堆参数让你抄。