当前位置: 首页 > article >正文

OpenCV和PyQt的应用

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.kler.cn/a/461759.html

相关文章:

  • MarkDown怎么转pdf;Mark Text怎么使用;
  • DepthLab: From Partial to Complete 论文解读
  • 树莓派 Pico RP2040 教程点灯 双核编程案例
  • lec5-传输层原理与技术
  • 如何使用Python自动化发送消息:用pynput库批量输入并发送文本
  • Linux-掉电保护方案
  • 基于JavaWeb的汽车维修保养智能预约系统
  • doris 2.1 -Data Manipulation-Transaction
  • 等价和划分
  • [算法学习笔记] 《Hello算法》第5章 栈与队列
  • javaEE-文件操作和IO-文件
  • Elasticsearch:探索 Elastic 向量数据库的深度应用
  • vue2实现txt文件在线预览
  • 通过服务器推送消息:Websocket和SSE解释
  • Kafka为什么要放弃Zookeeper
  • 医疗实时数仓环境配置与ods层
  • Conda 命令教程
  • 折叠手机突然折翅,折叠屏采购暴跌,苹果挽救或是幻想
  • 一维前缀和,二维前缀和
  • 文章解读与仿真程序复现思路——EI\CSCD\北大核心《基于模型预测控制的掺氢微能源网低碳经济调度 》
  • Java Excel转PDF POI+Itext5
  • 【无线传感网】WSN数据管理技术
  • 自学记录鸿蒙API 13:Calendar Kit日历功能从学习到实践
  • 面试题解,JVM的运行时数据区
  • 【杂谈】-快速了解协作机器人
  • 推荐5款局域网IP扫描工具,支持电脑+Android!