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

效果展示

相关推荐
深蓝海拓4 小时前
基于QtPy (PySide6) 的PLC-HMI工程项目(十二)最后的工作
网络·笔记·python·学习·pyqt·plc
TOOLS指南1 天前
Python-PyQt界面开发入门-计算器例子
pyqt
小灰灰搞电子2 天前
PyQt QDarkStyle详解-打造专业暗黑界面的瑞士军刀
pyqt·暗黑主题
懷淰メ3 天前
【AI加持】基于PyQt+YOLO+DeepSeek的车型检测系统(详细介绍)
yolo·目标检测·计算机视觉·pyqt·项目设计·deepseek·车型检测
淮北4944 天前
ubuntu22.04将mp4转换成gif
python·scrapy·flask·beautifulsoup·pyqt·matplotlib
懷淰メ5 天前
【AI加持】基于PyQt+YOLO+DeepSeek的口罩佩戴检测系统(详细介绍)
yolo·计算机视觉·pyqt·口罩检测·deepseek·ai加持
小灰灰搞电子7 天前
PyQt QWebChannel详解-C++与Web页面的无缝双向通信
前端·pyqt
小灰灰搞电子9 天前
PyQt QtAwesome详解:为Qt应用注入字体图标的魅力
pyqt·字体图标
DeepLearningYolo9 天前
基于PyQt的YOLOv5+DeepSORT可视化界面,可实现目标跟踪、模型更换、结果保存和轨迹隐藏等功能。
yolo·目标跟踪·pyqt
TRACER~8514 天前
项目实战:pyqt6实现拼豆图纸生成器
python·pyqt