注意这个源码不提供训练的数据集,由于是参考开源代码,因此也不能提供更多测试图片
这个水尺检测项目的算法思路如下:
核心算法流程
1. 水面线检测
- 使用 YOLO 模型
waterline.pt 检测图像中的水面线位置 - 取检测框的中心 Y 坐标作为水面线高度
water_y - 在结果图上用红色框标注水面线区域
2. 刻度数字识别
- 使用 YOLO 模型
best.pt 检测水尺上的数字(0-9)和辅助刻度"E"(代表5cm) - 采用 多尺度 ROI 策略 :
- 先尝试以水面线为中心,使用不同高度(400, 800, 1200, 1600, 2000像素)的ROI区域进行检测
- 当检测到至少2个主数字时停止
- 如果都失败,则对全图进行检测
3. 锚点提取与分类
主数字 (0-9) → 转换为实际刻度值:数字 × 10 cm
辅助刻度 "E" → 转换为 5 cm
记录每个锚点的 (刻度值, y坐标)
4. 水深计算(线性插值/外推)
插值计算 (水面线在两锚点之间):
depth = v0 + (v1 - v0) × (water_y - y0) / (y1 - y0)
外推计算 (水面线在锚点范围外):
- 上方外推:利用前两个锚点计算每像素代表的cm值,向上推算
- 下方外推:利用最后两个锚点计算每像素代表的cm值,向下推算
5.可视化输出
- 绿色圆点标注识别的刻度位置
- 红色框标注水面线
- 左上角显示计算的水深值
算法优势
- 自适应ROI :多尺度尝试提高数字检测成功率
- 容错机制 :主数字不足时可用"E"辅助刻度补充
- 高精度 :线性插值保证±1cm误差范围
效果展示

水尺图像识别与水深计算系统
该项目基于YOLOv8实现图像中水尺的识别和水深推算,支持对静态水尺图片进行自动检测和测深,可应用于智能水文监测系统。系统提供美观的 PyQt5 图形界面,操作简便直观。
🌊 项目功能
- 图形化界面 :基于 PyQt5 设计的现代化交互界面
- 图片上传 :支持选择本地水尺图片进行检测
- 自动识别 :自动检测图像中的水面线(基于
waterline.pt 模型) - 刻度识别 :检测水尺上的主数字(0-9)及其垂直位置(基于
best.pt 模型) - 智能计算 :结合水面线位置,进行水深值的插值或外推计算
- 结果可视化 :实时显示检测结果和标注图像
- 结果保存 :支持将检测结果保存为图片文件
- 高精度 :最大误差控制在 ±1 cm 内
🛠️ 技术栈
- Python 3.x
- Ultralytics
- PyQt5
- OpenCV
- Matplotlib
- NumPy
📁 项目结构
.
├── gui.py # PyQt5 图形界面程序(推荐)
├── main.py # 命令行版本主程序
├── waterline.pt # 训练好的水面线识别模型
├── train8/weights/best.pt # 训练好的数字+E刻度识别模型
├── demoImage/ # 示例图片文件夹
└── requirements.txt # 项目依赖
🔧 安装依赖
pip install -r requirements.txt
或手动安装:
pip install ultralytics opencv-python matplotlib numpy PyQt5
🚀使用方法
方式一:图形界面(推荐)
运行PyQt5图形界面程序:
python gui.py
界面操作步骤:
- 点击「上传图片」按钮选择水尺图片
- 点击「开始检测」按钮进行自动分析
- 查看检测结果和可视化标注
- 点击「保存结果」按钮保存检测图片
方式二:命令行版本
- 将待处理的水尺图片路径填写在
main.py 的 IMAGE_PATH 变量中:
IMAGE_PATH = "demoImage/demo.jpg"
- 运行主程序:
python main.py
- 终端将输出推算结果并展示标注图像。
📊 检测效果
系统会自动:
- 用红色框标注检测到的水面线
- 用绿色圆点标注识别到的刻度数字位置
- 在图像左上角显示计算出的水深值
- 在左侧面板显示精确的水深数值(单位:cm)
⚠️ 注意事项
- 图片需包含完整的水尺主数字区域和水面线,且图像尽量清晰
- 如果图像中的主数字不足 2 个,将无法进行插值计算
- 首次运行时会自动加载 YOLO 模型,可能需要几秒钟时间
- 模型文件需要提前训练或从提供渠道获取