OpenCV和PyQt的应用

news2025/1/1 14:19:07

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())

 

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

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

相关文章

基于Spring Boot的宠物领养系统的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领…

uniapp 判断多选、选中取消选中的逻辑处理

一、效果展示 二、代码 1.父组件: :id=“this.id” : 给子组件传递参数【id】 @callParentMethod=“takeIndexFun” :给子组件传递方法,这样可以在子组件直接调用父组件的方法 <view @click="$refs.member.open()"

百度热力图数据日期如何选择

目录 1、看日历2、看天气 根据研究内容定&#xff0c;一般如果研究城市活力的话&#xff0c;通常会写“非重大节假日&#xff0c;非重大活动&#xff0c;非极端天气等”。南方晴天不多&#xff0c;有小雨或者中雨都可认为没有影响&#xff0c;要不然在南方很难找到完全一周没有…

【深入理解SpringCloud微服务】Sentinel源码解析——FlowSlot流控规则

Sentinel源码解析——FlowSlot流控规则 StatisticNode与StatisticSlotStatisticNode内部结构StatisticSlot FlowSlot流控规则 在前面的文章&#xff0c;我们对Sentinel的原理进行了分析&#xff0c;Sentinel底层使用了责任链模式&#xff0c;这个责任链就是ProcessorSlotChain对…

【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版 (1)11

文章目录 一、算法概念11二、算法原理&#xff08;一&#xff09;感知机&#xff08;二&#xff09;多层感知机1、隐藏层2、激活函数sigma函数tanh函数ReLU函数 3、反向传播算法 三、算法优缺点&#xff08;一&#xff09;优点&#xff08;二&#xff09;缺点 四、MLP分类任务实…

R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别

全文链接&#xff1a;https://tecdat.cn/?p38667 摘要&#xff1a;在母婴暴露于空气污染对儿童健康影响的研究中&#xff0c;常需对孕期暴露情况与健康结果进行回归分析。分布滞后非线性模型&#xff08;DLNM&#xff09;是一种常用于估计暴露 - 时间 - 响应函数的统计方法&am…

e3 1220lv3 cpu-z分数

e3 1220lv3 双核四线程&#xff0c;1.1G频率&#xff0c;最低可在800MHZ运行&#xff0c;TDP 13W。 使用PE启动后测试cpu-z分数。 现在e3 1220lv3的价格落到69元。

Debian安装配置RocketMQ

安装配置 本次安装在/tools/rocket目录下 下载 wget https://dist.apache.org/repos/dist/release/rocketmq/5.3.1/rocketmq-all-5.3.1-bin-release.zip 解压缩 unzip rocketmq-all-5.3.1-bin-release.zip 如果出现以下报错 -bash: unzip: command not found可安装unzip工具后执…

cocos 运行时,实时查看、修改节点树

简介 cocos论坛提供的一款辅助查看、修改cocos运行时的节点树工具&#xff0c;同时也可以实时修改运行的节点树并进行修改。在此感谢大佬提供这么实用的工具。 参考链接&#xff1a;【运行时显示节点树插件】ccc-devtools悄悄更新 - Creator 2.x - Cocos中文社区 仓库链接&a…

UE(虚幻)学习(四) 第一个C++类来控制小球移动来理解蓝图和脚本如何工作

UE5视频看了不少&#xff0c;但基本都是蓝图如何搞&#xff0c;或者改一下属性&#xff0c;理解UE系统现有组件使用的。一直对C脚本和蓝图之间的关系不是很理解&#xff0c;看到一个视频讲的很好&#xff0c;我也做笔记记录一下。 我的环境是UE5.3.2. 创建UE空项目 我们创建…

记一次内存泄漏分析(待写稿)

背景 线上Flink频繁重启&#xff0c;先后排查了很多情况&#xff0c;目前在内存阶段排查&#xff0c;首先说说学到的知识 内存泄漏分析 JVM常用命令 JConsole JVisualvm 快照的这里是最有用的&#xff0c;它和jmap不同&#xff0c;jmap查找的是占用字节最多的类&#xff…

【蓝桥杯——物联网设计与开发】拓展模块5 - 光敏/热释电模块

目录 一、光敏/热释电模块 &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;AS312 &#x1f319;简介 &#x1f319;特性 &#x1f505;LDR &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#xff08;4&#x…

C语言从入门到放弃教程

C语言从入门到放弃 1. 介绍1.1 特点1.2 历史与发展1.3 应用领域 2. 安装2.1 编译器安装2.2 编辑器安装 3. 第一个程序1. 包含头文件2. 主函数定义3. 打印语句4. 返回值 4. 基础语法4.1 注释4.1.1 单行注释4.1.2 多行注释 4.2 关键字4.2.1 C语言标准4.2.2 C89/C90关键字&#xf…

第三百四十六节 JavaFX教程 - JavaFX绑定

JavaFX教程 - JavaFX绑定 JavaFX绑定同步两个值&#xff1a;当因变量更改时&#xff0c;其他变量更改。 要将属性绑定到另一个属性&#xff0c;请调用bind()方法&#xff0c;该方法在一个方向绑定值。例如&#xff0c;当属性A绑定到属性B时&#xff0c;属性B的更改将更新属性A…

慧集通客户案例:致远OA与熵基考勤机集成方案

本原型公司是一家专注大健康产业的综合性高新科技形实体企业&#xff0c;按照单位的战略业务布局&#xff0c;围绕“做强做优、世界一流”的目标&#xff0c;加快内外部资源整合、加强业务协同、优化资源配置&#xff0c;有序推进大健康及相关产业的有机融合&#xff0c;加快构…

SCSA: Exploring the Synergistic Effects Between Spatial and Channel Attention

摘要 https://arxiv.org/pdf/2407.05128 通道注意力和空间注意力分别为各种下游视觉任务在提取特征依赖性和空间结构关系方面带来了显著改进。通道注意力和空间注意力的结合使用被广泛认为有利于进一步提升性能&#xff1b;然而&#xff0c;通道注意力和空间注意力之间的协同作…

UE5在蓝图中使用VarestX插件访问API

在Fab中安装好VarestX免费插件 这个插件可以用来远程请求http和api等&#xff0c;返回json等格式内容 插件网址 https://www.fab.com/zh-cn/listings/d283e40c-4ee5-4e73-8110-cc7253cbeaab 虚幻里开启插件 然后网上随便搜个免费api测试一下&#xff0c;这里我找了个微博热搜…

碰一碰发视频矩阵系统源码搭建,支持OEM

一、引言 随着短视频的火爆发展&#xff0c;碰一碰发视频的矩阵系统逐渐受到关注。这种系统能够实现用户通过碰一碰设备&#xff08;如 NFC 标签&#xff09;快速触发视频的发布&#xff0c;在营销推广、互动体验等领域有着广泛的应用前景。本文将详细介绍碰一碰发视频矩阵系统…

Pandas01

文章目录 内容简介1 常用数据分析三方库2 Jupyter notebook3 Series的创建3.1 通过Numpy的Ndarray 创建一个Series3.2 通过列表创建Series 4 Series的属性和方法4.1 常用属性4.2 常用方法4.3 布尔值列表筛选部分数据4.4 Series 的运算 5 DataFrame的创建通过字典创建通过列表[元…

WebPack3项目升级webpack5的配置调试记录

文章目录 前言一、webpack3环境1.1、知识点记录1.1.1、配置解释1.1.2、webpack与sass版本对应关系1.1.3、CommonJS与ESModule1.1.4、node版本管理nvm1.1.5、sass-loader、sass与node-sass 1.2、其他1.2.1、.d.ts是什么文件1.2.2、react与types/react版本对应关系1.2.3、webpack…