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_image
    if 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.shape
        bytes_per_line = 3 * w
        q_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_image
    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.shape
        bytes_per_line = 3 * w
        q_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_image
    if 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.shape
        bytes_per_line = 3 * w
        q_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_image
    if 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.shape
        bytes_per_line = 3 * w
        q_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.shape
        bytes_per_line = 3 * w
        q_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)  # 恢复 RGB
    ui.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 sys
 
class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        ui = uic.loadUi("form2.ui", self)
        self.img: QLabel = ui.img
        # 图片亮度调整
        self.gamer: QSlider = ui.gamer
        self.gamer.setMinimum(-100)  # 设置亮度最小值
        self.gamer.setMaximum(100)  # 设置亮度最大值
        self.gamer.setValue(0)  # 设置初始值为 0
        self.gamer.valueChanged.connect(self.gamer_slot)
 
        # 图片对比度调整
        self.contrast: QSlider = ui.contrast_radio
        self.contrast.setMinimum(1)  # 设置对比度最小值
        self.contrast.setMaximum(100)  # 设置对比度最大值
        self.contrast.setValue(50)  # 设置初始值为 50
        self.contrast.valueChanged.connect(self.contrast_slot)
        # 保存图片
        self.save: QPushButton = ui.save
        self.save.clicked.connect(self.save_slot)
        # 读取图片
        self.img_data = cv2.imread("flower.png")
        self.display_image(self.img_data)
 
        # 初始亮度和对比度增量
        self.initial_brightness = 0
        self.initial_contrast = 1.0
 
    def gamer_slot(self):
        # 计算亮度变化
        brightness_change = self.gamer.value() - self.initial_brightness
        self.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_contrast
        self.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 channels
            img_rgb = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
        else:
            img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
 
        # 转换为 QPixmap
        h, w, ch = img_rgb.shape
        bytes_per_line = ch * w
        q_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 sys
 
class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        ui = uic.loadUi("form3.ui", self)
        self.img: QLabel = ui.label
        self.combox: QComboBox = ui.comboBox
        self.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_data
        elif 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 channels
            img_rgb = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
        else:
            img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
 
        # 转换为 QPixmap
        h, w, ch = img_rgb.shape
        bytes_per_line = ch * w
        q_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())

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kibana启动报错:Invalid character in header content [“kbn-name“]

启动时候kibana报错: 打开 kibana配置文件,config/kibana.yml,配置上server.name即可,如下:

Pandas08

Pandas01 Pandas02 Pandas03 Pandas04 Pandas05 Pandas06 Pandas07 文章目录 内容回顾同期群分析1.1 同期群分析概念1.2 案例代码 数据分析报告数据分析工作内容数据分析简历说明用户生命周期标签1 什么是生命周期标签2 如何计算生命周期标签 内容回顾 TGI 偏好分析 TGI 目标…

网页数据的解析提取之Beautiful Soup

前面博客介绍了正则表达式的相关用法,只是一旦正则表达式写得有问题,得到的结果就可能不是我们想要的了。而且每一个网页都有一定的特殊结构和层级关系,很多节点都用id或 class 作区分所以借助它们的结构和属性来提取不也可以吗? 本篇博客我…

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

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

进军AI大模型-环境配置

语言环境配置 合法上网工具: 这个T子试试,一直稳定。走我链接免费用5天: https://wibnm.com/s/ywtc01/pvijpzy python版本: python3.12 Langchain: Introduction | 🦜️🔗 LangChain v0.3 9月16日升级的版本 pip3…

WebStorm的下载安装指南

下载 打开网站https://www.jetbrains.com/webstorm/download/#sectionwindows 或者直接网盘下载 通过网盘分享的文件:WebStorm-2024.3.1.1.exe 链接: https://pan.baidu.com/s/16JRZjleFYshLbVvZB49-FA?pwdn5hc 提取码: n5hc –来自百度网盘超级会员v6的分享 安…

Vue使用pages构建多页应用

经过上一篇文章,大家对单页应用配置的都有了一定的了解。相信大家应该对如何构建一个 Vue 单页应用项目已经有所收获和体会,在大部分实际场景中,我们都可以构建单页应用来进行项目的开发和迭代,然而对于项目复杂度过高或者页面模块…

springboot506基于Springboot的小区疫情购物系统录(论文+源码)_kaic

摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古…

复习打卡大数据篇——Hadoop MapReduce

目录 1. MapReduce基本介绍 2. MapReduce原理 1. MapReduce基本介绍 什么是MapReduce MapReduce是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在Hadoop集群上。 MapRed…

RK3506开发板:智能硬件领域的新选择,带来卓越性能与低功耗

在现代智能硬件开发中,选择一款性能稳定、功耗低的开发板是确保产品成功的关键。Rockchip最新推出的RK3506芯片,凭借其卓越的能效比、多功能扩展性和优秀的实时性能,已经成为智能家电、工业控制、手持终端等领域的热门选择。而基于RK3506的Ar…

Python学习(2):注释、数字、文本、列表

1 关于注释 Python 使用井号#作为单行注释的符号, 使用三个连续的单引号’’或者三个连续的双引号"""注释多行内容。 2 数字 2.1 基本运算 解释器像一个简单的计算器:你可以输入一个表达式,它将给出结果值。 表达式语法很直观…

加载Tokenizer和基础模型的解析及文件介绍:from_pretrained到底加载了什么?

加载Tokenizer和基础模型的解析及文件介绍 在使用Hugging Face的transformers库加载Tokenizer和基础模型时,涉及到许多文件的调用和解析。这篇博客将详细介绍这些文件的功能和它们在加载过程中的作用,同时结合代码片段进行解析。 下图是我本地下载好模…

Excel批量设置行高,Excel表格设置自动换行后打印显示不全,Excel表格设置最合适的行高后打印显示不全,完美解决方案!!!

文章目录 说个问题(很严重!!!)写个方案会Python看这里Python环境搭建不存在多行合并存在多行合并 不会Python看这里 说个问题(很严重!!!) 平时处理Excel表格…

goview——vue3+vite——数据大屏配置系统

低代码数据大屏配置系统: 数据来源是可以动态api配置的: 配置上面的api接口后,在数据过滤中进行数据格式的转化。 以上内容,来源于https://gitee.com/dromara/go-view/tree/master-fetch/ 后端代码如下,需要更改…

ADC相关算法以及热敏电阻测温

目录 前言 一、平均值滤波算法 二、快速排序算法的使用 三、中位值滤波算法 四、二分查找法 4.1 二分查找法查找某个元素是否存在 4.2 二分查找法查找接近目标数值的元素的下标 五、NTC热敏电阻实现测温 5.1 分层设计 5.2 软件流程图 ​编辑 5.3 API接口及数据结构 5…

计算机的错误计算(一百九十四)

摘要 用两个大模型计算 其中,一个大模型通过化简,得出正确结果 0;而另外一个在化简过程中出现错误,得出了错误结果。 例1. 计算 下面是一个大模型的推导化简过程。 以上为一个大模型的回答。 下面是另外一个大模型的回复。 点评…

任意文件包含漏洞原理解析及演示

原理 文件包含漏洞:即file inclusion,意思是文件包含,是指当服务器开启allow_url_include选项时,就可以通过PHP的某些特性函数(include(),require()和include_once(),requir_once())…

Linux系统之tree命令的基本使用

Linux系统之tree命令的基本使用 一、tree命令介绍二、tree工具安装三、tree命令帮助3.1 查询帮助信息3.2 tree命令帮助解释 四、tree命令的基本使用4.1 直接使用4.2 *限制显示的层级4.3 仅显示目录4.4 不显示隐藏文件4.5 显示文件大小4.6 彩色输出4.7 输出到文件4.8 输出不同格…

微信小程序性能优化、分包

性能优化是任何应用开发中的重要组成部分,尤其是在移动环境中。对于微信小程序而言,随着用户量的增加和应用功能的丰富,性能优化显得尤为关键。良好的性能不仅提升用户体验,还能增加用户留存率和应用的使用频率。我们将探讨如何在…

【星海随笔】删除ceph

cephadm shell ceph osd set noout ceph osd set norecover ceph osd set norebalance ceph osd set nobackfill ceph osd set nodown ceph osd set pause参考文献: https://blog.csdn.net/lyf0327/article/details/90294011 systemctl stop ceph-osd.targetyum re…