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]