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

效果展示

相关推荐
开心-开心急了1 天前
PySide6 实现win10 手动与自动切换主题 借助系统托盘
pyqt·1024程序员节·pyside
mortimer3 天前
用 PySide6 打造可视化 ASS 字幕样式编辑器:从需求到实现
python·ffmpeg·pyqt
没有感情的robot5 天前
pyqt实现简易中英文翻译工具
pyqt
mortimer8 天前
用PySide6 构建一个响应式视频剪辑工具:多线程与信号机制实战
python·ffmpeg·pyqt
深兰科技9 天前
深兰科技法务大模型亮相,推动律所文书处理智能化
人工智能·scrapy·beautifulsoup·scikit-learn·pyqt·fastapi·深兰科技
叶子丶苏11 天前
第八节_PySide6基本窗口控件_按钮类控件(QAbstractButton)
python·pyqt
龙腾AI白云12 天前
大模型-7种大模型微调方法 上
scrapy·scikit-learn·pyqt
开心-开心急了13 天前
PySide6 使用搜索引擎搜索 多类实现 更新1次
python·pyqt·pyside
herbal_medicine13 天前
【测试】123456789
pyqt
懷淰メ14 天前
python3GUI--模仿百度网盘的本地文件管理器 By:PyQt5(详细分享)
开发语言·python·pyqt·文件管理·百度云·百度网盘·ui设计