pyQT + OpenCV小练习

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

使用 OpenCV 加载一张图像。

在 PyQt 的窗口中显示这张图像。

提供四个按钮(QPushButton):

  • 一个用于将图像转换为灰度图

  • 一个用于将图像恢复为原始彩色图

  • 一个用于将图像进行翻转

  • 一个用于将图像进行旋转

当用户点击按钮时,相应地更新窗口中显示的图像

1.思路分析

读取图片

添加按钮

将功能函数与按钮使用信号与槽连接

2.设计到的函数方法

复制代码
cv2.cvtColor(转换为灰度图)
复制代码
cv2.flip(翻转)
复制代码
cv2.getRotationMatrix2D(用于计算二维旋转矩阵的函数)
复制代码
cv2.warpAffine(对图像进行放射变换)

3.代码

python 复制代码
import cv2
import sys
from PyQt6.QtGui import QPixmap, QImage
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QPushButton


class MyWidget(QWidget):
   
    def __init__(self):
        super().__init__()

        self.resize(600, 400)

       
        self.lab3 = QLabel(self)
        self.lab3.resize(600, 400)
        self.lab3.setScaledContents(True)

        
        self.img = cv2.imread("./car5.png")
        self.update_image(self.img)

       
        btn1 = QPushButton("灰度", self)
        btn1.setStyleSheet("background-color:green")
        btn1.clicked.connect(self.change_image)  
        btn1.move(10, 10)  

        btn2 = QPushButton("彩色", self)
        btn2.setStyleSheet("background-color:green")
        btn2.clicked.connect(self.change_colours)  
        btn2.move(90, 10)

        btn3 = QPushButton("翻转", self)
        btn3.setStyleSheet("background-color:green")
        btn3.clicked.connect(self.change_transform)  
        btn3.move(170, 10)

        btn4 = QPushButton("旋转", self)
        btn4.setStyleSheet("background-color:green")
        btn4.clicked.connect(self.spin)  
        btn4.move(260, 10)


    def update_image(self, img):
        
        img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
        h, w, ch = img_rgb.shape
        bytes_per_line = ch * w
        qimage = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
        pixmap = QPixmap.fromImage(qimage)

        
        self.lab3.setPixmap(pixmap)

    def change_colours(self):
        self.update_image(self.img)

    def change_transform(self):
        img_filp = cv2.flip(self.img,0)
        self.update_image(img_filp)

    def spin(self):
        M = cv2.getRotationMatrix2D((self.img.shape[1]/2, self.img.shape[0]/2), 45, 0.5)

        img_warp = cv2.warpAffine(self.img,  
                                  M,  
                                  (700, 700),  大小
                                  flags=cv2.INTER_LINEAR,  
                                  
                                  )

        self.update_image(img_warp)


    def change_image(self):
       
        img_gray = cv2.cvtColor(self.img, cv2.COLOR_BGR2GRAY)

  
        self.update_image(img_gray)




if __name__ == "__main__":
    app = QApplication(sys.argv)

    myWidget = MyWidget()

    myWidget.show()

    sys.exit(app.exec())

                             

4.效果展示


二,创建一个 PyQt 应用程序,该应用程序能够:
使用 OpenCV 加载一张图像。

在 PyQt 的窗口中显示这张图像。

提供一个下拉列表(QComboBox),对图像做(模糊、锐化、边缘检测)处理:
当用户点击下拉列表选项时,相应地更新窗口中显示的图像。

提供一个按钮,当用户点击按钮时,能保存调整后的图像。

思路分析

使用下拉列表将功能函数写入进去

设计到的函数方法
提供一个下拉列表(QComboBox)
模糊------使用cv2.GaussianBlur()实现

锐化------使用cv2.Laplacian()、cv2.Sobel()实现

边缘检测------使用cv2.Canny()实现

代码

python 复制代码
import cv2
import sys
import numpy as np
from PyQt6.QtGui import QPixmap, QImage
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QComboBox, QVBoxLayout


class MyWidget(QWidget):
   
    def __init__(self):
        super().__init__()

        self.resize(600, 400)

       
        self.lab3 = QLabel(self)
        self.lab3.resize(600, 400)
        self.lab3.setScaledContents(True)

     
        self.img = cv2.imread("./car5.png")
        self.update_image(self.img)

      
        self.combo_box = QComboBox(self)
        self.combo_box.addItem("请选择处理方式")
        self.combo_box.addItem("模糊")
        self.combo_box.addItem("锐化")
        self.combo_box.addItem("边缘检测")
        self.combo_box.currentIndexChanged.connect(self.process_image)  
        self.combo_box.move(10, 10)

    def update_image(self, img):
        
        img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
        h, w, ch = img_rgb.shape
        bytes_per_line = ch * w
        qimage = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
        pixmap = QPixmap.fromImage(qimage)

        self.lab3.setPixmap(pixmap)

    def process_image(self):
       
        selected_option = self.combo_box.currentText()

        if selected_option == "模糊":
         
            img_blurred = cv2.GaussianBlur(self.img, (15, 15), 0)
            self.update_image(img_blurred)

        elif selected_option == "锐化":
           
            kernel = np.array([[0, -1, 0], [-1, 5,-1], [0, -1, 0]])  
            img_sharpened = cv2.filter2D(self.img, -1, kernel)
            self.update_image(img_sharpened)

        elif selected_option == "边缘检测":
          
            img_gray = cv2.cvtColor(self.img, cv2.COLOR_BGR2GRAY)
            img_edges = cv2.Canny(img_gray, 100, 200)
            img_edges_colored = cv2.cvtColor(img_edges, cv2.COLOR_GRAY2BGR)  
            self.update_image(img_edges_colored)

        else:
            self.update_image(self.img)


if __name__ == "__main__":
    app = QApplication(sys.argv)

    myWidget = MyWidget()

    myWidget.show()

    sys.exit(app.exec())

效果展示

相关推荐
AntBlack2 天前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt
前端市界2 天前
前端视角: PyQt6+Vue3 跨界开发实战
前端·qt·pyqt
AI大法师4 天前
Python:PyQt5 全栈开发教程,构建跨平台桌面应用
python·pyqt
宋大水13 天前
【大作业-12】草莓成熟度检测模型,YOLO+PyQt+MySQL
数据库·深度学习·mysql·yolo·目标检测·pyqt·课程设计
mortimer13 天前
Python GUI 应用启动优化实战:从3分钟到“秒开”的深度历程
python·github·pyqt
懷淰メ16 天前
日常--详细介绍qt Designer常用快捷键(详细图文)
开发语言·qt·pyqt·快捷键·qtdesigner·ui设计·qt设计师
钢铁男儿22 天前
PyQt事件处理机制深度指南:超越信号与槽的底层掌控
pyqt
Goona_23 天前
拒绝SQL恐惧:用Python+pyqt打造任意Excel数据库查询系统
数据库·python·sql·excel·pyqt
赤鸢QAQ1 个月前
Qt小组件 - 6 异步运行函数
开发语言·python·qt·pyqt
斟的是酒中桃1 个月前
基于YOLOv8的火灾智能检测系统设计与实现
人工智能·深度学习·yolo·pyqt