去年接了一个毕业设计定制需求,课题名叫“农作物尺寸测量自动分类系统”。定制方给的项目编号是F,整条产线由一个团队完成设计和交付。乍一听,这像是一个标准的“图像识别+自动控制”套餐:相机拍一拍,算法算一算,传送带分一分。但真正把方案落地之后,我的感受完全相反——这个题目里最难的部分根本不是写代码,而是想清楚“测量”这两个字在一条真实的传送带上究竟意味着什么。如果你也正在做类似的农产品分级项目,或者准备把它当作毕业设计课题,这篇复盘应该能帮你少走不少弯路。
1. 破题与需求收敛,先想清楚“测量什么”再谈怎么写代码
1.1 从一句话需求到可验收的设计指标
定制方最初给的需求只有一句话:做一个能测量农作物尺寸、并按大小自动分类的装置。这句话听起来很明确,但落到工程上几乎处处都是坑。因为“农作物”“尺寸”“分类”这几个词每一项都能拆出至少三四个变体。比如作物到底是哪一类,是苹果、柑橘、土豆还是长条形的黄瓜?尺寸是指最大直径、最小直径、平均直径还是投影面积?分类是分两档还是分四档,精度要求是多少,每分钟要处理多少个果实?
我见过不少毕业设计项目就是死在这一步:拿到题目就急着搭相机、跑模型,做到中期才发现被测对象本身不规整,导致测量标准根本定不下来。所以在动手之前,我们花了两周时间做需求收敛,最终把验收指标定成如下几条:
- 被测对象:直径范围20到120毫米的近似球形/椭球形农产品,以柑橘、土豆为主要测试样本;
- 测量参数:输出果实最大横径(毫米),同时记录投影面积和等效直径;
- 分级档位:特级、一级、二级、等外共四档,边界可配置;
- 测量精度:尺寸误差不超过正负1毫米;
- 节拍要求:每小时分拣不低于1200个,也就是单果处理时间不超过3秒;
- 工作环境:普通室内光照,但测量工位需要加遮光罩以减少环境光干扰。
这条指标一旦写清楚,后面所有技术选型就都有据可依了。特别是“正负1毫米”和“3秒一个果”这两条,直接决定了视觉方案能不能用、硬件成本大概在什么量级。
1.2 “尺寸”的定义决定整个方案的走向
很多人会忽略一个前提:农作物不是工业标准件,它没有一条绝对意义上的“直径”。同样是土豆,横着放和竖着放,测出来的最大径完全不同;同样是柑橘,带果柄和不带果柄,外轮廓也会差出好几个像素。所以必须先由需求方确认,尺寸到底按什么定义来算。
我们最终采用业内比较通用的做法:等价直径法。即先通过视觉系统获取果实的投影轮廓,计算轮廓面积,再用圆面积公式反推出直径,这个值叫等效直径。等效直径的特点是稳定、抗旋转,不管果实以什么角度经过相机,只要投影面积不变,测量结果就不变。对于土豆这类长条形样本,我们又额外输出了一个最小外接矩形的长和宽,用来描述“长径”和“短径”,方便后续扩展成按长宽比分类。
这里还有个容易被忽略的细节:如果你打算用重量去反推尺寸,那就要小心了。不同批次、不同含水率的果实,密度差异很大,重量和直径并不是稳定的线性关系。称重方案适合做等级粗筛,但不适合做尺寸的精确测量,我们在方案评审时直接把这条路排除了。
1.3 精度、速度、成本三角约束
任何测量系统都逃不过这个三角约束:精度、速度、成本,三者最多同时满足两个。人工卡尺测量精度高,但速度极慢,成本也高;光电传感器阵列速度还行,但只能分辨有没有超过阈值,给不了连续尺寸;视觉测量速度和精度都能兼顾,但成本和技术门槛最高。
我在方案评审时做了一张对比表,最终也帮定制方理解了为什么要优先选视觉方案。
| 测量方案 | 精度表现 | 处理速度 | 硬件成本 | 维护难度 | 适用场景 |
|---|---|---|---|---|---|
| 人工卡尺测量 | 高,可达0.5毫米 | 极慢,单人约300个/小时 | 低 | 无 | 小批量抽检 |
| 光电开关阵列 | 低,约5毫米 | 较快,取决于传送速度 | 中 | 低 | 单一尺寸阈值筛选 |
| 称重反推 | 中,受密度影响 | 快 | 中 | 低 | 按重量分级的场景 |
| 工业相机视觉测量 | 高,配合标定可达1毫米内 | 快,取决于算法耗时 | 较高 | 中 | 多档位连续分级 |
| 3D激光轮廓 | 极高,可达0.1毫米 | 中快 | 很高 | 高 | 复杂形状精密测量 |
结论很明确:要同时满足四档分级、正负1毫米精度和每小时1200个的节拍,工业相机视觉测量几乎是唯一合理的选择。3D方案精度高,但成本直接翻倍,对一个毕业设计定制作品来说,投入产出比不高。
2. 整体方案与关键硬件选型:视觉为主、传感器兜底
2.1 测量工位的结构布局
系统整体结构可以概括为“一条传送带,两个工位”。第一个工位是触发工位,负责检测果实是否到达测量位置;第二个工位是拍摄工位,工业相机垂直安装在传送带正上方,镜头下方布置背光光源。果实随传送带经过拍摄区域时,相机采集轮廓图像,上位机完成尺寸解算,然后把分级结果通过IO信号发送给下游的分拣执行机构。
为什么要把触发和拍摄分开?因为如果只用定时触发,传送带速度一旦波动,相机抓拍的位置就会前后漂移,导致果实不在画面中心,边缘被截断,测量尺寸偏小。我们在传送带侧面安装了一对光电对射传感器,果实遮挡光束的瞬间产生硬件上升沿信号,直接触发相机硬触发拍摄。这样无论传送带速度怎么变,果实到固定位置时都能被准确拍到。
2.2 相机与镜头的匹配计算
选相机不是分辨率越高越好,而是要看“像素精度”是否满足测量要求。我们按视场150毫米、相机分辨率500万像素(2448乘2048)计算,单个像素对应的物理尺寸约为0.061毫米。即使不做亚像素处理,这个分辨率已经远高于正负1毫米的要求。实际我们用了亚像素边缘提取,测量稳定性进一步提高。
镜头的选择重点看焦距和物距。为了减小透视畸变,相机要垂直正对被测物,物距控制在400毫米左右,视场150毫米,由此估算需要的焦距约为25毫米。这里要特别提醒:一定要选低畸变的工业镜头,普通的监控镜头在边缘区域会有明显的桶形畸变,会导致同一颗果实放在画面中心和放在画面边缘时,测出来的直径不一样。
另外还有一个小细节,相机曝光时间必须足够短。传送带速度如果设定为0.2米/秒,曝光时间10毫秒时,成像拖影会达到2毫米,这个误差直接让系统失效。我们把曝光时间压到1毫秒以内,同时搭配了亮度足够高的背光光源。如果预算允许,用频闪光源效果更好,但它需要额外的控制器,联调时也会更复杂。
2.3 执行机构:推杆、挡板还是吹气
分拣执行机构我们比较了三种方案。吹气式适合轻量级的小果实,比如红枣、枸杞,一个电磁阀加气嘴就能完成,速度快但推力小。挡板式适合中等重量的果实,气缸推动挡板把果实导向侧边滑槽。推杆式最直接,气缸从斜上方推出,果实脱离传送带掉入对应料筐。
考虑到实际测试样本是柑橘和土豆,单果重量最高能到300克,吹气方案直接排除。挡板式的问题在于,果实之间距离不均匀时会夹果。最后选用了推杆式:三个推杆,分别对应特级、一级、二级三个档位,等外果不推,直接随传送带掉到末端料筐。每个推杆上方加了一个光电开关,用来确认推杆是否成功推出,如果检测到果实仍然留在传送带上,系统会记录一次“漏推”日志,并在PLC侧给出报警。
这一块的核心心得是:执行机构看起来是机械件,但它决定了整套系统的上限,因为视觉测准了,分拣推不准,一切都白搭。控制部分的电气布局、气缸气压调节、推杆行程设定,每一项在联调时都需要反复试。
3. 图像处理链路:从标定到毫米级尺寸解算
3.1 相机标定为什么必须做
很多初学者拿到相机第一步就是拍照、分割、算像素面积,然后直接输出“直径”。这样做的后果是:同一个物体放在画面不同位置,出来的尺寸不一样,而且边缘区域误差会明显放大。原因就是镜头畸变和相机的透视关系没有校正。
我们的做法是先用棋盘格标定板做相机内参标定,得到畸变系数和相机内参矩阵,然后在测量程序里对每一帧图像做去畸变处理。标定流程:打印一张棋盘格标定板,贴在平整硬板上,在测量高度附近从不同角度拍摄15到20张,用标定工具提取角点、计算内参、重投影误差,确认误差小于0.1像素后再固化参数。
标定还有一个容易被忽略的点:标定板必须在实际物距处拍摄。如果标定是在20厘米物距完成的,实际测量物距是40厘米,得到的畸变参数完全无效。这是我在帮好几个同学排查测量不准问题时最常见的原因。
3.2 图像分割与轮廓提取的实践经验
尺寸测量最怕的是分割不干净。果实表面颜色不均、传送带颜色接近、环境光反光,都会让边缘提取出偏差。我们在测量工位专门用了背光方案:相机拍到的是果实挡住光源形成的黑色剪影,背景是高亮均匀的白色。这样分割阈值非常稳定,几乎不受果实表面颜色影响。
分割流程可以概括为:灰度化、固定阈值二值化、形态学开运算去掉细小噪点、查找最大连通域、提取轮廓。其中形态学开运算特别重要,因为柑橘果柄和叶片在剪影里会形成额外的突起,如果不处理,外接圆直径会被撑大。我们用一个半径较小的圆形结构元素做开运算,能抹掉大部分果柄影响,同时不会明显收缩果实主体边界。
提取轮廓之后,尺寸解算就变得很直接。对于类球形果实,我们使用最小外接圆法,或者用轮廓面积换等效直径。实际测试发现,等效直径比最小外接圆更稳定,因为最小外接圆对轮廓上的单个异常点非常敏感。写成程序逻辑大致是:
contour = find_largest_contour(binary_mask) area = contour_area(contour) eq_diameter = 2 * sqrt(area / pi) min_circle = min_enclosing_circle(contour) rect = min_area_rect(contour)3.3 从像素到毫米的换算公式与验证
拿到像素直径之后,不能直接乘一个固定比例就完事。虽然严格来说,只要物距固定、镜头畸变校正完毕,像素与毫米的比例确实是线性关系,但这个比例系数必须在实际测量高度上标定。我们用一块已知直径的校准圆盘,在传送带上放10次,每次放在不同位置,记录像素直径,然后求平均系数。
比例系数K的计算公式是:K等于标准件真实直径除以像素直径。假设校准圆盘真实直径是50.00毫米,10次测量平均像素直径是812.5像素,那么K约为0.0615毫米/像素。之后任意果实的直径就等于像素直径乘以K。
这一步做完,还要做一个验证实验:用游标卡尺实测20颗果实,和视觉测量结果对比。我们的实测数据中,绝对误差最大0.8毫米,平均误差0.3毫米左右,满足正负1毫米的指标要求。这个验证数据一定要保留,因为它既是技术调试的依据,也是毕业设计答辩时最有力的证据。
4. 分类逻辑与分拣控制:阈值设置与兜底机制
4.1 分级标准怎么量化
分级阈值不是随便写的,需要参考实际农产品流通标准。以柑橘类为例,常见做法是按果实最大横径分档:特级果不小于80毫米,一级果70到80毫米,二级果60到70毫米,60毫米以下为等外果。这个标准可以配置,因为不同作物、不同销售渠道的等级要求不一样。
我们把分级阈值做成了上位机里的一个配置文件,修改时不需要重编译。这样换一批测试样本时,可以直接在界面上改数字,非常方便。需要提醒的是,阈值边界上的果实很容易被错分,比如一颗刚好70.2毫米的果实,按标准应该算一级,但如果视觉测量误差有0.5毫米,就可能把它推到特级。为此我们在阈值两侧各留了0.5毫米的缓冲带,进入缓冲带的果实统一降级处理。
4.2 从测量到动作的时序控制设计
视觉系统测量完尺寸后,果实已经跑了很远,分拣推杆又不能立刻动作,中间隔了一段传送距离。因此,必须做延时控制。具体做法是:记录每个果实被拍到的时刻,测量出拍摄点到各个推杆的物理距离,再除以传送带速度,得到推杆动作的延时。
为了应对传送带速度波动,我们在传送带驱动轮上加装了一个旋转编码器,实时采集传送带运行速度。当系统判定当前果实需要在一号推杆处推出时,上位机根据实时速度动态计算延时,并输出一个触发信号给推杆控制器。这样比固定延时可靠很多。实际测试中,加入编码器反馈后,分拣位置的命中率明显提高,误推和漏推都少了很多。
控制链路里还要考虑一个问题:多果实同时在线。如果两个果实相距很近,先拍的果实还没到推杆,后拍的果实已经开始计算尺寸,这时程序必须为每个果实维护独立的记录,包括编号、尺寸、拍摄时间、预计到达各推杆的时间,不能共用一个变量,否则后一个物体会覆盖前一个物体的信息。这类并发处理的逻辑,很容易被初学者忽略。
4.3 误判、掉料和堵料的兜底机制
自动化系统真正考验人的不是正常流程,而是异常流程。我们设计了三层兜底机制。
第一层,测量置信度判断。如果图像分割出来的轮廓面积过小、过大,或者轮廓完整度明显不足,程序直接给该果实打上“无法测量”的标签,不参与分级,最终走等外果通道进入末端料箱,宁可误杀不可错分。
第二层,推杆动作反馈。每个推杆工位加装光电传感器,如果推杆动作后,果实仍停留在传送带上,系统进入“漏推”处理,记录当前果实的编号和尺寸,同时蜂鸣器报警,提醒操作人员人工处理。
第三层,堵料监测。在传送带末端增加一个堆积检测光电开关,如果末端料箱区域的果实堆积过高,系统自动停止传送带,防止果实滚落和互相碰撞导致测量数据混乱。这套兜底机制看着简单,但在连续运行一小时以上的测试中,确实帮我们避免了好几次事故。
5. 联调阶段踩过的坑和最终解决方式
5.1 光照漂移:同一颗果实上午和下午尺寸测出来不一样
这是联调第一周遇到的最诡异的问题。早上校准完系统,测量结果一切正常;到了下午,同一颗果实测出来的直径突然偏大了将近2毫米。排查了很久,最后发现是环境光捣的鬼。测量窗口附近的自然光在下午会变化,背光光源的亮度相对被削弱,二值化阈值虽然没有变,但果实的边缘梯度受到影响,分割轮廓向外扩展了几个像素,直径就被撑大了。
解决方案分两步走。第一步是结构上把测量工位四周完全封闭,只留上下料口,彻底隔绝自然光。第二步是软件上不写死二值化阈值,改用自适应阈值法,基于图像的灰度直方图动态计算分割阈值。双管齐下之后,连续跑了三天,同一颗果实的测量重复性稳定在0.2毫米以内。
5.2 果柄和叶片造成的轮廓误判
另一个高频坑是果柄。柑橘摘下来时往往带着一小段果柄,甚至还有一两片叶子。背光环境下,果柄和叶子会形成细长的暗色突起,导致最小外接圆直径被严重高估。第一次实测时,一颗实测直径72毫米的果实,视觉系统算出来接近78毫米,直接跨了一级。
解决思路是“先腐蚀后筛选”。用形态学开运算先把细小突起腐蚀掉,然后按轮廓的面积和周长关系判断连通域形状,把长宽比过大、面积占比过小的区域视为杂物剔除。对于实在无法完全剔除果柄的果实,我们还在测量结果后处理里加入了一个修正规则:当轮廓等效直径和外接圆直径差距过大时,优先采用等效直径,因为等效直径受局部突起影响更小。
5.3 节拍与精度的平衡实验
提速是联调阶段最后做的事。刚开始系统节拍很慢,单果处理时间超过4秒,卡在图像传输和算法计算上。在业余选手手里,这个速度可能也能演示,但它不符合每小时1200个的指标,必须优化。
我们做了三件事:一是把相机图像传输方式从USB改为千兆网,减少传输时间;二是把算法里精度不敏感的部分从浮点优化为整型运算,并采用ROI区域裁剪,只在果实附近区域做处理,而不是整帧图像遍历;三是调高传送带速度到0.25米/秒,并同步压短曝光时间到0.5毫秒。最终单果处理时间稳定在1.8秒左右,整个测试批次连续运行500个果实,没有出现掉帧和漏测。
| 优化项 | 优化前 | 优化后 |
|---|---|---|
| 图像传输 | 约1.2秒 | 约0.4秒 |
| 分割与尺寸计算 | 约1.5秒 | 约0.7秒 |
| 单果总耗时 | 约4秒 | 约1.8秒 |
| 分拣命中率 | 约91% | 约97% |
值得一提的是,节拍提上来之后,分拣命中率反而提升了。原因是传送带速度稳定后,果实间距更均匀,推杆动作的节奏感更强,不像低速时段时快时慢。
6. 作为毕业设计定制作品的交付维度
6.1 除了能跑的样机,还要交付哪些东西
毕业设计定制作品和普通的工程项目有一个很大的不同:验收除了看实物能不能跑,还要看材料能不能支撑论文和答辩。所以我们交付时准备了完整的一套资料包,包括硬件BOM清单、机械结构图纸、电气接线图、上位机源代码、操作手册、测试记录表以及一镜到底的演示视频。
其中测试记录表特别关键。我们按照不同尺寸区间各取20个样本,逐一记录人工测量值和系统测量值,算出误差平均值和最大值。这组数据可以直接放进论文的实验章节,也能在答辩时拿出来证明系统指标的达成情况。做这种项目,千万不要等到最后才补测试数据,联调过程中每一次试运行的数据都应该留底。
6.2 演示场景怎么设计才不翻车
毕业设计答辩和项目验收时的现场演示,和实验室自己跑测试完全是两回事。演示现场经常会有评委走动、窗户开合、灯光变化,这些都会瞬间打破你在实验室里调好的氛围。我们总结出一个稳妥方案:测量工位做成半封闭结构,展示时固定关闭窗帘、开启工位内的补光灯;放置三到五个已知标准直径的校准件,正式分拣前先快速测一遍校准件,如果全部落在误差范围内,再开始测果实。
这样做的目的不是“作弊”,而是给系统一个稳定的工作条件,任何仪器在恶劣环境下都会降级。你自己心里要有数:系统在什么条件下能用、什么条件下不能用,这是工程基本素养,也是答辩时老师最喜欢追问的点之一。
6.3 验收与答辩中要预设的提问点
结合我们这次验收的实际经历,这类题目几乎逃不掉下面几个问题:
- 测量精度是怎么保证的?回答思路:标定、像素精度计算、验证实验数据。
- 换一种作物能不能直接适应?回答思路:测量算法基于轮廓,换作物只需要重新标定比例系数、调整分割阈值和分级区间。
- 你的系统和人工分拣相比,优势在哪?回答思路:一致性高、不疲劳、数据可追溯,但前期成本高,适合规模化产线。
- 如果传送带速度再提高一倍,系统会怎么表现?回答思路:曝光时间、算法耗时、推杆响应速度三个瓶颈,需要按优先级逐一优化。
这些问题都要提前在PPT和论文里埋好答案,答辩时才能做到有理有据,不至于现场现想。
做完整套系统之后,我最大的感受是:这类“测量+分类”的题目,真正的技术含量不在深度学习,也不在花哨的界面,而在于对误差来源的理解和对工程细节的耐心。相机标定差一点、曝光时间长一点、推杆延时错一点,最后都会变成实打实的错分果实。如果你正在做类似的课题,一定要先把测量标准定义清楚,再谈算法和硬件,否则后面每一步都是在补前面的债。