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

效果展示

相关推荐
大学生毕业题目3 天前
毕业项目推荐:105-基于yolov8/yolov5/yolo11的烟草等级检测识别系统(Python+卷积神经网络)
人工智能·python·yolo·目标检测·cnn·pyqt·烟草等级
大学生毕业题目4 天前
毕业项目推荐:103-基于yolov8/yolov5/yolo11的皮肤癌检测识别系统(Python+卷积神经网络)
人工智能·python·yolo·目标检测·cnn·pyqt·皮肤癌检测
大学生毕业题目6 天前
毕业项目推荐:102-基于yolov8/yolov5/yolo11的行人车辆检测识别系统(Python+卷积神经网络)
人工智能·python·yolo·目标检测·cnn·pyqt·行人车辆检测
大学生毕业题目6 天前
毕业项目推荐:99-基于yolov8/yolov5/yolo11的肾结石检测识别系统(Python+卷积神经网络)
人工智能·python·yolo·目标检测·cnn·pyqt·肾结石检测
深蓝海拓7 天前
PySide6,QEventLoop.exec()的使用
笔记·python·qt·学习·pyqt
深蓝海拓10 天前
PySide6从0开始学习的笔记(二十三)使用QRunnable在线程池中执行临时任务
笔记·python·qt·学习·pyqt
强化试剂10 天前
荧光标记利器 Alkyne-PEG-FITC;FITC-PEG-Alkyne:核心优势与行业价值
python·flask·pyqt·scipy
深蓝海拓13 天前
PySide6从0开始学习的笔记(二十二) 几种封装信号传递内容的方法
笔记·python·qt·学习·pyqt
赤鸢QAQ13 天前
PySide6批量创建控件
python·qt·pyqt