OpenCV和PyQt的应用

1.创建一个 PyQt 应用程序,该应用程序能够:

  1. 使用 OpenCV 加载一张图像。
  2. 在 PyQt 的窗口中显示这张图像。
  3. 提供四个按钮(QPushButton):
  • 一个用于将图像转换为灰度图
  • 一个用于将图像恢复为原始彩色图
  • 一个用于将图像进行翻转
  • 一个用于将图像进行旋转
  • 当用户点击按钮时,相应地更新窗口中显示的图像。

代码:

import sys
import cv2
from PyQt6.QtGui import QPixmap, QImage
from PyQt6.QtWidgets import QApplication, QLabel
from PyQt6 import uic# 全局变量保存当前图像
current_image = None# 处理图像的函数
def gray():global current_imageif current_image is not None:img_gray = cv2.cvtColor(current_image, cv2.COLOR_BGR2GRAY)img_rgb = cv2.cvtColor(img_gray, cv2.COLOR_GRAY2RGB)current_image = img_rgb  # 更新当前图像# 转换为 QPixmap 显示h, w, ch = img_rgb.shapebytes_per_line = 3 * wq_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)ui.label.setPixmap(QPixmap.fromImage(q_img))ui.label.setScaledContents(True)else:print("图像加载失败")def img_RGB():global current_imageimg = cv2.imread('./1.png')  # 重新加载原图if img is not None:img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)current_image = img_rgb  # 更新当前图像# 转换为 QPixmap 显示h, w, ch = img_rgb.shapebytes_per_line = 3 * wq_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)ui.label.setPixmap(QPixmap.fromImage(q_img))ui.label.setScaledContents(True)else:print("图像加载失败")def fanzhuan():global current_imageif current_image is not None:current_image = cv2.flip(current_image, 1)  # 水平翻转# 转换为 RGB 以便显示img_rgb = cv2.cvtColor(current_image, cv2.COLOR_BGR2RGB)h, w, ch = img_rgb.shapebytes_per_line = 3 * wq_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)ui.label.setPixmap(QPixmap.fromImage(q_img))ui.label.setScaledContents(True)else:print("图像加载失败")def xuanzhuan():global current_imageif current_image is not None:h, w = current_image.shape[:2]center = (w // 2, h // 2)angle = 90  # 旋转角度M = cv2.getRotationMatrix2D(center, angle, 1.0)current_image = cv2.warpAffine(current_image, M, (w, h))# 转换为 RGB 以便显示img_rgb = cv2.cvtColor(current_image, cv2.COLOR_BGR2RGB)h, w, ch = img_rgb.shapebytes_per_line = 3 * wq_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)ui.label.setPixmap(QPixmap.fromImage(q_img))ui.label.setScaledContents(True)else:print("图像加载失败")if __name__ == '__main__':app = QApplication(sys.argv)# 加载 UI 文件ui = uic.loadUi('./form.ui')# 初始加载图像img = cv2.imread('./1.png')if img is not None:img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)current_image = img_rgb  # 保存原始图像为当前图像# 转换为 QPixmap 显示h, w, ch = img_rgb.shapebytes_per_line = 3 * wq_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)ui.label.setPixmap(QPixmap.fromImage(q_img))ui.label.setScaledContents(True)# 信号与槽的连接ui.btn1.clicked.connect(gray)  # 灰度转换ui.btn2.clicked.connect(img_RGB)  # 恢复 RGBui.btn3.clicked.connect(fanzhuan)  # 水平翻转ui.btn4.clicked.connect(xuanzhuan)  # 旋转ui.show()sys.exit(app.exec())

 

2.创建一个 PyQt 应用程序,该应用程序能够:

  1. 使用 OpenCV 加载一张彩色图像,并在 PyQt 的窗口中显示它。
  2. 提供一个滑动条(QSlider),允许用户调整图像的亮度。
  3. 当用户调整滑动条时,实时更新窗口中显示的图像亮度。
  4. 添加另一个滑动条(QSlider),允许用户调整图像的对比度。
  5. 当用户调整滚动条时,实时更新窗口中显示的图像对比度。
  6. 提供一个按钮(QPushButton),允许用户将图像保存为新的文件。
  7. 当用户点击保存按钮时,将调整后的图像保存到指定的路径,OpenCV中使用cv2.imwrite()来保存图片。

代码:

import cv2
from PyQt6 import uic
from PyQt6.QtGui import QImage, QPixmap
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QSlider
import sysclass MyWidget(QWidget):def __init__(self):super().__init__()ui = uic.loadUi("form2.ui", self)self.img: QLabel = ui.img# 图片亮度调整self.gamer: QSlider = ui.gamerself.gamer.setMinimum(-100)  # 设置亮度最小值self.gamer.setMaximum(100)  # 设置亮度最大值self.gamer.setValue(0)  # 设置初始值为 0self.gamer.valueChanged.connect(self.gamer_slot)# 图片对比度调整self.contrast: QSlider = ui.contrast_radioself.contrast.setMinimum(1)  # 设置对比度最小值self.contrast.setMaximum(100)  # 设置对比度最大值self.contrast.setValue(50)  # 设置初始值为 50self.contrast.valueChanged.connect(self.contrast_slot)# 保存图片self.save: QPushButton = ui.saveself.save.clicked.connect(self.save_slot)# 读取图片self.img_data = cv2.imread("flower.png")self.display_image(self.img_data)# 初始亮度和对比度增量self.initial_brightness = 0self.initial_contrast = 1.0def gamer_slot(self):# 计算亮度变化brightness_change = self.gamer.value() - self.initial_brightnessself.initial_brightness = self.gamer.value()# 使用 addWeighted 来调整亮度self.img_data = cv2.addWeighted(self.img_data, 1.0, 0, 0, brightness_change)self.display_image(self.img_data)def contrast_slot(self):# 计算对比度变化contrast_change = self.contrast.value() - self.initial_contrastself.initial_contrast = self.contrast.value()# 根据对比度调整图像alpha = 1 + (contrast_change / 100.0)  # 控制对比度变化的灵敏度self.img_data = cv2.convertScaleAbs(self.img_data, alpha=alpha, beta=0)self.display_image(self.img_data)def save_slot(self):cv2.imwrite("flower2.png", self.img_data)def display_image(self, img):if len(img.shape) == 2:  # 灰度图没有 color channelsimg_rgb = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)else:img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 转换为 QPixmaph, w, ch = img_rgb.shapebytes_per_line = ch * wq_image = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)# 显示图像self.img.setPixmap(QPixmap.fromImage(q_image))self.img.setScaledContents(True)if __name__ == "__main__":app = QApplication(sys.argv)myWin = MyWidget()myWin.show()sys.exit(app.exec())

 

 

3.创建一个 PyQt 应用程序,该应用程序能够:

  1. 使用 OpenCV 加载一张图像。
  2. 在 PyQt 的窗口中显示这张图像。
  3. 提供一个下拉列表(QComboBox),对图像做(模糊、锐化、边缘检测)处理:
  • 模糊——使用cv2.GaussianBlur()实现
  • 锐化——使用cv2.Laplacian()、cv2.Sobel()实现
  • 边缘检测——使用cv2.Canny()实现
  1. 当用户点击下拉列表选项时,相应地更新窗口中显示的图像。
  2. 提供一个按钮,当用户点击按钮时,能保存调整后的图像。

代码:

import cv2
from PyQt6.QtGui import QImage, QPixmap
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QComboBox
from PyQt6 import uic
import sysclass MyWidget(QWidget):def __init__(self):super().__init__()ui = uic.loadUi("form3.ui", self)self.img: QLabel = ui.labelself.combox: QComboBox = ui.comboBoxself.save: QPushButton = ui.save# 添加选项到下拉列表self.combox.addItems(["原图", "模糊", "锐化", "边缘检测"])# 加载图像self.img_data = cv2.imread("flower.png")self.modified_img = self.img_data  # 当前显示的图像self.display_image(self.img_data)# 信号与槽连接self.combox.currentIndexChanged.connect(self.combox_slot)self.save.clicked.connect(self.save_image)def combox_slot(self, index):if index == 0:img = self.img_dataelif index == 1:img = cv2.GaussianBlur(self.img_data, (5, 5), 0)elif index == 2:img = cv2.Laplacian(self.img_data, -1)elif index == 3:img = cv2.Canny(self.img_data, 100, 200)self.modified_img = img  # 更新当前显示的图像self.display_image(img)def display_image(self, img):if len(img.shape) == 2:  # 灰度图没有 color channelsimg_rgb = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)else:img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 转换为 QPixmaph, w, ch = img_rgb.shapebytes_per_line = ch * wq_image = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)# 显示图像self.img.setPixmap(QPixmap.fromImage(q_image))self.img.setScaledContents(True)def save_image(self):if self.modified_img is not None:cv2.imwrite("output.png", self.modified_img)print("图像已保存为 output.png")if __name__ == "__main__":app = QApplication(sys.argv)window = MyWidget()window.show()sys.exit(app.exec())

 

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

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

相关文章

电路元件与电路基本定理

电流、电压和电功率 电流 1 定义: 带电质点的有序运动形成电流 。 单位时间内通过导体横截面的电量定义为电流强度, 简称电流,用符号 i 表示,其数学表达式为:(i单位:安培(A&#x…

win11中win加方向键失效的原因

1、可能是你把win键锁了: 解决办法:先按Fn键,再按win键 2、可能是可能是 贴靠窗口设置 中将贴靠窗口关闭了,只需要将其打开就好了

十二月第五周python

第一个程序,熟悉转换器,把加法计算器变成exe# // 1,制作加法计算器, # 输入两个数字得到相加结果并输出aint(input("输入数字:"))#int()是把输入的内容转换成整数, bint(input("输入数字:&…

pyqt和pycharm环境搭建

安装 python安装: https://www.python.org/downloads/release/python-3913/ python3.9.13 64位(记得勾选Path环境变量) pycharm安装: https://www.jetbrains.com/pycharm/download/?sectionwindows community免费版 换源: pip config se…

Lottie动画源码解析

Lottie是一个很成熟的开源动画框架,它支持直接使用从AE导出的动画文件,在不同平台均可快速使用,大大减轻了程序员的工作量,也让复杂的动画成为可能。该动画文件使用Json格式来描述内容,可以大大缩减文件的体积。在Andr…

Cadence学习笔记 16 HDMI接口布局

基于Cadence 17.4,四层板4路HDMI电路 更多Cadence学习笔记:Cadence学习笔记 1 原理图库绘制Cadence学习笔记 2 PCB封装绘制Cadence学习笔记 3 MCU主控原理图绘制Cadence学习笔记 4 单片机原理图绘制Cadence学习笔记 5 四路HDMI原理图绘制Cadence学习笔记…

微服务篇-深入了解 MinIO 文件服务器(你还在使用阿里云 0SS 对象存储图片服务?教你使用 MinIO 文件服务器:实现从部署到具体使用)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 MinIO 文件服务器概述 1.1 MinIO 使用 Docker 部署 1.2 MinIO 控制台的使用 2.0 使用 Java 操作 MinIO 3.0 使用 minioClient 对象的方法 3.1 判断桶是否存在 3.2…

logback之pattern详解以及源码分析

目录 (一)pattern关键字介绍 (二)源码分析 (一)pattern关键字介绍 %d或%date:表示日期,可配置格式化%d{yyyy-MM-dd HH:mm:ss} %r或%relative:也是日期,不过…

【期末复习】JavaEE(下)

1. MVC开发模式 1.1. 运行流程 1.2. SpringMVC 核心组件 1.3. 注解解释 2. ORM与MyBatis 2.1. ORM—对象关系映射 2.2. MyBatis 2.2.1. 创建步骤 会话是单例的,不能跨方法。(单例的原因主要是从数据安全角度出发) import org.apache.ibatis…

作业帮基于 Apache DolphinScheduler 3_0_0 的缺陷修复与优化

文|作业帮大数据团队(阮文俊、孙建业) 背 景 基于 Apache DolphinScheduler (以下简称DolphinScheduler)搭建的 UDA 任务调度平台有效支撑了公司的业务数据开发需求,处理着日均百万级别的任务量。 整个 UDA 的架构如…

电脑缺失sxs.dll文件要怎么解决?

一、文件丢失问题:以sxs.dll文件缺失为例 当你在运行某个程序时,如果系统提示“找不到sxs.dll文件”,这意味着你的系统中缺少了一个名为sxs.dll的动态链接库文件。sxs.dll文件通常与Microsoft的.NET Framework相关,是许多应用程序…

Web开发:ORM框架之使用Freesql的分表分页写法

一、自动分表(高版本可用) 特性写法 //假如是按月分表:[Table(Name "log_{yyyyMM}", AsTable "createtime2022-1-1(1 month)")]注意:①需包含log_202201这张表 ②递增规律是一个月一次,确保他们…

【数据结构与算法】单向链表

一、什么是链表 链表由一系列节点组成,每个节点都包含一个 data 域(存放数据)和一个 next 域(指向下一节点)。链表中的节点可以按照任意顺序存放在内存中,它们之间并不连续。每个节点都记录了下一个节点的地…

【ACCSS】2024年亚信安全云认证专家题库

文件包含: 亚信安全ACCSS认证2019年真题(1) 亚信安全ACCSS认证2019年真题(2) 亚信安全ACCSS认证2019年真题(3) 亚信安全ACCSS认证2020年真题(1) 亚信安全ACCSS认证2020年…

OpenCV-Python实战(10)——形态学

1、腐蚀 cv2.erode() 可以删除图像中的噪音点。 可以删除毛边。 分割图像(当图像连接的不够紧密时) 。 img cv2.erode(src*,kernel*,anchor*,iterations*,borderType*,borderValue*)img:目标图像。 src:原始图像。 kernel&…

用VBA将word文档处理成支持弹出式注释的epub文档可用的html内容

有一种epub文件,其中的注释以弹窗形式显示,如下图: 点击注释引用后,对应的注释内容会弹出在页面中显示,再次点击弹窗外的任意位置该弹窗即关闭,关闭后点击任意注释引用,对应的注释内容会弹窗显示…

Ngnix介绍、安装、实战及用法!!!

一、Nginx简介 1、Nginx概述 Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器,特点是占有内存少,并发能力强,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数 。 2、正向代理 正向代理:如果把局…

【超详细】Git的基本概念和基本使用方式

Git是程序开发中非常重要的工具,是一种分布式版本控制系统,可用于管理和追踪软件开发过程中的变化。那么关于Git的基本操作你知道吗?下面是Git的基本概念和使用方式的解释: 仓库(Repository):Gi…

springboot503基于Sringboot+Vue个人驾校预约管理系统(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装个人驾校预约管理系统软件来发挥其高效地信息处理的作用&am…

【Rust自学】7.4. use关键字 Pt.2 :重导入与换国内镜像源教程

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 7.4.1. 使用pub use重新导入名称 使用use将路径导入作用域内后。该名称在词作用域内是私有的。 以上一篇文章的代码为例: m…