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