在自动化回收系统中,识别和统计回收箱中瓶子的数量是一项关键任务。该任务不仅要求能够准确地计数,而且需要识别异常瓶子状态(如颠倒、横放)以及检测非瓶子的杂物。为此,本文使用 HALCON 图像处理库 实现了一个完整的检测与分类流程,能够:
通过网盘分享的文件:分类并计数瓶子.7z
链接: https://pan.baidu.com/s/19d7tPMJVsRWmj4JFTEYIeQ?pwd=jkcf 提取码: jkcf
图1:整体算法流程图(建议插入在本章节末尾)
┌──────────────┐
│ 初始化设置 │
└────┬─────────┘
▼
┌──────────────┐
│ 图像循环读取│ ←─────┐
└────┬─────────┘ │
▼ │
┌──────────────┐ │
│ 背景提取 │ │
│ 阈值50–130 │ │
│ + 圆形开运算 │ │
└────┬─────────┘ │
▼ │
┌──────────────┐ │
│ 高光反射提取│ │
│ 阈值85–255 │ │
│ 差集减去背景│ │
└────┬─────────┘ │
▼ │
┌──────────────┐ │
│ 杂物提取 │ │
│ 选择宽高大的 │ │
│ 区域 + 开运算│ │
└────┬─────────┘ │
▼ │
┌──────────────┐ │
│瓶子候选提取 │ │
│尺寸25–100 │ │
│区域填充 │ │
│圆度筛选 >0.87│ │
└────┬─────────┘ │
▼ │
┌──────────────┐ │
│大瓶子识别 │ │
│直径 > 75 │ │
└────┬─────────┘ │
▼ │
┌──────────────┐ │
│ 显示结果 │ │
│绿色: 普通瓶子 │ │
│橙色: 颠倒瓶子 │ │
│红色: 杂物警告 │ │
└────┬─────────┘ │
▼ │
┌──────────────┐ │
│ 等待继续或结束│───────┘
└────┬─────────┘
▼
┌──────────────┐
│恢复系统设置 │
└──────────────┘
get_system ('store_empty_region', StoreEmptyRegion)
set_system ('store_empty_region', 'false')
read_image (Image, 'bottles/bottle_crate_01')
dev_open_window_fit_image (...)
此部分主要负责系统参数的保存与图像显示窗口的设置。使用 store_empty_region
控制是否缓存空区域,提高内存效率。
threshold (Image, BackgroundRegion, 50, 130)
opening_circle (BackgroundRegion, BackgroundRegion, 3.5)
对图像进行阈值处理,保留灰度值介于50到130之间的背景部分。通过圆形开运算消除孤立噪点。
threshold (Image, Region, 85, 255)
difference (Region, BackgroundRegion, Region)
connection (Region, ConnectedRegions)
识别高反射区域并剔除背景干扰,得到可能为瓶子或杂物的候选区域。
select_shape (ConnectedRegions, Clutter, ['width', 'height'], 'or', [100, 100], [500, 400])
difference (ConnectedRegions, Clutter, Region)
通过 width
和 height
对候选区域进行尺寸筛选,判断是否为杂物。
select_shape (FilledCandidates, RoundCandidates, 'circularity', 'and', 0.87, 1)
select_shape (RoundCandidates, BigBottles, 'max_diameter', 'and', 75, 99999)
使用圆形度特征 circularity
判断是否为正常瓶子。圆形度接近1的区域被认为是合格瓶子,尺寸较大的圆形区域被标记为颠倒瓶子。
disp_message (... NumBottles + ' bottles found.' ...)
if (NumClutter > 0)
disp_message (... 'Warning! Clutter detected!' ...)
endif
将结果以颜色区分显示在界面上,并在检测到杂物时触发警报提示信息。