☰
机器视觉实战:车辆检测、瓶体分类与3D定位引导
2026/10/1 13:47:20 网站建设 项目流程

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相机都能捕捉到球心位置。因为机械臂在每个姿态下的工具坐标值是已知的,相机也测到了球心在相机坐标系下的值,这两组对应点就可以通过求解手眼标定方程AX=XB得到变换矩阵。我用的是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或机器人的通信,这些依次学下来,基本能力就覆盖了主流机器视觉岗位的需求。我自己也是从一个个项目里被逼着学会这些东西的,没有哪一个是靠看课本看会的。

最后说一点个人感受。机器视觉听起来是个高深的技术名词,但绝大多数项目现场的难点都是灯光没打对、支架没锁紧、通讯超时没人排查这些问题。做这行的价值不在于能讲清楚某个论文里的注意力机制,而在于能把一个系统放到恶劣的工业环境里稳定运行。如果你正在做或者准备做机器视觉项目,希望这篇文章里那些踩过的坑,能帮你少熬几个夜。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询