翻开大多数机器视觉课程的实验指导书,你会发现一个规律:实验一,找圆;实验二,找边;实验三,识别二维码。中规中矩,但学生做完三个实验后,通常会问一个让我哭笑不得的问题:“老师,我学会了找圆,但这能用来干什么?”
这个问题刺痛了我。我们的教学脱离了真实场景,学生学了工具,却不知道工具要解决的工程问题是什么。于是,我决定换一个思路——用一个完整的“药片高速视觉检测”项目,贯穿整个课程。

项目发布:一个真实的工业难题
课程第一周,我把一个密封的盒子带进教室。打开后,里面是一个小型的传送带、一个工业相机、一批药片样品,以及一份“客户需求说明书”。
说明书上写着:“我司口服液生产线需要一套在线视觉检测系统,要求:1.检测每板药片中是否有缺粒;2.检测药片是否有破损、裂片;3.检测药片位置是否偏移;4.检测速度不低于每分钟200板。合格输出OK信号给PLC,不合格输出NG并报警。”
学生们立刻意识到了挑战:这不是“找圆找边”能解决的问题。速度要求高、检测项目多、误检率要求低。有人小声嘀咕:“这才第一周,就要做这个?”
我笑了笑说:“别急,我们分步走。”
第一步:照明与成像——被忽视的关键
很多教材一上来就讲算法,但真正工业现场的工程师知道,照明是视觉检测的灵魂。一张拍得好的图,算法的工作量可以减少80%;一张拍得差的图,再牛的算法也救不回来。
我用这节课让学生做了一件事:尝试不同的光源组合,拍出最清晰的药片轮廓。环形光源、背光源、条形光源,什么角度、什么亮度、什么颜色?学生在实验台上反复试,有人发现背光源能完美凸显药片的边缘,但也把药片表面的裂痕“淹没”了;有人发现低角度的环形光能把裂痕的阴影打得特别清楚。
最后,每组提交一张“最佳成像照片”,并解释为什么选择这个方案。这个过程让学生明白了一个道理:机器视觉工程师不仅是写代码的,还是光线的“导演”。
第二步:算法实现——把知识点串成线
当学生拍到了理想的图像,真正的挑战才刚刚开始。我把整个检测任务拆成了三个子任务,每个任务对应课程的一个核心知识点。
子任务一:药片定位。学生需要找到每个药片的位置,即使它们在传送带上有些偏移。这里用到了模板匹配。学生在Halcon里创建了一个标准药片的模板,然后写代码让程序在每帧图像里找到所有匹配的位置。有学生发现,当药片旋转角度较大时,匹配会失败——于是他们学会了设置旋转范围、调整匹配阈值。
子任务二:缺损检测。这是最难的部分。一个药片是否破损,需要分析它的轮廓和面积。学生用阈值分割把药片从背景中分离出来,然后计算每个连通域的面积、圆度、长短轴比。程序自动判定:面积小于标准值90%的视为破损,圆度低于0.8的视为变形。
子任务三:位置纠偏。检测到偏移怎么办?学生需要计算出偏移的像素值,然后换算成实际距离(毫米),再通过串口把补偿值发送给PLC,让机械手调整抓取位置。
这三个子任务做下来,学生把定位、分割、特征提取、通信接口全都练了一遍,而且是有逻辑地串联起来的,不是孤立的知识点。
第三步:集成与通信——从视觉到自动化
很多课程教到算法就结束了,但工业现场的视觉系统不是孤立的,它必须和PLC、机械手、MES联动。我们用了一整周的时间做集成。
学生在C#里封装了视觉算法,开发了一个简单的检测界面。然后通过TCP/IP协议,和一台模拟PLC(我用的是PLCSIM)建立通信。当相机触发拍照,程序完成检测后,会把结果(OK/NG/偏移数据)打包成特定格式的报文发出去。
调试过程充满了“惊喜”:有人发现PLC怎么也收不到数据,排查了半天,原来是IP地址最后一个数字写错了;有人发现发送频率太快,PLC处理不过来导致丢包,于是加入了缓存队列;还有人发现当连续出现NG时,产线需要停机报警,于是增加了一个计数器和阈值判断。
一个学生在最后一节课调试成功后,兴奋地拍了个短视频发朋友圈:“今天我的相机和‘PLC’终于聊上天了,虽然只是一个‘OK’和‘NG’,但我感觉它们之间有了默契。”
效果与反思
学期结束时,我让学生做了一个展示:每组运行自己的视觉检测系统,现场检测200个药片样本(其中混了30个破损品)。结果是——平均检出率96.7%,误报率2.1%。虽然离工业级99.9%还有差距,但学生们的成就感溢于言表。
更重要的是,他们带走了三种能力:一是工程思维——先分析光照、再设计算法、最后做集成,顺序不能乱;二是调试能力——面对“找不到药片”或者“误检率太高”的问题,知道从哪里入手排查;三是系统观念——明白视觉只是产线的一个部件,必须学会和PLC、机器人“对话”。
如果你也在教机器视觉,不妨试试项目制教学。不要从“找圆找边”开始,而是从一个真实的工业问题开始——比如药片检测、螺丝尺寸测量、二维码读取。你会发现,学生的学习热情和工程能力,会在解决真实问题的过程中被真正点燃。