import sys import cv2 import numpy as np from PySide2.QtCore import * from PySide2.QtGui import * from PySide2.QtWidgets import * class Ui_MainWindow(object): def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName(u"MainWindow") MainWindow.resize(1000, 800) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName(u"centralwidget") self.pushButton = QPushButton(self.centralwidget) self.pushButton.setObjectName(u"pushButton") self.pushButton.setGeometry(QRect(750, 500, 201, 71)) self.graphicsView = QGraphicsView(self.centralwidget) self.graphicsView.setObjectName(u"graphicsView") self.graphicsView.setGeometry(QRect(90, 80, 401, 400)) self.pushButton_2 = QPushButton(self.centralwidget) self.pushButton_2.setObjectName(u"pushButton_2") self.pushButton_2.setGeometry(QRect(100, 500, 201, 71)) self.graphicsView_2 = QGraphicsView(self.centralwidget) self.graphicsView_2.setObjectName(u"graphicsView_2") self.graphicsView_2.setGeometry(QRect(520, 80, 401, 400)) self.comboBox = QComboBox(self.centralwidget) self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.addItem("") self.comboBox.setObjectName(u"comboBox") self.comboBox.setGeometry(QRect(150, 620, 101, 31)) self.label = QLabel(self.centralwidget) self.label.setObjectName(u"label") self.label.setGeometry(QRect(150, 580, 200, 31)) self.pushButton_3 = QPushButton(self.centralwidget) self.pushButton_3.setObjectName(u"pushButton_3") self.pushButton_3.setGeometry(QRect(750, 600, 201, 71)) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setObjectName(u"menubar") self.menubar.setGeometry(QRect(0, 0, 1000, 23)) MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName(u"statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QMetaObject.connectSlotsByName(MainWindow) # setupUi def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None)) self.pushButton.setText(QCoreApplication.translate("MainWindow", u"转换", None)) self.pushButton_2.setText(QCoreApplication.translate("MainWindow", u"选择图片路径", None)) self.comboBox.setItemText(0, "") self.comboBox.setItemText(1, QCoreApplication.translate("MainWindow", u"呐喊", None)) self.comboBox.setItemText(2, QCoreApplication.translate("MainWindow", u"星空", None)) self.comboBox.setItemText(3, QCoreApplication.translate("MainWindow", u"镶嵌风", None)) self.comboBox.setItemText(4, QCoreApplication.translate("MainWindow", u"构图VII", None)) self.comboBox.setItemText(5, QCoreApplication.translate("MainWindow", u"The muse", None)) self.comboBox.setItemText(6, QCoreApplication.translate("MainWindow", u"udnie", None)) self.comboBox.setItemText(7, QCoreApplication.translate("MainWindow", u"神奈川冲浪里", None)) self.label.setText(QCoreApplication.translate("MainWindow", u"请选择图片风格", None)) self.pushButton_3.setText(QCoreApplication.translate("MainWindow", u"保存转换后图片", None)) # retranslateUi class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self): super(MainWindow, self).__init__() self.setupUi(self) self.image = None self.transformed_image = None #转换 self.pushButton.clicked.connect(self.transform_image) self.pushButton_2.clicked.connect(self.load_image) self.pushButton_3.clicked.connect(self.save_image) def load_image(self): options = QFileDialog.Options() options |= QFileDialog.ReadOnly file_name, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Images (*.png *.xpm *.jpg);;All Files (*)", options=options) if file_name: self.image = cv2.imread(file_name) self.display_image(self.image, self.graphicsView) def display_image(self, img, view): img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) h, w = view.height(), view.width() img_resized = cv2.resize(img_rgb, (w, h)) h, w, ch = img_resized.shape bytes_per_line = ch * w q_img = QImage(img_resized.data, w, h, bytes_per_line, QImage.Format_RGB888) pixmap = QPixmap.fromImage(q_img) scene = QGraphicsScene() scene.addItem(QGraphicsPixmapItem(pixmap)) view.setScene(scene) def transform_image(self): # 检查图像是否已加载 if self.image is not None: #获取用户选择的风格 style = self.comboBox.currentIndex() #使用OpenCV的深度学习模块cv2.dnn来加载预训练的神经网络模型 if style == 1: #net = cv2.dnn.readNetFromTorch('../models/the_scream.t7') 因为exe文件在exe目录下,所以需要改一下路径,打包的时候使用的是这行。 net = cv2.dnn.readNetFromTorch('./models/the_scream.t7') elif style == 2: net = cv2.dnn.readNetFromTorch('./models/starry_night.t7') elif style == 3: net = cv2.dnn.readNetFromTorch('./models/mosaic.t7') elif style == 4: net = cv2.dnn.readNetFromTorch('./models/composition_vii.t7') elif style == 5: net = cv2.dnn.readNetFromTorch('./models/la_muse.t7') elif style == 6: net = cv2.dnn.readNetFromTorch('./models/udnie.t7') elif style == 7: net = cv2.dnn.readNetFromTorch('./models/the_wave.t7') else: QMessageBox.warning(self, "Warning", "请选择一个风格") return # 获取图像的高度和宽度 (h, w) = self.image.shape[:2] # 将图像转换为blob,用于神经网络输入 blob = cv2.dnn.blobFromImage(self.image, 1.0, (w, h), (103.939, 116.779, 123.680), swapRB=False, crop=False) net.setInput(blob) out = net.forward() # 得到输出 out = out.reshape(3, out.shape[2], out.shape[3]) #恢复均值 out[0] += 103.939 out[1] += 116.779 out[2] += 123.68 #调整通道的顺序 out = out.transpose(1, 2, 0) self.transformed_image = np.clip(out, 0, 255).astype('uint8') self.display_image(self.transformed_image, self.graphicsView_2) def save_image(self): if self.transformed_image is not None: options = QFileDialog.Options() options |= QFileDialog.ShowDirsOnly file_name, _ = QFileDialog.getSaveFileName(self, "保存图片", "", "Images (*.png *.xpm *.jpg);;All Files (*)", options=options) if file_name: cv2.imwrite(file_name, self.transformed_image) else: QMessageBox.warning(self, "Warning", "没有转换后的图片可保存") if __name__ == "__main__": app = QApplication(sys.argv) mainWin = MainWindow() mainWin.show() sys.exit(app.exec_())