如何利用HALCON进行瓶子计数和杂物检测

一、项目背景与目标

在自动化回收系统中,识别和统计回收箱中瓶子的数量是一项关键任务。该任务不仅要求能够准确地计数,而且需要识别异常瓶子状态(如颠倒、横放)以及检测非瓶子的杂物。为此,本文使用 HALCON 图像处理库 实现了一个完整的检测与分类流程,能够:

  • 自动识别回收箱中正常放置的瓶子
  • 检测颠倒插入的瓶子并以橙色高亮显示
  • 识别横放或其他体积较大的杂物,触发报警提示
  • 实现每张图像的逐张处理与用户交互

数据集与运行说明

  • 数据集下载地址
    数据集包含24张测试图像,每张图像包含多个瓶子与可能的干扰项:
通过网盘分享的文件:分类并计数瓶子.7z
链接: https://pan.baidu.com/s/19d7tPMJVsRWmj4JFTEYIeQ?pwd=jkcf 提取码: jkcf

二、算法流程图

图1:整体算法流程图(建议插入在本章节末尾)

  1. 图像读取与显示初始化
  2. 提取背景区域与瓶子高光区域
  3. 形态学操作清理图像
  4. 检测“瓶子”、颠倒瓶子与杂物
  5. 显示结果并判断是否报警
 ┌──────────────┐
 │  初始化设置  │
 └────┬─────────┘
      ▼
┌──────────────┐
│  图像循环读取│ ←─────┐
└────┬─────────┘       │
     ▼                 │
┌──────────────┐       │
│  背景提取    │       │
│ 阈值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)

通过 widthheight 对候选区域进行尺寸筛选,判断是否为杂物。


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

将结果以颜色区分显示在界面上,并在检测到杂物时触发警报提示信息。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客晨风

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值