基于yolov8+pyqt5实现的水尺图像识别与水深计算系统

这个水尺检测项目的算法思路如下:

核心算法流程

1. 水面线检测

  • 使用 YOLO 模型 waterline.pt 检测图像中的水面线位置
  • 取检测框的中心 Y 坐标作为水面线高度 water_y
  • 在结果图上用红色框标注水面线区域

2. 刻度数字识别

  • 使用 YOLO 模型 best.pt 检测水尺上的数字(0-9)和辅助刻度"E"(代表5cm)
  • 采用多尺度 ROI 策略
    • 先尝试以水面线为中心,使用不同高度(400, 800, 1200, 1600, 2000像素)的ROI区域进行检测
    • 当检测到至少2个主数字时停止
    • 如果都失败,则对全图进行检测

3. 锚点提取与分类

python 复制代码
主数字 (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        # 项目依赖

🔧 安装依赖

bash 复制代码
pip install -r requirements.txt

或手动安装:

bash 复制代码
pip install ultralytics opencv-python matplotlib numpy PyQt5

🚀 使用方法

方式一:图形界面(推荐)

运行 PyQt5 图形界面程序:

bash 复制代码
python gui.py

界面操作步骤:

  1. 点击「上传图片」按钮选择水尺图片
  2. 点击「开始检测」按钮进行自动分析
  3. 查看检测结果和可视化标注
  4. 点击「保存结果」按钮保存检测图片

方式二:命令行版本

  1. 将待处理的水尺图片路径填写在 main.pyIMAGE_PATH 变量中:

    python 复制代码
    IMAGE_PATH = "demoImage/demo.jpg"
  2. 运行主程序:

    bash 复制代码
    python main.py
  3. 终端将输出推算结果并展示标注图像。

📊 检测效果

系统会自动:

  • 用红色框标注检测到的水面线
  • 用绿色圆点标注识别到的刻度数字位置
  • 在图像左上角显示计算出的水深值
  • 在左侧面板显示精确的水深数值(单位:cm)

⚠️ 注意事项

  • 图片需包含完整的水尺主数字区域和水面线,且图像尽量清晰
  • 如果图像中的主数字不足 2 个,将无法进行插值计算
  • 首次运行时会自动加载 YOLO 模型,可能需要几秒钟时间
  • 模型文件需要提前训练或从提供渠道获取
相关推荐
小碗羊肉34 分钟前
【从零开始学Java | 第十八篇】BigInteger
java·开发语言·新手入门
宵时待雨36 分钟前
C++笔记归纳14:AVL树
开发语言·数据结构·c++·笔记·算法
执笔画流年呀1 小时前
PriorityQueue(堆)续集
java·开发语言
山川行1 小时前
关于《项目C语言》专栏的总结
c语言·开发语言·数据结构·vscode·python·算法·visual studio code
呜喵王阿尔萨斯1 小时前
C and C++ code
c语言·开发语言·c++
左左右右左右摇晃1 小时前
JDK 1.7 ConcurrentHashMap——分段锁
java·开发语言·笔记
xcLeigh1 小时前
Python入门:Python3基础练习题详解,从入门到熟练的 25 个实例(六)
开发语言·python·教程·python3·练习题
烤麻辣烫1 小时前
I/O流 基础流
java·开发语言·学习·intellij-idea
我命由我123451 小时前
React - BrowserRouter 与 HashRouter、push 模式与 replace 模式、编程式导航、withRouter
开发语言·前端·javascript·react.js·前端框架·html·ecmascript
Yvonne爱编码1 小时前
Java 中的 hashCode () 与 equals () 核心原理、契约规范、重写实践与面试全解
java·开发语言·数据结构·python·hash