使用OpenCV与PySide(PyQt)的视觉检测小项目练习

        OpenCV 提供了丰富的图像处理和计算机视觉功能,可以实现各种复杂的图像处理任务,如目标检测、人脸识别、图像分割等。

        PyQt(或PySide)是一个创建GUI应用程序的工具包,它是Python编程语言和Qt库的成功融合。Qt库是最强大的GUI库之一。Qt的快速界面编辑工具Qt Designer提供了直观的可视化界面设计环境,通过拖拽和放置控件来设计界面,简化了界面设计的过程。PyQt提供了丰富的控件库,同时支持多种媒体文件的展示。尤其是PyQt的信号与槽的刷新机制提供了高效和可靠的信号响应机制。

        下面以一个实际的项目搭建过程为demo,尝试联合使用以上两个库,力争各尽所长。原则上,前端的界面显示和操作交给PySide,后台的图像处理交给OpenCV。

这是一个显微拍照画面内的轮廓识别和尺寸测量、数量统计项目。

一、显示界面框架搭建

1、主界面

主界面利用Qt Designer 制作,命名为main_window.ui并保存。

 主按钮站:

应该达到的运行效果:

2、主界面的按钮

 按钮有两种:

第一种是“点动”式的,图标为双状态,例如“新建项目”按钮。其样式表为:

第二种是“翻转“式的,每点击一次状态反转,即:可以反转”checked“状态。按钮图标为三个状态,例如“局部放大”按钮。其样式表为: 

 这种按钮,自定义了一个特性:activated来取代系统自带的checked,当这个特性activated="true"时,改变按钮的背景色。当然也可以使用系统自带的checked特性来实现同样的功能,这里的目的主要是练习一下 按钮的自定义特性的应用。

使用系统自带的checked特性:

两种方法在显示上的微妙差别如下:左边是自定义特性的,右边是使用系统自带的checked特性来实现的。区别在于系统自带的checked特性显示的边框是pressed,即按下时的边框特性。

3、阶梯渐变的色条

主界面的颜色样例条,自定义脚本,命名为GradientLabel.py:

from PySide6.QtGui import QPainter, QColor, QLinearGradient
from PySide6.QtWidgets import QMainWindow, QLabel, QVBoxLayout, QWidget
from PySide6.QtCore import Qtclass GradientLabel(QLabel):# 定义颜色def def_colors(self, begin_color, mid_color, end_color):self.begin_color = begin_colorself.mid_color = mid_colorself.end_color = end_color# 重新定义绘画事件def paintEvent(self, event):painter = QPainter(self)painter.setRenderHint(QPainter.Antialiasing)gradient = QLinearGradient(0, 0, 0, self.height())gradient.setColorAt(1, self.end_color)gradient.setColorAt(0.5, self.mid_color)gradient.setColorAt(0, self.begin_color)painter.fillRect(self.rect(), gradient)class MyMainWindow(QMainWindow):def __init__(self):super().__init__()central_widget = QWidget(self)self.setCentralWidget(central_widget)layout = QVBoxLayout(central_widget)gradient_label = GradientLabel(self)begin = QColor(255, 100, 0)mid = QColor(8, 180, 8)end = QColor(80, 80, 255)gradient_label.def_colors(begin, mid, end)gradient_label.setAlignment(Qt.AlignCenter)layout.addWidget(gradient_label)self.setWindowTitle("Gradient Label Example")if __name__ == "__main__":import sysfrom PySide6.QtWidgets import QApplicationapp = QApplication(sys.argv)window = MyMainWindow()window.show()sys.exit(app.exec())

 运行效果:

 将自定义脚本保存在主程序脚本同目录,并在Qt Designer 将颜色样例条”提升为“该自定义脚本。

4、图像显示区的自定义脚本

 这是一个QLabel,其显示的内容为QPixmap。脚本逐步再完善。

二、主程序脚本框架搭建 

1、目录结构:

 JSON:存放json文件

MEDIA:存放媒体文件

PROJECT:工程文件

PYS:存放脚本

SRC:按钮图标等源文件

UIS:存放显示界面文件

2、编写初步的主程序框架:

 首先要使用pyuic和pyrcc工具将图像资源转换成py文件并与主程序脚本放置在同一文件夹下,然后编写主程序脚本:

# 这是一个图像处理小应用的示例脚本。# encoding: utf-8
import json
import sysfrom PySide6.QtCore import QObject
from PySide6.QtWidgets import QApplication, QMainWindowimport main_window_rc  # 导入主画面# 定义主窗口
class MainWindow(QMainWindow, main_window_rc.Ui_MainWindow):def __init__(self):super().__init__()# ################公用的作业函数#############################
class Jobs:@staticmethod# 读取JSON文件,分配参数def read_json():with open('../JSON/setting.json', 'r', encoding='utf-8') as file_json:ui.json_data = json.load(file_json)ui.settings = ui.json_data['setting']  # 项目参数的定义@staticmethod# 系统的初始化def start_todo():pass# 退出前的操作@staticmethoddef before_quit():with open('../JSON/setting.json', 'w') as file:  # 保存json文件json.dump(ui.json_data, file, indent=4)# ################图像处理的过程函数#############################
def Image_processing(steps):for step in steps:# 系统的初始化if step == 'start':pass# step0,步骤0if step == 0:passcontinue# step1,步骤1if step == 1:passcontinue# step2,步骤2if step == 2:passcontinue# ###########################信号的连接和槽函数####################################
def signal_slot():# #####################主窗口的信号和槽####################################pass# #############################主程序###################################
if __name__ == '__main__':app = QApplication(sys.argv)# #######################项目级别的定义###################################class UI(QObject):  # 将项目定义为QObject,用来管理项目级别的信号和变量# ###########__init__###############def __init__(self):super().__init__()# ########################本项目的实例化###################################ui = UI()  # 项目实例化# ########################实例化画面#################################window1 = MainWindow()  # 主画面实例化window1.show()  # 显示画面window1.setupUi(window1)  # 画面初始化Jobs.start_todo()  # 系统初始化signal_slot()  # 信号与槽的定义app.aboutToQuit.connect(Jobs.before_quit)  # 退出系统之前的操作sys.exit(app.exec())

 本阶段运行截图:

 持续更新,直至完成。

感兴趣的朋友可以向我索要源文件并参与项目的共同学习和完善,同时也特别期待大神高手的指点和批评!

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

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

相关文章

【开放集目标检测】Grounding DINO

一、引言 论文: Grounding DINO: Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection 作者: IDEA 代码: Grounding DINO 注意: 该算法是在Swin Transformer、Deformable DETR、DINO基础上…

逆变器学习笔记(三)

DCDC电源芯片外围器件选型_dcdc的comp补偿-CSDN博客、 1.芯片的COMP引脚通常用于补偿网络: 芯片的COMP引脚通常用于补偿网络,在控制环路中发挥重要作用。COMP引脚接电容和电阻串联接地,主要是为了稳定控制环路、调整环路响应速度和滤波噪声…

Java 变量命名规则

在Java中,变量命名是一种重要的编码规范,良好的命名可以提高代码的可读性和维护性。以下是Java变量命名的规则和建议: ### Java变量命名规则: 1. **合法字符**: - 变量名可以包含字母、数字、美元符号 $ 和下划线…

java Lock接口

在 Java 中,Lock 接口的实现类ReentrantLock 类提供了比使用 synchronized 方法和代码块更广泛的锁定机制。 简单示例: import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExampl…

Kappa架构

1.Kappa架构介绍 Kappa架构由Jay Kreps提出,不同于Lambda同时计算和批计算并合并视图,Kappa只会通过流计算一条的数据链路计算并产生视图。Kappa同样采用了重新处理事件的原则,对于历史数据分析类的需求,Kappa要求数据的长期存储能…

关闭vue3中脑瘫的ESLine

在创建vue3的时候脑子一抽选了ESLine,然后这傻卵子ESLine老是给我报错 博主用的idea开发前端 ,纯粹是用不惯vscode 关闭idea中的ESLine,这个只是取消红色波浪线, 界面中的显示 第二步,在vue.config.js中添加 lintOnSave: false 到这里就ok了,其他的我试过了一点用没有

阿里云 OSS - 开通到使用、服务端签名直传(前后端代码 + 效果演示)

目录 开始 OSS 相关术语须知 阿里云 OSS 开通 阿里云 OSS 使用 官方文档教程 实战开发 阿里云 OSS 自动配置 环境配置 实战开发 服务端签名直传 概述 代码实现 开始 OSS 相关术语须知 中文 英文 说明 存储空间 Bucket 存储空间是您用于存储对象(Ob…

C语言高阶技术点详解:深入理解位操作

位操作是C语言中一项强大的特性,它允许我们直接在二进制层面上操作数据。位操作在底层编程、加密、数据压缩和性能优化等领域有着广泛的应用。本文将详细探讨C语言中的位操作,结合代码案例,为你揭示背后的技术原理,帮助你更深入地…

使用cgroup对pgsql进行分库资源限制

系统:Centos7 pg版本:14.11 自建pgsql14中有很多个库,一个库对应一个租户,偶尔会出现单个租户执行慢sql影响全局的问题,目前官方也没有比较合适的处理方案或者插件 解决方案: 因为pgsql是多进程应用&…

DB-GPT-PaperReading

DB-GPT: Empowering Database Interactions with Private Large Language Models 1. 基本介绍 DB-GPT 旨在理解自然语言查询,提供上下文感知响应,并生成高精度的复杂 SQL 查询,使其成为从新手到专家的用户不可或缺的工具。DB-GPT 的核心创新在于其私有 LLM 技术,该技术在…

FL Studio 2024 发布,添加 FL Cloud 插件、AI 等功能

作为今年最受期待的音乐制作 DAW 更新之一,FL Studio 2024发布引入了新功能,同时采用了新的命名方式,从现在起将把发布年份纳入其名称中。DAW 的新增功能包括在 FL Cloud 中添加插件、AI 驱动的音乐创作工具和 FL Studio 的新效果。 FL Cloud…

ThinkPHP定时任务是怎样实现的?

接到一个需求:定时检查设备信息,2分钟没有心跳的机器,推送消息给相关人员,用thinkphp5框架,利用框架自带的任务功能与crontab配合来完成定时任务。 第一步:分析需求 先写获取设备信息,2分钟之…

力扣双指针算法题目:快乐数

目录 1.题目 2.思路解析 3.代码展示 1.题目 . - 力扣(LeetCode) 2.思路解析 题目意思是将一个正整数上面的每一位拿出来,然后分别求平方,最后将这些数字的平方求和得到一个数字,如此循环,如果在此循环中…

【做一道算一道】和为 K 的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2 示例 2: 输入:nums [1,2,3],…

前端面试题8

基础知识 解释一下什么是跨域问题,以及如何解决? 跨域问题是由于浏览器的同源策略限制了从一个源加载的网页脚本访问另一个源的数据。解决方法包括使用JSONP、CORS(跨源资源共享)、设置代理服务器等。 描述一下事件冒泡和事件捕获…

Flutter-实现悬浮分组列表

在本篇博客中,我们将介绍如何使用 Flutter 实现一个带有分组列表的应用程序。我们将通过 CustomScrollView 和 Sliver 组件来实现该功能。 需求 我们需要实现一个分组列表,分组包含固定的标题和若干个列表项。具体分组如下: 水果动物职业菜…

BigDecimal(double)和BigDecimal(String)有什么区别?BigDecimal如何精确计数?

BigDecimal(double)和BigDecimal(String)的区别 double是不精确的,所以使用一个不精确的数字来创建BigDecimal,得到的数字也是不精确的。如0.1这个数字,double只能表示他的近似值。所以,当我们使用new BigDecimal(0.1)创建一个Bi…

【Academy】DOM-based vulnerabilities 基于DOM的漏洞

基于DOM的漏洞 1.基于DOM的漏洞2.什么是DOM?3.污染流漏洞3.1什么是污染流?源接收器 3.2常见源 4.哪些接收器会导致基于DOM的漏洞?基于DOM的开放重定向基于DOM的cookie操作基于DOM的JavaScript注入基于DOM的文档域操作基于DOM的WebSocket-URL中…

golang验证Etherscan上的智能合约

文章目录 golang验证Etherscan上的智能合约为什么要验证智能合约如何使用golang去验证合约获取EtherscanAPI密钥Verify Source Code接口Check Source Code Verification Status接口演示示例及注意事项网络问题无法调用Etherscan接口(最重要的步骤) golan…

归并排序的实现(递归与非递归)

概念 基本思想:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使…