PyQT5实现图像处理应用(含Windows7下完整打包方案)

目录

  • 1、任务概述
  • 2、环境安装
    • 2.1 创建虚拟环境
    • 2.2 安装依赖库
  • 3、程序开发
    • 3.1 框架搭建
    • 3.2 读取图像
    • 3.3 图像处理
  • 4、打包部署
  • 5、小结

1、任务概述

本篇博文将通过PyQT5来实现一个简单的图像处理应用,并完成打包部署。

本文开发平台:Windows10 64位系统。部署平台:Windows7 64位系统

具体实现效果如下:
在这里插入图片描述
由于PyQT依赖Python,因此在学习下面的章节前,请先安装好Python。本教程使用的Python版本为3.8.0(由于部署平台为Windows7,因此不能使用Python3.8以上版本)。

2、环境安装

2.1 创建虚拟环境

为方便后面打包部署,我们将相关Python的依赖库存放到虚拟环境中,因此需要先创建一个虚拟环境。

Windows平台下的虚拟环境需要使用第三方工具virtualenv来创建,打开命令终端,输入下面的命令即可完成安装:

pip install virtualenv -i https://mirror.baidu.com/pypi/simple

创建一个项目文件夹demo,我们现在的目标就是在这个demo项目中创建python虚拟环境,这个虚拟环境是专门为demo项目成立的。在命令行终端中通过cd命令进入项目目录中(假设demo文件夹位于D:\code目录下):

输入下面的命令用来创建名为venv的虚拟环境:

virtualenv env

这样我们就在demo文件夹下有了一个名为env的子文件夹,它保存了一个全新的虚拟环境,其中有一个私有的Python解释器位于demo/env/Scripts,在该虚拟环境中安装的python包会存放在demo/env/Lib路径下。

最后,在Windows平台下激活并使用该虚拟环境:

env\Scripts\activate

如下图所示:
在这里插入图片描述
成功激活之后,虚拟环境解释器的路径就被加入PATH中,但这种改变不是永久的,他只会影响当前的命令行终端。

2.2 安装依赖库

在虚拟环境中安装pyqt5和opencv:

pip install pyqt5 opencv-python -i https://mirror.baidu.com/pypi/simple

其中pyqt5用于开发界面程序,而opencv用于图像处理算法操作。

3、程序开发

3.1 框架搭建

在demo文件夹下面创建一个名为main.py的脚本,内容如下:

# -*- coding:utf-8 -*-
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QLabel, QFileDialog
from PyQt5.QtCore import QRect,QCoreApplication,Qt
from PyQt5.QtGui import QPixmap,QImageclass MainWindow(QMainWindow):def __init__(self, parent=None):super(MainWindow, self).__init__(parent)# 调整窗体self.resize(500, 300)  # 主窗体宽高设置self.setWindowTitle("示例程序")  # 主窗体名称# 创建2个图像标签self.preImgLabel = QLabel("", self)self.preImgLabel.setGeometry(QRect(30, 30, 200, 200))self.preImgLabel.setStyleSheet("background-color: rgb(232, 232, 232);")self.preImgLabel.setScaledContents(True)self.aftImgLabel = QLabel("", self)self.aftImgLabel.setGeometry(QRect(270, 30, 200, 200))self.aftImgLabel.setStyleSheet("background-color: rgb(232, 232, 232);")self.aftImgLabel.setScaledContents(True)# 创建2个按钮组件self.chooseBtn = QPushButton("选择图片", self)self.chooseBtn.clicked.connect(self.choosePic)self.chooseBtn.setGeometry(QRect(170, 250, 60, 30))self.processBtn = QPushButton("图片处理", self)self.processBtn.clicked.connect(self.imgProcess)self.processBtn.setGeometry(QRect(270, 250, 60, 30))self.imgName = ''def choosePic(self):"""选择图片"""passdef imgProcess(self):"""图片处理"""passself.aftImgLabel.setStyleSheet("border: 2px solid red")if __name__ == "__main__":"""程序主入口"""QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling) # 设置屏幕分辨率自适应app = QApplication(sys.argv)  # 创建应用main = MainWindow()  # 创建主窗体main.show()          # 显示主窗体sys.exit(app.exec()) # 进入主窗体生命周期

上述脚本创建了一个主窗体,包括2个label组件、2个按钮组件,同时对两个按钮组件创建了对应的槽函数choosePic和imgProcess。

运行该脚本,效果如下图所示:
在这里插入图片描述
可以看到,使用PySide6来开发界面程序非常简单,代码量很少。

3.2 读取图像

下面完善main.py文件的代码,单击选择图片按钮可以浏览本地计算机里的图像,并且将图像显示到左侧图像面板中。

具体的,只需要修改choosePic函数即可:

def choosePic(self):"""选择图片"""self.imgName, _ = QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")if self.imgName == '':returnpix = QPixmap(self.imgName)self.preImgLabel.setPixmap(pix)self.preImgLabel.setStyleSheet("border: 2px solid blue")

3.3 图像处理

这里我们将使用opencv完成图像gamma矫正,提升图像整体亮度,完整代码如下:

# -*- coding:utf-8 -*-
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QLabel, QFileDialog
from PyQt5.QtCore import QRect,QCoreApplication,Qt
from PyQt5.QtGui import QPixmap,QImage
import cv2
import numpy as npdef adjust_gamma(image, gamma=1.0):'''gamma矫正'''invGamma = 1.0 / gammatable = np.array([((i / 255.0) ** invGamma) * 255 for i in np.arange(0, 256)]).astype("uint8")return cv2.LUT(image, table)class MainWindow(QMainWindow):def __init__(self, parent=None):super(MainWindow, self).__init__(parent)# 调整窗体self.resize(500, 300)  # 主窗体宽高设置self.setWindowTitle("示例程序")  # 主窗体名称# 创建2个图像标签self.preImgLabel = QLabel("", self)self.preImgLabel.setGeometry(QRect(30, 30, 200, 200))self.preImgLabel.setStyleSheet("background-color: rgb(232, 232, 232);")self.preImgLabel.setScaledContents(True)self.aftImgLabel = QLabel("", self)self.aftImgLabel.setGeometry(QRect(270, 30, 200, 200))self.aftImgLabel.setStyleSheet("background-color: rgb(232, 232, 232);")self.aftImgLabel.setScaledContents(True)# 创建2个按钮组件self.chooseBtn = QPushButton("选择图片", self)self.chooseBtn.clicked.connect(self.choosePic)self.chooseBtn.setGeometry(QRect(170, 250, 60, 30))self.processBtn = QPushButton("图片处理", self)self.processBtn.clicked.connect(self.imgProcess)self.processBtn.setGeometry(QRect(270, 250, 60, 30))self.imgName = ''def choosePic(self):"""选择图片"""self.imgName, _ = QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")if self.imgName == '':returnpix = QPixmap(self.imgName)self.preImgLabel.setPixmap(pix)self.preImgLabel.setStyleSheet("border: 2px solid blue")def imgProcess(self):"""图片处理"""# 读取图像img = cv2.imread(self.imgName)  # OpenCV 读取图像if img is None:print('图像读取失败')return# gamma矫正img = adjust_gamma(img, gamma=1.8)# 转qt格式qtImg = QImage(img.data, img.shape[1], img.shape[0], QImage.Format_RGB888).rgbSwapped() self.aftImgLabel.setPixmap((QPixmap.fromImage(qtImg)))  self.aftImgLabel.setStyleSheet("border: 2px solid red")if __name__ == "__main__":"""程序主入口"""QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling) # 设置屏幕分辨率自适应app = QApplication(sys.argv)  # 创建应用main = MainWindow()  # 创建主窗体main.show()          # 显示主窗体sys.exit(app.exec()) # 进入主窗体生命周期

运行效果如本文开篇图片所示。

4、打包部署

我们最终希望交给用户是一个纯粹的exe可执行文件(可以包含一些dll之类的动态库或配置文件),用户不需要安装Python依赖,直接双击就可以运行展示。下面我们来实现最后的这个环节。

首选安装打包工具:

pip install pyinstaller auto-py-to-exe -i https://mirror.baidu.com/pypi/simple

在终端中运行:auto-py-to-exe,会自动打开浏览器,然后进入打包部署配置页面。对于本项目按照下图所示进行勾选即可:
在这里插入图片描述
最后单击执行即可。打包好的程序位于demo/output/main文件夹中,如下图所示:
在这里插入图片描述
其中main.exe就是最后的可执行程序,_internal就是该程序的依赖库。部署时将整个main文件夹拷贝到部署机器上运行即可。

部署运行时部分机器可能会出现下图所示错误:
在这里插入图片描述
这里只需要下载一个64位的api-ms-win-core-path-l1-1-0.dll文件然后将其拷贝到输出目录的main/_internal文件夹下面即可。

5、小结

使用PyQT开发界面程序可以充分利用python简洁易用的特性,开发效率较高。缺点就是部署文件夹比较大,并且代码的安全性(版权)要比C++等弱一些。

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

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

相关文章

如何找回删除的Word文档?多方法供您选择

在日常生活和工作中,我们经常使用Microsoft Word来创建、编辑和保存文档。然而,有时候我们会不小心删除了重要的Word文档,导致无法挽回的损失。幸运的是,有一些方法可以帮助我们找回已删除的Word文档。本文将介绍一些常用的方法供…

Vue2:通过ref获取DOM元素

一、场景描述 我们在页面的开发过程中&#xff0c;经常需要操作dom元素&#xff0c;来实现我们需要的效果。 以往js中&#xff0c;我们是通过给dom添加id&#xff0c;然后&#xff0c;通过js代码document来获取这个dom 简写代码案例&#xff1a; <h2 id"test"&…

何为算法之空间复杂度

前言 不知前面所讲的算法的十大特征你是否记住了呢&#xff1f;其实除了这十大特征之外&#xff0c;算法还有两个衡量标准。 不同的问题需要使用不同的算法作为策略&#xff0c;不同的算法也可能占用不同的时间和空间来完成相同的任务&#xff0c;这时候&#xff0c;对算法的选…

数学之何为数学

数学是什么 数学是绝大多数人学得最多的一门功课&#xff0c;但对于“数学是什么&#xff1f;”这一看来很普通的问题&#xff0c;却很难一下子给出一个使公众满意的回答。按照恩格斯的说法&#xff0c;数学是以现实世界的空间形式和数量关系为研究对象的。尽管人们现在对空间…

极智AI | 谈谈AI发展系列汇总

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文来分享了 谈谈 AI 发展系列汇总。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码下载,链接:https://t.zsxq.com/0aiNxERDq 时光斗转星移,AI 飞速发展。 满打满算,我…

【Docker】可以将TA用于什么,简单了解下

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深…

RabbitMQ(十一)队列的扩展属性(Arguments)

目录 一、简介二、队列扩展属性清单三、代码示例3.1 实现方式一&#xff1a;channel.queueDeclare()3.2 实现方式二&#xff1a;QueueBuilder.build() 一、简介 RabbitMQ 允许用户在声明队列、交换机或绑定时设置 扩展属性&#xff08;Arguments&#xff09;&#xff0c;这些扩…

c++语言基础19-洗盘子(栈)

题目描述 在餐厅里&#xff0c;洗盘子的工作需要使用到栈这种数据结构。假设你手里有一个盘子堆放区。现在需要模拟洗盘子的过程&#xff0c;每个盘子都有一个编号。 盘子堆放区操作说明&#xff1a; 1. 当操作为 1 时&#xff0c;表示从盘子堆放区拿走顶部的盘子清洗。 2. 当…

数据库管理-第130期 JSON二元性(20240109)

数据库管理130期 2024-01-09 第130期 JSON二元性&#xff08;20240109&#xff09;1 简介2 关系型表和JSON存储的优劣3 Oracle JSON关系型二元性视图总结 第130期 JSON二元性&#xff08;20240109&#xff09; 上周&#xff0c;又双叒飞了一趟上海&#xff0c;也是2024年第一飞…

LeetCode-字符串转换整数atoi(8)

题目描述&#xff1a; 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入字符串并丢弃无用的前导空格 检查下一个字符&…

无线网卡怎么连接台式电脑?正确操作步骤分享!

“我在使用电脑时经常都需要用到网络&#xff0c;请问大家在使用无线网卡时怎么将它与台式电脑进行连接的呢&#xff1f;” 使用电脑的用户在进行网上冲浪时都需要先连接网络。如果不想使用网线&#xff0c;无线网卡不仅可以为用户提供网络服务&#xff0c;在使用时该更加灵活和…

MySQL使用count进行行数统计

MySQL count 在使用count进行数据统计行数时&#xff0c;有时候会使用count(*)&#xff0c;有时候会使用count(1)&#xff0c;有时候会使用count(列名)&#xff0c;那么这些有什么不同呢 当使用列名作为参数时&#xff0c;count函数会自动忽略null值&#xff0c;而使用*或者常量…

springCould中的gateway-从小白开始【9】

目录 1.&#x1f35f;网关是什么 2.&#x1f37f;gateway是什么 3.&#x1f95a;gateway能什么 4.&#x1f32d;核心概念 5.&#x1f9c2;工作流程 6.&#x1f9c8;实例 7.&#x1f953;gateway网关配置的方式 8.&#x1f373;配置动态路由 9.&#x1f9c7;pred…

Excel使用pandas拆分单元格扩展

需要&#xff1a; 1. anconda环境 2. excel文件&#xff0c;有拆分标准的单元格内容&#xff08;比如我此次的&#xff1a;**, ***, ****,...) 以前尝试自己写公式&#xff0c;唉&#x1f614;&#xff0c;不是写不出来&#xff0c;就是太折腾了 3. 2行code&#xff0c;超级…

2022 年全国职业院校技能大赛高职组云计算赛项试卷部分解析

2022 年全国职业院校技能大赛高职组云计算赛项试卷部分解析 【赛程名称】高职组-云计算赛项第一场-私有云【任务 1】私有云服务搭建[10 分]【题目 2】Yum 源配置[0.5 分]【题目 3】配置无秘钥 ssh[0.5 分]【题目 4】基础安装[0.5 分]【题目 5】数据库安装与调优[0.5 分]【题目 …

IBM Spectrum LSF 常见问题

IBM Spectrum LSF 常见问题 1、随此产品一起部署的集群中包含哪些 Spectrum LSF 软件包? 包含以下 Spectrum LSF 程序: IBM Spectrum LSF Standard Edition IBM Spectrum LSF 许可证调度程序 IBM Spectrum LSF 数据管理器 2、哪些位置可用于部署 VPC 资源? 可以在 资源部…

yolo v7支持的设备

将一个深度学习模型&#xff08;在这里是YOLOv7&#xff0c;一个目标检测模型&#xff09;从PyTorch导出到不同的格式&#xff0c;以便在不同平台上进行推理&#xff08;inference&#xff09;。列出的方法包括&#xff1a; PyTorch 转 CoreML&#xff08;适用于 macOS/iOS&am…

C++PDF书籍下载

[提高C.性能的编程技术].左飞.扫描版[www.ed2kers.com].pdf 链接: https://pan.baidu.com/s/1uA-oDGYhtAHmGZsbcr_Eow 密码: abv1 深度探索C对象模型.pdf 链接: https://pan.baidu.com/s/1uG9FDIq7T9EZIbjrfAVQaw 密码: gqaj C和C编码安全.pdf 链接: https://pan.baidu.com/s…

0003__WebAssembly完全入门——了解wasm的前世今身

WebAssembly完全入门——了解wasm的前世今身_webassembly.instantiate env-CSDN博客 WebAssembly初级——认识WebAssebmly&#xff08;一&#xff09;-CSDN博客

Hystrix服务熔断机制

熔断机制 熔断机制是应对雪崩效应的一种微服务链路保护机制&#xff0c;当系统链路中的某个微服务出现错误不可用或者响应时间太长的时候就会进行服务的降级&#xff0c;进而熔断该服务的调用&#xff0c;快速返回熔断的响应信息。当检测到该节点微服务调用正常后&#xff0c;…