麻花痒 发表于 2024-12-30 01:59:33

OpenCV和PyQt的应用

1.创建一个 PyQt 应用程序,该应用程序可以或许:


[*]利用 OpenCV 加载一张图像。
[*]在 PyQt 的窗口中显示这张图像。
[*]提供四个按钮(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())
https://i-blog.csdnimg.cn/direct/60c3102cbf6d4b2381362e651788b815.png
https://i-blog.csdnimg.cn/direct/18cd87fa553d4c02a72a227c37f3e901.png https://i-blog.csdnimg.cn/direct/62b19cb877374d759dec55302b2bbf8a.png
https://i-blog.csdnimg.cn/direct/1a06b377cfc64c4eb8735f5477707a2f.png
2.创建一个 PyQt 应用程序,该应用程序可以或许:


[*]利用 OpenCV 加载一张彩色图像,并在 PyQt 的窗口中显示它。
[*]提供一个滑动条(QSlider),答应用户调整图像的亮度。
[*]当用户调整滑动条时,及时更新窗口中显示的图像亮度。
[*]添加另一个滑动条(QSlider),答应用户调整图像的对比度。
[*]当用户调整滚动条时,及时更新窗口中显示的图像对比度。
[*]提供一个按钮(QPushButton),答应用户将图像生存为新的文件。
[*]当用户点击生存按钮时,将调整后的图像生存到指定的路径,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()) https://i-blog.csdnimg.cn/direct/4fc536b092114d71b2062d7106f940f8.png

 https://i-blog.csdnimg.cn/direct/36030fe4e11a4e94871493461b1720fd.png
https://i-blog.csdnimg.cn/direct/766804b096694363ab7569ae1c572098.png 
3.创建一个 PyQt 应用程序,该应用程序可以或许:


[*]利用 OpenCV 加载一张图像。
[*]在 PyQt 的窗口中显示这张图像。
[*]提供一个下拉列表(QComboBox),对图像做(含糊、锐化、边缘检测)处理:


[*]含糊——利用cv2.GaussianBlur()实现
[*]锐化——利用cv2.Laplacian()、cv2.Sobel()实现
[*]边缘检测——利用cv2.Canny()实现

[*]当用户点击下拉列表选项时,相应地更新窗口中显示的图像。
[*]提供一个按钮,当用户点击按钮时,能生存调整后的图像。
代码:
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()) https://i-blog.csdnimg.cn/direct/f19a1db0539a4d5fb09ad6c24a15b07d.pnghttps://i-blog.csdnimg.cn/direct/9060da64d60f4932a5a9987097a4fcc4.png
https://i-blog.csdnimg.cn/direct/18fee8918eff482ba7f07c3dffd0c8ef.png 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: OpenCV和PyQt的应用