
1. 项目背景与整体思路先说一下我最近手头在做的几个项目。一个是机器视觉的自动车辆检测系统用于停车场出入口和园区安防场景的车型识别与车流量统计一个是饮料瓶回收机的全自动化改造核心是用视觉识别瓶子材质、颜色和瓶身完整性配合机械结构完成分类回收还有一个是3D视觉引导超长泵管上料这是给混凝土泵车配套的管件焊接线上做的用3D相机引导机器人抓取最长6米的泵管放到切割工位。三个项目放在一起看恰好覆盖了机器视觉在识别、分类、定位引导三条最典型的落地路径。先解释一下为什么这三个项目值得放在一起聊。很多刚入行的人会问机器视觉到底能做什么其实从应用层面就三类事第一类是把图像里的目标认出来比如车辆检测里的车牌识别、车型分类第二类是把目标分拣好比如饮料瓶回收里的材质判别、缺陷剔除第三类是把目标定位准比如泵管上料里要用3D点云算出管件在空间里的位姿再引导机器人抓取。这三类需求的算法思路、硬件选型、现场调试方法都不一样但底层又共享同一套视觉工程方法论。我做视觉这几年最大的体会是机器视觉项目的难点从来不在算法本身而在于现场。光照变化、反光、遮挡、机械抖动、相机安装偏移这些才是真正让人加班到头秃的东西。所以这篇文章我不打算给你堆一堆算法公式而是用这三个项目当线索把我在方案选型、相机标定、算法调优、现场排障这些环节里踩过的坑和验证过的做法梳理一遍。不管你是刚接触机器视觉的学生还是已经在做视觉集成的工程师应该都能找到用得上的东西。2. 自动车辆检测系统从方案选型到现场落地2.1 需求拆解与相机选型逻辑车辆检测系统最怕的就是需求没聊清楚就动手。我拿到这个项目时甲方说的是要能统计进出车辆识别车牌最好能区分轿车和SUV。听起来简单但现场看过之后发现几个关键约束入口车道是双向两车道弯道入闸车辆进闸前时速最高能到40km/h白天有树影遮挡傍晚逆光严重晚上靠路灯和补光灯照明还要考虑雨天玻璃反光。这些约束直接决定了相机选型。40km/h的车速意味着车辆从进入视野到停在闸杆前大约只有1.2到1.5秒的可用时间如果用全局快门相机配合帧率25fps以上至少能抓到15到20帧有效画面足够做多帧融合去抖。车道是弯曲的单台相机覆盖角度不够所以我在车道两侧各装了一台相机一台负责车牌识别和车型侧面分类一台负责正面补拍和车流计数。这个双机协同的思路在后面调试时帮我省了大量重标定的工作。选型时还要考虑的一个问题是焦距和安装高度的配合。车道宽约3.5米相机安装高度定在2.8米角度下倾约15度。这个角度下6mm焦距的镜头能覆盖到整个车道宽度同时保证车牌在画面里的像素宽度不低于110像素这个数字是车牌识别算法能稳定出字的下限。如果安装高度太低或者角度太陡车顶反光会直接压掉车牌区域的高光细节这些都是选型阶段就要算清楚的。相机确定之后补光方案也会反过来影响成像效果。之前我在另一个项目里用过可见光白光补光白天效果不错但晚上会严重干扰对向车道驾驶员视线而且雨天地面反光会把整个画面糊成一片。这次改用了850nm红外补光灯配合相机自带的红外截止滤镜切换白天正常采彩色图晚上自动切到红外模式。红外波段对车漆和车牌的反射特性不一样夜间图像里车牌区域对比度反而更高识别率能稳定在98%以上。2.2 车辆检测算法与夜间工况处理相机和补光定下来之后算法层面的核心就不是用什么网络做检测这么简单了。我最终用的是两阶段结构先用一个轻量的YOLOv5s模型做全图车辆目标检测锁定车辆外接框然后在外接框内裁剪出车牌区域送进车牌识别模型做字符序列输出。之所以不直接端到端做车号识别是因为现场还需要同时输出车型分类信号两阶段方案可以把车在哪和车牌是什么两个任务解耦后续任何一侧模型迭代都不影响另一侧。夜间工况是车辆检测里最容易翻车的地方。我实测下来红外模式下YOLOv5s的mAP会从白天的0.92掉到0.86左右主要漏检集中在深色车辆和车灯过曝区域。针对深色车漏检我在训练数据里做了针对性增强把正常白天图随机压暗模拟夜间红外图的灰度分布针对车灯过曝加入高光区域随机遮挡的样本。增强之后夜间漏检率从5%降到了2%以内。这里要提醒一件事不要迷信开源模型直接部署。公开的YOLO权重是在COCO之类通用数据集上训练的车辆类目涵盖但不完全匹配国内车型。我建议至少要准备3000张以上的本地场景图做fine-tune其中要有白天、傍晚、夜间、雨天四类工况的分布。训练时batch size从32起步学习率用1e-3跑前30个epoch再用1e-4精调20个epoch实测在RTX 3060上整个训练流程四小时左右跑完。2.3 相机标定与车辆检测的现场细节车辆检测系统的标定有两个层面要分开做。第一个层面是内参标定用棋盘格标定板把相机的焦距、畸变系数算出来这个相对标准不提也罢。第二个层面是外参标定也就是把图像坐标和世界坐标对齐。由于我这个方案不需要做精确到厘米级的定位只需要识别结果能正确映射到哪条车道、哪个方向所以用了更轻量的办法在画面里画虚拟检测线车辆外接框中心点穿过检测线即触发一次计数。这个虚拟线圈方案比纯目标跟踪方案简单得多但有个大坑——车辆在弯道入闸时轨迹是斜的如果检测线画得太靠画面边缘会出现一辆车触发两次计数的情况。我最后是把检测线放在两条车道分隔线的延长区域内并且加了连续帧的IoU匹配逻辑只有上一帧和当前帧的车辆框重叠度大于0.3时才认为是同一目标。匹配是要维护一个简单状态机的否则追尾场景两辆车并排进闸时会乱掉。现场还有一个很多人忽略的细节相机安装支架的刚性。车辆入闸瞬间会有明显震动如果支架是普通万向节每天位置都会飘几个像素外参校准就白做了。我给两个相机都换了重型L型支架锁紧后加螺纹胶调试完的第二天、第七天分别复测一次外参确认位置漂移小于1个像素。这套稳定性检查流程后来被甲方写进了他们的运维手册。3. 饮料瓶回收系统全自动化链路中的视觉环节3.1 识别分类的核心逻辑与硬件布局饮料瓶回收机和车辆检测系统看起来八竿子打不着其实视觉部分的目标是类似的——把进入视野的物体认出来再根据类别执行后续动作。回收机的场景是用户把一个空瓶投入投瓶口瓶子沿滑道滚落到检测平台视觉系统需要在瓶子静止的1秒内判断材质PET、HDPE、玻璃、颜色透明、浅蓝、浅绿、白色等、以及是否有严重变形或残留液体然后把结果传给PLC控制机械臂把瓶子拨到对应回收仓。这里视觉算法的核心不是目标检测而是像素级分类。因为瓶子进入检测平台之后位置是基本固定的不需要从整张图里找目标只需要把瓶子区域从背景里分割出来。我用的是传统视觉和深度学习结合的办法先用背景差分把瓶子区域粗分割出来再用一个轻量的MobileNetV3模型对分割后的ROI做材质和颜色分类。传统分割负责定位深度学习负责判别两者各干各擅长的活比端到端方案稳定得多。硬件布局上有一个必须注意的点检测平台要加匀光板。瓶子是圆柱体且表面有弧形反光如果直接用上方单灯照明瓶身会出现两条高光带正好把标签区域盖住。我最后是在检测平台上方安装了环形无影光源并且把光源亮度调到能看清标签但不超过相机动态范围的80%。这个亮度值不是拍脑袋定的是连续用灰度直方图监测画面中最亮区域的像素值保证不饱和才锁定的。3.2 瓶身检测的常见坑点与识别策略饮料瓶回收里最容易翻车的是标签干扰。很多饮料瓶的标签颜色比瓶身深材质分类模型很容易被标签牵着走。我的解决思路是把ROI切成三块瓶身上段、中段、下段分别做分类然后三块投票决定最终材质。比如一个瓶子标签是深蓝色但中段和下段都是透明PET特征投票结果仍然是PET。这个策略在实际运行中把材质分类准确率从91%拉到了96%以上。另一个坑是液体的存在。用户可能没喝完就扔进来了瓶内有残留液体会让瓶身透明度发生明显变化影响颜色分类。我的处理是在视觉检测之外在滑道末端加了一个微型电容传感器感知瓶子重量范围重量异常的直接送到待人工处理仓不参与自动分类。这个跨传感器融合的思路比单纯指望视觉算法去分辨液体要可靠得多。视觉负责看得见的特征传感器负责看不见的物理属性两者互补才叫全自动化。回收机还有一个经常被忽略的问题脏污。回收瓶不像生产线上的工件那么干净瓶身可能沾着泥、油、饮料渍。刚开始模型对这些脏污很敏感经常误判成深色瓶。后来我在训练数据里人工标注了一批脏污样本并且只让模型关注瓶身中下部20%区域的颜色直方图而不是全瓶平均颜色。这么改之后脏污影响基本控制在可接受范围。3.3 与机械结构的联动逻辑和时序控制视觉系统只是回收机全自动化链路里的一个节点真正的全自动要靠视觉和机械结构的时序配合。我这边视觉检测输出结果之后要跟PLC经过一个TCP通讯协议交互视觉给PLC发的是结构化的JSON字符串包含检测结果、置信度、时间戳。PLC每个周期轮询一次拿到结果后控制机械臂执行对应分类动作。这里最容易出问题的是时序不匹配。视觉检测需要约800毫秒机械臂动作需要约600毫秒而下一个瓶子可能在第1.2秒就滚到检测平台了。如果PLC在视觉还没出结果时就开始下一步动作瓶子就会堆在机械臂路径上。我最后的方案是在检测平台末端加了一个光电挡板只有当视觉结果返回并且机械臂复位后挡板才打开放行下一个瓶子。这个简单的握手协议避免了98%的卡瓶问题。时序之外数据记录也是这类设备绕不开的需求。我建议视觉系统侧要在本地保存每次检测的原始图像和结果日志至少保留30天。一方面方便做故障回溯另一方面可以做数据积累——比如统计到某段时间误判率升高就能导出图片排查是不是光源衰减了。我在现场就碰到过一次类似问题连续两周无人值守运行后回收仓的误分率从2%爬升到7%后来查日志发现是环形光源老化导致亮度下降了约15%重新校准亮度后误分率立刻回到正常。4. 3D视觉引导超长泵管上料坐标系与点云的硬仗4.1 泵管特征分析与3D视觉方案选择第三个项目是三个里面硬件配置最高、调试工作量最大的。泵管是混凝土泵车输送混凝土用的金属管件长度从1米到6米不等直径约120到200毫米两端有连接法兰。上料动作是把堆放在料架里的泵管取出来放到切割工位切割前需要保证法兰端面的朝向正确。难点在于泵管是细长圆柱体在料架里相互堆叠、交错而且表面有锈蚀和焊接飞溅某些区域反光严重。3D视觉方案选择时我对比过快门结构光、线激光扫描和散斑结构光三种。线激光扫描精度最高但扫描一条6米管件需要十几秒上料节拍只有45秒扫描时间超标。散斑结构光速度快但对金属表面的强反光适应性差。最后选了快门结构光方案投射多幅编码条纹图像通过相机采集相位信息重建三维点云。单次扫描约1秒配合机械臂的多角度二次扫描能拿到比较完整的管件表面点云。点云处理是整个项目里最磨人的环节。管件落在料架上不是悬空的点云里包含管件表面、料架横梁、背景墙面等多个物体。我的处理管线是先做体素下采样把点云网格化成2mm分辨率再用地平面分割去掉背景然后用欧式聚类把管件从点云里分割出来。六大根管子堆在一起时聚类结果会连成一整块这时候用区域生长算法按圆柱体模型拟合逐个区分单根管件。4.2 机器人坐标系与相机坐标系的标定流程3D引导上料和前面两个项目最大的差异在于视觉必须给出机器人可执行的目标位姿所以坐标系标定的精度直接决定项目成败。这里的坐标系涉及四层3D相机坐标系、机械臂基坐标系、机械臂工具坐标系、工件坐标系。要想让机械臂准确抓到管件必须有把相机坐标系下的点云坐标转换到机械臂基坐标系的齐次变换矩阵。这个标定我用了标准的眼在手外方案。具体做法是在机械臂法兰盘上固定一个校准球让机械臂带着球走12到15个不同的姿态每个姿态下3D相机都能捕捉到球心位置。因为机械臂在每个姿态下的工具坐标值是已知的相机也测到了球心在相机坐标系下的值这两组对应点就可以通过求解手眼标定方程AXXB得到变换矩阵。我用的是Halcon里的手眼标定算子操作起来比OpenCV那套自己写矩阵分解要省心很多。标定操作里有三个细节直接影响精度。第一个是机械臂移动轨迹不能在同一平面上必须在三维空间里散布开否则标定方程会退化。第二个是每次移动后机械臂要保持静止至少1秒再触发相机采集避免运动残影导致球心提取不准。第三个是标定球的尺寸要适配相机分辨率我用的是直径50mm的精密陶瓷球在2mm分辨率的点云里球心提取误差能控制在1mm以内。4.3 超长泵管的抓取策略与位姿计算坐标系统一之后真正难的是超长工件的位姿计算和抓取策略。6米长的泵管和普通工件不一样机械臂抓取点如果选在管件中点两端会大幅度摆动而且管件从料架里提取时可能会碰到旁边的管子。所以抓取策略上我做了两个关键决策。第一个决策是抓取点选在离重心偏移约150mm的位置并且机械臂末端的夹具设计成V型自定心结构能同时约束管件的径向位置和轴向自由度。V型角选120度太浅了管件容易滑脱太深了不同直径的管件适配性差。第二个决策是提取路径必须分段执行先在安全高度把管件竖直提起150mm确认与相邻管件脱离后再水平退出料架最后才移动到切割工位。这个分段路径完全靠视觉输出的位姿来规划不能走固定的示教路径否则管件姿态稍有偏差就会撞料架。位姿计算上我用了圆柱拟合的方法对分割出的单根管件点云做主成分分析得到主轴方向向量再通过RANSAC拟合圆柱面得到轴线上的点和半径。轴线方向就是管件姿态轴线上的点结合夹具偏移量算出抓取位置。因为管件表面有锈蚀和飞溅RANSAC的迭代次数要放得比较大我的经验是设置至少500次迭代内点阈值在2mm左右。这样拟合出来的轴线即使在表面质量差的情况下也能保持较好的稳定性。5. 常见问题与排查技巧实录5.1 车辆检测系统的漏检与误检排查车辆检测在运行中最常见的故障现象就两类漏检和误检。漏检多发生在夜间和逆光时段排查时我会先看原始抓拍图确认是成像问题还是算法问题。成像问题通常是补光灯角度偏了或者红外模块切换失败这种直接调硬件就行。算法问题就要看检测框的置信度统计把低置信度样本收集起来做增量训练比盲目调阈值有效得多。误检的高发场景是大型工程车和拖车。这些车体积大侧面形状复杂容易被检测模型拆成多个框导致一辆车计成两辆。我的处理是加了基于检测框面积和长宽比的融合逻辑如果两个框的中心距离小于车宽的一半且IoU大于0.2就合并为一个框。这个规则简单粗暴但非常有效误计率降了70%。这类规则性的后处理逻辑在很多视觉项目里都是必要的不要觉得用了深度学习就万事大吉。还有一个容易忽略的是时间同步问题。车辆检测系统一般要跟道闸联动视觉检测结果到PLC之间如果经过交换机网络抖动会造成毫秒级的时间偏移导致车辆已经到闸杆前但闸杆还没抬起来。排查这类问题要用Wireshark抓包看交互时间戳我遇到过交换机上另一个摄像头占满了带宽导致的延迟给视觉系统单独划分VLAN后就解决了。5.2 饮料瓶回收的分类干扰排查回收机的视觉故障最典型的表现是同一种饮料瓶连续误分到不同仓位。这种问题我会先怀疑光源稳定性。环形无影光源用久了个别LED灯珠会衰减发黄导致同一瓶子的颜色在不同时间段看起来不一样。排查方法是每月用标准色卡拍一张校正图对比灰度直方图偏差偏差超过5%就考虑更换光源模块。第二个高频问题是标签颜色和瓶身颜色接近时的误判。比如透明瓶贴上红色标签中段和下段的投票逻辑会被标签带偏。我的改进是把投票改成加权投票中段权重最高因为中段标签面积占比最小。这个改动看似微小但把分类准确率又提升了两个百分点。遇到实在区分不了的情况就落到混合回收仓总比把PET扔进HDPE仓里污染整批料要好。回收机还有一个环境相关的坑——夏天的冷凝水。冷饮瓶从冰柜拿出来直接投进回收机瓶身在检测平台会结一层薄雾导致视觉画面模糊。我的对策是在检测平台下方加了一个小的加热板保持瓶身温度在露点以上冷凝水问题就基本消失了。视觉系统的稳定性往往取决于这些非视觉细节。5.3 3D泵管上料的点云异常排查泵管上料项目里最容易出的问题不是算法不收敛而是点云质量不稳定。金属管件表面反光时快门结构光会重建出一些空洞或者飞点——表面上出现一些明显偏离真实位置的噪点。排查时先用滤波把点云离群点去掉再做一次配准检查如果高群点比例超过3%就应该检查相机有没有被污损或者现场环境光是不是变化了。我遇到过几次特别隐蔽的问题。有一次连续几天午后点云质量变差排查了很久才发现是车间顶棚天窗透进来的阳光在特定角度直射到了扫描区域干扰了结构光条纹识别。最后在相机和扫描区域之间加了遮光帘才解决。所以做3D视觉项目现场环境光的分布图一定要画别只盯着暗室里的测试效果。泵管抓取还有一个常见故障是位姿计算跳变。同一根管件在两次扫描中算出的轴线角度有时候会差好几度这通常是因为点云里混入了料架横梁的干涉点。解决办法是在圆柱拟合前加一个ROI裁剪只保留管件轴线方向延伸范围内、直径是管径1.5倍以内的点云。这个ROI大小其实很讲究裁大了滤不掉横梁裁小了管件两端会丢点我是用现场十几组数据反复试出来的经验值。项目推进到这里三个系统都在现场跑了几个月车辆检测准确率稳定在98.5%回收机分类准确率96%上下泵管上料成功率99.3%左右。我常说机器视觉项目的交付不是算法跑到99%而是在现场各种意外条件下还能稳定跑到99%。每个看起来聪明的算法背后都是一堆标定板上的胶带、遮光帘的尺寸、以及深夜里对着点云图发呆的记录。6. 关于入行和学习路线的一点建议结合这三个项目的经验我想给想入行做机器视觉的朋友一条实际可行的学习路径。很多人问我要不要先啃数学、先学深度学习框架我的建议是先动手做一个完整的小项目比如用笔记本摄像头加OpenCV做一个二维码识别或者颜色分类检测把相机采集、图像处理、结果输出整个链路跑通然后再去补原理。机器视觉是一个工程学科从工程入手反向理解原理远比对着公式啃效率高。这三个项目用到的关键技术点确实可以在一条线路上串联起来图像标注与模型训练、传统图像处理算子、相机标定、手眼标定、点云处理、与PLC或机器人的通信这些依次学下来基本能力就覆盖了主流机器视觉岗位的需求。我自己也是从一个个项目里被逼着学会这些东西的没有哪一个是靠看课本看会的。最后说一点个人感受。机器视觉听起来是个高深的技术名词但绝大多数项目现场的难点都是灯光没打对、支架没锁紧、通讯超时没人排查这些问题。做这行的价值不在于能讲清楚某个论文里的注意力机制而在于能把一个系统放到恶劣的工业环境里稳定运行。如果你正在做或者准备做机器视觉项目希望这篇文章里那些踩过的坑能帮你少熬几个夜。