OpenCV和PyQt的应用

打印 上一主题 下一主题

主题 858|帖子 858|积分 2574

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


  • 利用 OpenCV 加载一张图像。
  • 在 PyQt 的窗口中显示这张图像。
  • 提供四个按钮(QPushButton):


  • 一个用于将图像转换为灰度图
  • 一个用于将图像恢复为原始彩色图
  • 一个用于将图像进行翻转
  • 一个用于将图像进行旋转
  • 当用户点击按钮时,相应地更新窗口中显示的图像。
代码:
  1. import sys
  2. import cv2
  3. from PyQt6.QtGui import QPixmap, QImage
  4. from PyQt6.QtWidgets import QApplication, QLabel
  5. from PyQt6 import uic
  6. # 全局变量保存当前图像
  7. current_image = None
  8. # 处理图像的函数
  9. def gray():
  10.     global current_image
  11.     if current_image is not None:
  12.         img_gray = cv2.cvtColor(current_image, cv2.COLOR_BGR2GRAY)
  13.         img_rgb = cv2.cvtColor(img_gray, cv2.COLOR_GRAY2RGB)
  14.         current_image = img_rgb  # 更新当前图像
  15.         # 转换为 QPixmap 显示
  16.         h, w, ch = img_rgb.shape
  17.         bytes_per_line = 3 * w
  18.         q_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
  19.         ui.label.setPixmap(QPixmap.fromImage(q_img))
  20.         ui.label.setScaledContents(True)
  21.     else:
  22.         print("图像加载失败")
  23. def img_RGB():
  24.     global current_image
  25.     img = cv2.imread('./1.png')  # 重新加载原图
  26.     if img is not None:
  27.         img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  28.         current_image = img_rgb  # 更新当前图像
  29.         # 转换为 QPixmap 显示
  30.         h, w, ch = img_rgb.shape
  31.         bytes_per_line = 3 * w
  32.         q_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
  33.         ui.label.setPixmap(QPixmap.fromImage(q_img))
  34.         ui.label.setScaledContents(True)
  35.     else:
  36.         print("图像加载失败")
  37. def fanzhuan():
  38.     global current_image
  39.     if current_image is not None:
  40.         current_image = cv2.flip(current_image, 1)  # 水平翻转
  41.         # 转换为 RGB 以便显示
  42.         img_rgb = cv2.cvtColor(current_image, cv2.COLOR_BGR2RGB)
  43.         h, w, ch = img_rgb.shape
  44.         bytes_per_line = 3 * w
  45.         q_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
  46.         ui.label.setPixmap(QPixmap.fromImage(q_img))
  47.         ui.label.setScaledContents(True)
  48.     else:
  49.         print("图像加载失败")
  50. def xuanzhuan():
  51.     global current_image
  52.     if current_image is not None:
  53.         h, w = current_image.shape[:2]
  54.         center = (w // 2, h // 2)
  55.         angle = 90  # 旋转角度
  56.         M = cv2.getRotationMatrix2D(center, angle, 1.0)
  57.         current_image = cv2.warpAffine(current_image, M, (w, h))
  58.         # 转换为 RGB 以便显示
  59.         img_rgb = cv2.cvtColor(current_image, cv2.COLOR_BGR2RGB)
  60.         h, w, ch = img_rgb.shape
  61.         bytes_per_line = 3 * w
  62.         q_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
  63.         ui.label.setPixmap(QPixmap.fromImage(q_img))
  64.         ui.label.setScaledContents(True)
  65.     else:
  66.         print("图像加载失败")
  67. if __name__ == '__main__':
  68.     app = QApplication(sys.argv)
  69.     # 加载 UI 文件
  70.     ui = uic.loadUi('./form.ui')
  71.     # 初始加载图像
  72.     img = cv2.imread('./1.png')
  73.     if img is not None:
  74.         img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  75.         current_image = img_rgb  # 保存原始图像为当前图像
  76.         # 转换为 QPixmap 显示
  77.         h, w, ch = img_rgb.shape
  78.         bytes_per_line = 3 * w
  79.         q_img = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
  80.         ui.label.setPixmap(QPixmap.fromImage(q_img))
  81.         ui.label.setScaledContents(True)
  82.     # 信号与槽的连接
  83.     ui.btn1.clicked.connect(gray)  # 灰度转换
  84.     ui.btn2.clicked.connect(img_RGB)  # 恢复 RGB
  85.     ui.btn3.clicked.connect(fanzhuan)  # 水平翻转
  86.     ui.btn4.clicked.connect(xuanzhuan)  # 旋转
  87.     ui.show()
  88.     sys.exit(app.exec())
复制代码

 


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


  • 利用 OpenCV 加载一张彩色图像,并在 PyQt 的窗口中显示它。
  • 提供一个滑动条(QSlider),答应用户调整图像的亮度。
  • 当用户调整滑动条时,及时更新窗口中显示的图像亮度。
  • 添加另一个滑动条(QSlider),答应用户调整图像的对比度。
  • 当用户调整滚动条时,及时更新窗口中显示的图像对比度。
  • 提供一个按钮(QPushButton),答应用户将图像生存为新的文件。
  • 当用户点击生存按钮时,将调整后的图像生存到指定的路径,OpenCV中利用cv2.imwrite()来生存图片。
代码:
  1. import cv2
  2. from PyQt6 import uic
  3. from PyQt6.QtGui import QImage, QPixmap
  4. from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QSlider
  5. import sys
  6. class MyWidget(QWidget):
  7.     def __init__(self):
  8.         super().__init__()
  9.         ui = uic.loadUi("form2.ui", self)
  10.         self.img: QLabel = ui.img
  11.         # 图片亮度调整
  12.         self.gamer: QSlider = ui.gamer
  13.         self.gamer.setMinimum(-100)  # 设置亮度最小值
  14.         self.gamer.setMaximum(100)  # 设置亮度最大值
  15.         self.gamer.setValue(0)  # 设置初始值为 0
  16.         self.gamer.valueChanged.connect(self.gamer_slot)
  17.         # 图片对比度调整
  18.         self.contrast: QSlider = ui.contrast_radio
  19.         self.contrast.setMinimum(1)  # 设置对比度最小值
  20.         self.contrast.setMaximum(100)  # 设置对比度最大值
  21.         self.contrast.setValue(50)  # 设置初始值为 50
  22.         self.contrast.valueChanged.connect(self.contrast_slot)
  23.         # 保存图片
  24.         self.save: QPushButton = ui.save
  25.         self.save.clicked.connect(self.save_slot)
  26.         # 读取图片
  27.         self.img_data = cv2.imread("flower.png")
  28.         self.display_image(self.img_data)
  29.         # 初始亮度和对比度增量
  30.         self.initial_brightness = 0
  31.         self.initial_contrast = 1.0
  32.     def gamer_slot(self):
  33.         # 计算亮度变化
  34.         brightness_change = self.gamer.value() - self.initial_brightness
  35.         self.initial_brightness = self.gamer.value()
  36.         # 使用 addWeighted 来调整亮度
  37.         self.img_data = cv2.addWeighted(self.img_data, 1.0, 0, 0, brightness_change)
  38.         self.display_image(self.img_data)
  39.     def contrast_slot(self):
  40.         # 计算对比度变化
  41.         contrast_change = self.contrast.value() - self.initial_contrast
  42.         self.initial_contrast = self.contrast.value()
  43.         # 根据对比度调整图像
  44.         alpha = 1 + (contrast_change / 100.0)  # 控制对比度变化的灵敏度
  45.         self.img_data = cv2.convertScaleAbs(self.img_data, alpha=alpha, beta=0)
  46.         self.display_image(self.img_data)
  47.     def save_slot(self):
  48.         cv2.imwrite("flower2.png", self.img_data)
  49.     def display_image(self, img):
  50.         if len(img.shape) == 2:  # 灰度图没有 color channels
  51.             img_rgb = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
  52.         else:
  53.             img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  54.         # 转换为 QPixmap
  55.         h, w, ch = img_rgb.shape
  56.         bytes_per_line = ch * w
  57.         q_image = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
  58.         # 显示图像
  59.         self.img.setPixmap(QPixmap.fromImage(q_image))
  60.         self.img.setScaledContents(True)
  61. if __name__ == "__main__":
  62.     app = QApplication(sys.argv)
  63.     myWin = MyWidget()
  64.     myWin.show()
  65.     sys.exit(app.exec())
复制代码


 

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


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


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

  • 当用户点击下拉列表选项时,相应地更新窗口中显示的图像。
  • 提供一个按钮,当用户点击按钮时,能生存调整后的图像。
代码:
  1. import cv2
  2. from PyQt6.QtGui import QImage, QPixmap
  3. from PyQt6.QtWidgets import QApplication, QWidget, QPushButton, QLabel, QComboBox
  4. from PyQt6 import uic
  5. import sys
  6. class MyWidget(QWidget):
  7.     def __init__(self):
  8.         super().__init__()
  9.         ui = uic.loadUi("form3.ui", self)
  10.         self.img: QLabel = ui.label
  11.         self.combox: QComboBox = ui.comboBox
  12.         self.save: QPushButton = ui.save
  13.         # 添加选项到下拉列表
  14.         self.combox.addItems(["原图", "模糊", "锐化", "边缘检测"])
  15.         # 加载图像
  16.         self.img_data = cv2.imread("flower.png")
  17.         self.modified_img = self.img_data  # 当前显示的图像
  18.         self.display_image(self.img_data)
  19.         # 信号与槽连接
  20.         self.combox.currentIndexChanged.connect(self.combox_slot)
  21.         self.save.clicked.connect(self.save_image)
  22.     def combox_slot(self, index):
  23.         if index == 0:
  24.             img = self.img_data
  25.         elif index == 1:
  26.             img = cv2.GaussianBlur(self.img_data, (5, 5), 0)
  27.         elif index == 2:
  28.             img = cv2.Laplacian(self.img_data, -1)
  29.         elif index == 3:
  30.             img = cv2.Canny(self.img_data, 100, 200)
  31.         self.modified_img = img  # 更新当前显示的图像
  32.         self.display_image(img)
  33.     def display_image(self, img):
  34.         if len(img.shape) == 2:  # 灰度图没有 color channels
  35.             img_rgb = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
  36.         else:
  37.             img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  38.         # 转换为 QPixmap
  39.         h, w, ch = img_rgb.shape
  40.         bytes_per_line = ch * w
  41.         q_image = QImage(img_rgb.data, w, h, bytes_per_line, QImage.Format.Format_RGB888)
  42.         # 显示图像
  43.         self.img.setPixmap(QPixmap.fromImage(q_image))
  44.         self.img.setScaledContents(True)
  45.     def save_image(self):
  46.         if self.modified_img is not None:
  47.             cv2.imwrite("output.png", self.modified_img)
  48.             print("图像已保存为 output.png")
  49. if __name__ == "__main__":
  50.     app = QApplication(sys.argv)
  51.     window = MyWidget()
  52.     window.show()
  53.     sys.exit(app.exec())
复制代码

 

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

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表