自动化生产线物料计数:实现精确数量统计的 6 个实用策略,附 OpenCV+Halcon 实战代码!
在产线物料统计中,你是否常被这些问题困扰?
• 零件密集排列,粘连严重,传统二值化“一坨算一个”; • 药片反光、颜色相近,边缘模糊不清; • 传送带抖动导致图像模糊,计数跳变; • 想用深度学习,但部署慢、小目标漏检多……
"
准确计数 ≠ 简单连通域分析它的核心挑战是:分离粘连、抗干扰、适应形变、实时稳定
今天,我们就系统拆解 自动化物料计数的 6 个实用策略,从分水岭分割到实例分割,全部附上 OpenCV + Halcon 可运行代码,助你在 200ms 内完成千级小件精准计数,误差率 <0.5%!

一、为什么“直接找轮廓”会严重漏计?
"
真正的计数 = 分离 + 验证 + 容错
二、6 大实用策略:从基础到智能
策略1:距离变换 + 分水岭分割(Watershed)
• 原理:
• 对二值图计算距离变换 → 找局部极大值(种子点) • 以种子点为起点,分水岭算法“淹没”粘连区域• 优势:无需训练,适合圆形/椭圆物体(如药片、电池)
策略2:形态学开运算 + 区域生长(应对轻微粘连)
• 流程:
1. 用小圆盘结构元做开运算,切断细颈连接 2. 连通域分析 → 初步计数 3. 对大区域进行区域生长或二次分割• 适用:螺丝、电容、糖果等规则小件
策略3:基于面积/形状的合理性过滤
• 规则:
• 单个物料面积 ∈ [A_min, A_max](如药片 800~1200 像素²) • 圆形度 > 0.7(排除碎屑、污点) • 长宽比接近1(排除划痕、纤维)• 价值:将误计率降低 70% 以上
策略4:Halcon 的 connection + select_shape 组合拳
• 特色功能:
• connection:快速提取连通域• select_shape:支持20+几何特征过滤(area, circularity, rect2_len, etc.)• 可直接输出数量与中心坐标• 优势:工业 AOI 标配,稳定高效
策略5:Blob 分析 + 动态 ROI(适应传送带流动)
• 方法:
• 在传送带固定位置设置 ROI(避免背景干扰) • 每帧仅处理 ROI 内 Blob • 结合帧间跟踪,防止重复计数• 适用:连续下料、振动盘供料场景
策略6:轻量化实例分割(YOLOv8-seg / MobileSAM)
• 架构选择:
• YOLOv8-seg:速度快(>30 FPS on GPU),支持小目标 • MobileSAM:仅需1个点提示,适合嵌入式• 优势:可处理任意形状、严重堆叠、透明物体
三、实战代码:OpenCV + Halcon 快速实现
✅ OpenCV:距离变换 + 分水岭计数(Python)
import cv2import numpy as npdefcount_items_watershed(img, min_area=500, max_area=2000):# 1. 预处理:灰度 + 高斯模糊 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (5, 5), 0)# 2. 二值化(Otsu) _, binary = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)# 3. 形态学开运算(去噪 + 切断细连接) kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel, iterations=2)# 4. 距离变换 + 找种子点 dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5) _, sure_fg = cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0) sure_fg = np.uint8(sure_fg)# 5. 分水岭分割 _, markers = cv2.connectedComponents(sure_fg) markers = markers + 1 unknown = cv2.subtract(cv2.dilate(opening, kernel, iterations=3), sure_fg) markers[unknown == 255] = 0 markers = cv2.watershed(img, markers)# 6. 提取有效区域(排除背景=1) labels = np.unique(markers) count = 0for label in labels:if label == -1or label == 1: # 边界 or 背景continue mask = (markers == label).astype(np.uint8) * 255 area = cv2.countNonZero(mask)if min_area <= area <= max_area: count += 1return count, markers# 使用示例img = cv2.imread('pills_on_belt.jpg')count, _ = count_items_watershed(img, min_area=800, max_area=1200)print(f"✅ 精确计数: {count} 粒")"
? 提示:该方法在药片、纽扣电池、糖果等圆形物体上效果极佳,配合背光照明可进一步提升精度。
✅ Halcon:使用 connection + select_shape 快速计数(HDevelop)
* 1. 读取物料图像(建议背光)read_image (ImageItems, 'screws_backlight.tiff')* 2. 二值化(自动阈值)binary_threshold (ImageItems, RegionBin, 'max_separability', 'light', UsedThreshold)* 3. 连通域分析connection (RegionBin, ConnectedRegions)* 4. 几何过滤(面积 + 圆形度)select_shape (ConnectedRegions, SelectedRegions, ['area', 'circularity'], 'and', [500, 0.6], [2000, 1.0])* 5. 输出数量count_obj (SelectedRegions, NumItems)disp_message (..., '✅ 物料数量: ' + NumItems, 'window', 12, 12, 'green', 'true')* 6. (可选)可视化dev_display (ImageItems)dev_set_color ('red')dev_set_draw ('margin')dev_display (SelectedRegions)"
? 提示:Halcon 的这套流程是工业计数黄金标准,已在电子装配、制药、食品包装产线广泛应用,速度 <50ms(1280×1024)。
四、工业落地 3 大建议
1. 优先使用背光照明 • 获得高对比度轮廓,简化分割 • 尤其适合扁平、不透明小件 2. 必须做面积标定 • 用标准样品确定 min/max 面积(像素²) • 防止因焦距变化导致误判 3. 关键场景加 AI 辅助 • 如透明胶囊、异形零件 • 用 YOLOv8-seg 补充分水岭的不足
五、避坑指南
• ❌ 不要直接对彩色图像做连通域 —— 颜色干扰大 • ✅ 务必先转灰度 + 二值化 • ❌ 不要用固定阈值 —— 光照波动会导致失效 • ✅ 使用自适应阈值(如 Otsu、dyn_threshold)
六、总结
一粒药片的缺失,可能是一整批召回的开始。掌握这 6 个策略,你就能:
• 在 100ms 内完成 500+ 小件精准计数 • 将人工复核工作量减少 90% • 满足 GMP、ISO 9001 等合规要求
"
记住:自动化计数的价值,不在于“快”,而在于“准”——因为少一个,就是零容忍。

