【Python】瓶装液位检测系统

news2024/12/26 15:17:30

文章目录

    • 概要
    • 效果图
    • 整体架构流程
    • 技术细节

概要

本代码是一个简单的GUI应用程序,用于瓶装液位检测系统。

效果图

在这里插入图片描述
在这里插入图片描述

整体架构流程

整体架构流程如下:

  1. 创建GUI窗口和必要的部件:

    • 创建一个主窗口(root)作为GUI应用程序的容器。
    • 设置窗口的大小和标题。
    • 创建用于显示图像的Label部件(img_label)。
    • 创建用于显示检测结果的Label部件(result_label)。
    • 创建用于加载图片的按钮(load_button)。
    • 创建用于执行液位检测的按钮(detect_button)。
  2. 加载图片:

    • 当用户点击"加载图片"按钮时,触发load_image()函数。
    • 在函数中,使用文件对话框选择一个瓶子的图片文件。
    • 如果选择了文件,则读取图片,将其从BGR颜色空间转换为RGB颜色空间,并将其显示在GUI窗口中。
  3. 液位检测:

    • 当用户点击"液位检测"按钮时,触发detect_liquid()函数。
    • 在函数中,首先将图像转换为灰度图像。
    • 对灰度图像进行二值化处理,得到黑白二值图像。
    • 使用轮廓检测函数找到图像中的轮廓。
    • 找到最大的轮廓,表示瓶子的轮廓。
    • 计算轮廓的面积和外接矩形的面积。
    • 根据面积比例判断液位是否充足,并更新检测结果的文本显示。
  4. 运行GUI应用程序:

    • 调用root.mainloop()函数,启动GUI应用程序的主循环。
    • 程序将等待用户交互事件,如按钮点击或窗口关闭事件。

用户可以通过点击"加载图片"按钮选择一张瓶子的图片,然后点击"液位检测"按钮进行液位检测。检测结果将显示在GUI窗口中的检测结果区域。整体架构流程使用户能够方便地加载图片并执行液位检测操作,并即时显示结果。

技术细节

  1. 导入必要的模块:

    • cv2:OpenCV库,用于图像处理和计算机视觉任务。
    • numpy:用于数值计算和数组操作。
    • tkinter:Python的标准GUI库,用于创建GUI应用程序。
    • filedialog:tkinter的子模块,用于打开文件对话框选择图片文件。
    • PIL:Python Imaging Library,用于图像处理和操作。
  2. 创建GUI窗口:

    • 创建一个名为root的Tk对象,作为主窗口。
    • 设置窗口的大小为800x600像素。
    • 设置窗口的标题为"瓶装液位检测系统"。
  3. 图像显示区域:

    • 创建一个Label部件,用于显示图像。
    • 将该部件放置在窗口的左侧。
  4. 检测结果显示区域:

    • 创建一个Label部件,用于显示检测结果的文本。
  5. 加载图片并显示:

    • 定义一个load_image()函数,用于加载并显示图片。
    • 在函数中,通过文件对话框(filedialog)选择一个图片文件。
    • 如果选择了文件,则使用OpenCV的imread()函数读取图片。
    • 将读取的图片从BGR颜色空间转换为RGB颜色空间。
    • 使用PIL库的Image.fromarray()函数将图像转换为PIL图像对象。
    • 使用PIL库的ImageTk.PhotoImage()函数将PIL图像对象转换为可显示的图像对象。
    • 通过配置img_label部件的image属性,将图像显示在GUI窗口中。
  6. 液位检测:

    • 定义一个detect_liquid()函数,用于执行液位检测。
    • 在函数中,首先将图像转换为灰度图像。
    • 然后对灰度图像进行二值化处理,将图像转换为黑白二值图像。
    • 使用OpenCV的findContours()函数找到图像中的轮廓。
    • 找到最大的轮廓,即代表瓶子的轮廓。
    • 计算轮廓的面积和外接矩形的面积。
    • 根据面积比例判断液位是否充足,并更新检测结果的文本。
  7. 加载图片按钮:

    • 创建一个Button部件,用于触发加载图片的操作。
    • 按钮上显示的文本为"加载图片"。
    • 按钮点击后执行load_image()函数。
  8. 液位检测按钮:

    • 创建一个Button部件,用于触发液位检测的操作。
    • 按钮上显示的文本为"液位检测"。
    • 按钮点击后执行detect_liquid()函数。
  9. 运行GUI应用程序:

    • 调用root.mainloop()函数,启动GUI应用程序的主循环,等待用户交互事件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/740996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享一套开源充电桩云平台(v2.5.1)-- 支持二轮(电动自行车)、四轮(电动汽车)

开源充电桩云平台(v2.5.1) 支持二轮(电动自行车)、四轮(电动汽车) 后台体验地址 二轮后台体验地址,star star : 点我访问 四轮后台体验地址,star star : 点我访问 用户端二维码 公众号二维码 小程序二维…

攻防世界-WEB2

代码审计 首先进行代码审计 <?php $miwen"a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";function encode($str){$_ostrrev($str);// echo $_o;for($_00;$_0<strlen($_o);$_0){$_csubstr($_o,$_0,1);$__ord($_c)1;$_cchr($__);$_$_.$_c; …

2023- itwangyang - mac mysql 终端启动命令

在mac上使用mysql终端进行操作时&#xff0c;需要先启动mysql服务。以下是启动mysql服务的命令&#xff1a; sudo /usr/local/mysql/support-files/mysql.server start执行该命令后&#xff0c;会出现一些提示信息&#xff0c;等待一段时间后mysql服务就启动成功了。 接下来&…

【Java】面向对象基础 之 继承

一、继承 在前面的章节中&#xff0c;我们已经定义了Person类&#xff1a; class Person {private String name;private int age;public String getName() {...}public void setName(String name) {...}public int getAge() {...}public void setAge(int age) {...} }现在&am…

git报错:remote: Access denied (URL 403)

git报错&#xff1a;remote: Access denied fatal: unable to access ‘ https:/ /gitee. cohe requested URL 403 大概的原因&#xff0c;是之前更改了 可能因为我之前在git bash中配过ssh&#xff0c;系统已经将指向git的用户设置了别的位置&#xff0c;所以…

DAY44:动态规划(四)整数拆分(递归+DP递推都可以做,注意区别和理解)

文章目录 343.整数拆分思路1&#xff1a;递归法&#xff08;最直观的想法&#xff09;递归思路普通递归写法注意点&#xff1a;max的嵌套普通递归存在的问题 记忆化搜索递归写法时间复杂度 递归解法总结 思路2&#xff1a;动态规划&#xff08;注意递推的理解&#xff09;确认D…

Transformer 模型详解

Transformer模型 https://blog.csdn.net/m0_67084346/article/details/128138486 https://blog.csdn.net/benzhujie1245com/article/details/117173090 2017 年&#xff0c;Google 在论文 Attention is All you need 中提出了 Transformer 模型&#xff0c;其使用 Self-Atten…

一个SpringMVC的小项目

一个图书管理小项目&#xff1a; 定义对应的表结构&#xff0c;为了学习所以才添加大量的 SQL 规则&#xff0c;要记得针对货币的处理方案 create table if not exists tbl_books( id bigint primary key auto_increment,book_name varchar(32) not null,book_price numeric(8…

专业的PDF文件压缩工具推荐,让你的PDF文件轻松压缩

​在参加专业的比赛时&#xff0c;就需要用到pdf文件&#xff0c;如果pdf文件过大操作和分享起来就特别不方便&#xff0c;其实可以使用专业的pdf文件压缩工具来处理。今天就分享一款pdf在线压缩工具&#xff0c;通过浏览器就可以快速完成pdf压缩&#xff08;https://www.yasuo…

SQL22 统计每个学校的答过题的用户的平均答题数

SELECT university,COUNT(qt.question_id)/COUNT(distinct(qt.device_id)) avg_answer_cnt FROM question_practice_detail qt LEFT JOIN user_profile ut ON qt.device_idut.device_id GROUP BY university

使用Word轻松实现PDF转Word

以前WPS还能通过每天打卡白嫖会员&#xff0c;最近不行了&#xff0c;害&#xff0c;羊毛没了 现在重新回归Word&#xff0c;利用Word就可以将PDF转化为Word 一、通过Word新建一个Word文档并打开 二、点击 文件 —> 打开 三、浏览&#xff0c;找到要转的PDF 四、点击确定&…

基础篇--初识STM32

初识STM32 STM32是什么 ST&#xff1a;意法半导体 M&#xff1a;MCU/MPU32:32位 ST累计推出了&#xff1a;5大类、18个系列、1000多个型号的Cortex内核微控制器 STM32芯片分类 ST中文社区网&#xff1a;https://www.stmcu.org.cn/ ST官网&#xff1a;https://www.st.com …

4.5Java EEMyBatis缓存机制

一、 一级缓存 MyBatis的一级缓存级别 MyBatis的一级缓存是SqlSession级别的缓存。如果同一个SqlSession对象多次执行完全相同的SQL语句时&#xff0c;在第一次执行完成后&#xff0c;MyBatis会将查询结果写入到一级缓存中&#xff0c;此后&#xff0c;如果程序没有执行插入、…

Mysql (insert,update操作)

1.创建表&#xff1a; 创建员工表employee&#xff0c;字段如下&#xff1a; id&#xff08;员工编号&#xff09;&#xff0c;name&#xff08;员工名字&#xff09;&#xff0c;gender&#xff08;员工性别&#xff09;&#xff0c;salary&#xff08;员工薪资&#xff09; …

脚踏Java知识点

对上节Java的基础语法续讲 三元运算符和if语句格式的区别 语法格式&#xff1a; 三元运算符的语法格式是&#xff1a;(condition) ? expression1 : expression2&#xff1b; if语句的语法格式是&#xff1a; if (condition) { // 执行 expression1 } else { // 执行 express…

Stage模型HarmonyOS服务卡片开发整体说明

服务卡片&#xff08;以下简称“卡片”&#xff09;是一种界面展示形式&#xff0c;可以将应用的重要信息或操作前置到卡片&#xff0c;以达到服务直达、减少体验层级的目的。卡片常用于嵌入到其他应用&#xff08;当前卡片使用方只支持系统应用&#xff0c;如桌面&#xff09;…

cyclo(Ser-Ser),23409-30-5,环(L-丝氨酰基-L-丝氨酰),具有明确的生物活性

​资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 产品描述&#xff1a; cyclo(Ser-Ser)&#xff08;CAS号&#xff1a;23409-30-5&#xff09;&#xff0c;环二肽(2,5-哌嗪二酮)是Z小的环肽&#xff0c;许多天然环二肽化合物都具有明确的生物活性&#xff0c;例如作为抗…

什么是矢量数据库?

我们正处于人工智能革命之中。它颠覆了它所接触的任何行业&#xff0c;承诺了伟大的创新 – 但它也带来了新的挑战。对于涉及大型语言模型、生成式 AI 和语义搜索的应用程序&#xff0c;高效的数据处理变得比以往任何时候都更加重要。 所有这些新应用程序都依赖于向量嵌入&…

【Android Framework系列】5章 AMS启动流程

1 AMS简介 AMS&#xff08;Activity Manager Service&#xff09;是Android中最核心的服务&#xff0c;管理着四大组件的启动、切换、调度及应用进程的管理和调度等工作。AndroidQ将Activity移到了ActivityTaskManagerService中&#xff0c;但也和AMS相关联。 AMS通过使用一些…

3.元素的显示与隐藏

类似网站广告, 当我们点击关闭就不见了, 但是我们重新刷新页面, 会重新出现! 本质:让一个元素在页面中隐藏或者显示出来。 display显示隐藏&#xff0c;不保留原来的位置visibility 显示隐藏&#xff0c;保留原来的位置overflow 溢出显示隐藏&#xff0c;只对溢出的部分进行处…