基于 YOLOv5 目标检测 + Retinex 图像增强 + HSV 颜色分析 的苹果品质自动检测与分级系统,提供完整的 PyQt5 图形界面,支持实时摄像头检测、自动抓拍、品质分级和历史数据管理。
摄像头实时画面
│
▼
YOLOv5 目标检测(定位苹果区域)
│
▼ 检测面积占比 > 75.5% 时触发自动抓拍
│
▼
┌─────────────────────────────────┐
│ 图像处理流水线 │
│ ┌───────────────────────────┐ │
│ │ MSRCP Retinex 图像增强 │ │
│ └─────────┬─────────────────┘ │
│ ├──→ 果径测量(最小外接圆)
│ ├──→ HSV 颜色分析(红/黄/黑面积)
│ └──→ 损伤区域检测
└─────────────────┬───────────────┘
▼
苹果品质自动分级
(一级 / 二级 / 三级)
│
┌───────┴───────┐
▼ ▼
SQLite 存储 GUI 界面展示
- 实时目标检测:基于 YOLOv5s 对摄像头画面进行实时苹果检测与标注
- 自动抓拍:当苹果检测区域占画面比例超过阈值时自动触发抓拍
- 图像增强:MSRCP(Multi-Scale Retinex with Chromaticity Preservation)增强算法,提升颜色特征
- 品质指标分析:
- 果径:通过轮廓检测 + 最小外接圆计算
- 红色着色度:HSV 色彩空间多区间红色面积占比
- 损伤面积:黑色区域检测
- 自动分级:依据着色度、果径、损伤面积三项指标划分品质等级
- 图像操作工具箱:灰度化、滤波、形态学、边缘检测、阈值处理、直方图均衡化、伽马校正等
- 历史数据管理:日期查询、范围筛选、趋势图表可视化
| 等级 | 红色着色度 | 果径 | 损伤面积 |
|---|---|---|---|
| 一级 | >= 0.80 | >= 7 | 无损伤 |
| 二级 | 0.55 ~ 0.80 | 5 ~ 7 | <= 1 |
| 三级 | 其余情况 | — | — |
| 类别 | 技术 |
|---|---|
| GUI 框架 | PyQt5 |
| 目标检测 | YOLOv5s (PyTorch) |
| 图像处理 | OpenCV, NumPy |
| 图像增强 | Retinex (SSR / MSR / MSRCR / MSRCP) |
| 数据库 | SQLite(主用)/ MySQL(备选) |
| 数据可视化 | Matplotlib |
| 数据导出 | openpyxl (Excel) |
fruit_classify/
├── main.py # 程序入口
├── config.py # 全局配置(路径、算法参数)
├── requirements.txt # Python 依赖清单
│
├── gui/ # GUI 界面层
│ ├── main_window.py # 主窗口(摄像头检测 + 操作面板)
│ ├── graphics_view.py # 图像显示控件(缩放/拖拽/另存为)
│ ├── tree_view.py # 文件系统树(双击加载图片)
│ ├── list_widgets.py # 操作列表控件(拖拽排序)
│ ├── list_widget_items.py # 图像操作项(灰度/滤波/边缘检测等)
│ ├── stacked_widget.py # 参数面板堆叠切换
│ ├── table_widget.py # 参数表格(SpinBox/ComboBox)
│ ├── database_viewer.py # 历史数据查看器(日历/图表)
│ ├── item_config.py # 操作项 ↔ 参数表格映射
│ └── flags.py # OpenCV 操作常量
│
├── processing/ # 图像处理核心
│ ├── pipeline.py # 完整检测流水线(分析→分级→入库)
│ ├── functions.py # 核心算法(果径/颜色/损伤检测)
│ ├── enhance.py # Retinex 图像增强算法库
│ └── auto_grab.py # 自动抓拍判断逻辑
│
├── models/ # 模型文件
│ ├── best.pt # 自定义微调权重
│ └── yolov5s.pt # YOLOv5s 预训练权重
│
├── resources/ # 静态资源
│ ├── icons/ # 界面图标
│ ├── styles/style.qss # Qt 样式表
│ └── reference/ # 参考图片
│
├── data/ # 数据文件
│ ├── database.db # SQLite 检测记录数据库
│ └── output/ # Excel 导出目录
│
├── tests/ # 测试脚本
│ ├── batch_test.py # 批量图片处理并导出 Excel
│ ├── generate_test_data.py # 生成随机测试数据
│ └── camera_test.py # 检测可用摄像头
│
└── tools/ # 工具脚本
├── install_deps.py # 依赖自动安装
└── mysql_viewer.py # MySQL 数据查看器(可选)
部署说明:本项目最终部署在 树莓派(Raspberry Pi) 平台上,配合外接摄像头、电机、传送带硬件使用。以下安装步骤仅供参考,不建议直接在本地电脑上运行,部分硬件相关功能(如实时摄像头检测、自动抓拍)需要在实际部署环境中才能正常工作。
- Python >= 3.8
- 树莓派(推荐 Raspberry Pi 4B 及以上)或兼容的 Linux 开发板
- USB 摄像头(用于实时检测)
# 克隆项目
git clone <repository-url>
cd fruit_classify
# 安装依赖
pip install -r requirements.txt
# 或使用自动安装工具
python -m tools.install_deps# 启动主程序
python main.py- 启动程序后,点击 「实时监测」 按钮开启摄像头
- YOLOv5 自动检测画面中的水果,检测框实时显示
- 当苹果完全进入画面后,系统自动抓拍并分析
- 界面工具栏实时显示 红色着色度 / 果径 / 损伤面积 / 分级结果
- 检测结果自动写入 SQLite 数据库
- 点击 「检测历史记录」 可按日期查询和查看趋势图
# 批量处理图片并导出 Excel
python -m tests.batch_test <图片文件夹路径> <输出Excel路径>
# 生成测试数据(默认 5000 条)
python -m tests.generate_test_data 5000
# 检测系统可用摄像头
python -m tests.camera_test
# MySQL 数据查看器(需额外安装 mysql-connector-python)
python -m tools.mysql_viewer --host 192.168.1.100 --user root --password xxx --database db_2024系统采用 MSRCP(Multi-Scale Retinex with Chromaticity Preservation) 算法进行图像预处理,核心原理:
- 对图像三通道计算平均亮度
- 在多个尺度(sigma = 15, 80, 200)上执行 Single Scale Retinex
- 加权求均值得到 Multi-Scale Retinex 结果
- 通过色彩保持映射还原到 RGB 空间
该算法能有效消除光照不均的影响,增强苹果表面颜色特征,提升后续 HSV 颜色分析的准确性。
将增强后的图像转换到 HSV 色彩空间,通过预定义的颜色区间掩膜计算各色域面积:
| 颜色类别 | H 范围 | 用途 |
|---|---|---|
| 橙红色 | 0° ~ 10° | 红色着色度计算 |
| 纯红色 | 0° ~ 5°, 175° ~ 180° | 红色着色度计算 |
| 深红色 | 150° ~ 180° | 红色着色度计算 |
| 黄色 | 20° ~ 40° | 背景区域 |
| 黑色 | V < 70 | 损伤区域检测 |
红色着色度 = 红色区域面积 / (红色 + 黄色 + 黑色) 总面积
- MSRCP 增强 → 灰度化 → 高斯模糊
- 轮廓检测(RETR_EXTERNAL)
- 提取最大轮廓 → 计算最小外接圆半径
- 像素半径按标定比例转换为实际尺寸(cm)
部署说明所有可调参数集中在 config.py 中:
| 参数 | 默认值 | 说明 |
|---|---|---|
DETECTION_AREA_THRESHOLD |
0.755 | YOLOv5 检测框占画面比例阈值 |
RETINEX_SIGMA_LIST |
[15, 80, 200] | 多尺度 Retinex 的 sigma 值 |
RETINEX_LOW_CLIP |
0.01 | 自动色阶下限裁剪比例 |
RETINEX_HIGH_CLIP |
0.99 | 自动色阶上限裁剪比例 |
PIXEL_TO_CM |
1/50 | 像素到厘米的换算系数 |
PIXEL_AREA_TO_CM2 |
1/50625 | 像素面积到平方厘米的换算系数 |
注意:
PIXEL_TO_CM和PIXEL_AREA_TO_CM2需根据实际拍摄距离和镜头参数进行标定。
SQLite 数据库 data/database.db 中的 data 表:
| 字段 | 类型 | 说明 |
|---|---|---|
| r | TEXT | 果径(像素半径) |
| red_area | INTEGER | 红色区域面积(px) |
| yellow_area | INTEGER | 黄色区域面积(px) |
| black_area | INTEGER | 黑色/损伤区域面积(px) |
| red | TEXT | 红色着色度(0~1) |
| class | INTEGER | 分级结果(1/2/3) |
| date | TEXT | 检测日期(yyyy-MM-dd) |
本项目仅供学习与研究使用。