OpenCV在PyQt5中通过按钮从本地获取图像并显示
步骤:
(1)在Pyqt5的qtdesigner中使用可视化设计出面板
(2)在pycharm的terminal或者cmd中输入 pyuic5 1.ui -o test.py,将得到的ui文件转换为py文件,在该py文件中会自动生成代码
(3)调用模块
import sys
from PyQt5 import QtCore,QtWidgets
import cv2.cv2 as cv
(4)定义button和显示路径用的label
#定义按钮,命名为Get_Url
self.Get_Url = QtWidgets.QPushButton(self.centralwidget)
#centralwidget会自动生成
self.Get_Url.setGeometry(QtCore.QRect(110,480,171,28))
self.Get_Url.setObjectName('Get_Url')
#定义标签,命名为The_Url
self.The_Url = QWidgets.QPushButton(self.centralwidget)
self.The_Url.setGeometry(QtCore.QRect(80,340,601,16))
self.The_Url.setObjectName('The_Url')
(5)定义函数从文件中获取图像路径
def From_files(self):
the_image_url = QtWidgets.QFileDialog.getOpenFileName(None,'select image','','')
url = str(the_image_url).split("'")
self.The_Url.setText(QtCore.QCoreApplication.translate("MainWindow","路径:" + url[1]))
(6)设置点击按钮后的函数信号
#在setupUi函数中书写:
self.Get_Url.clicked.connect(self.From_files)
此时,已经可以将点击按钮然后在文件中选择的图像的路径显示在窗体中了,如图所示:
但是要直接通过cv.imread()函数调用还不行,因为此时我们只得到了这样一串字符:
也就是说,我们需要的是第一个冒号之后的这串字符,则需要对这个字符串进行切割,我使用了列表的方法:
#首先定义用于显示图像的函数
def OpenCV_Sight(self):
img = cv.imread(self.The_Url.text().split(":")[1]+":"+self.The_Url.text().split(":")[2])
cv.imshow('img',img)
此时,cv.imread()函数已经获取到了可以使用的图像地址,再定义一个按钮用于显示图像:
self.OpenImage = QWidgets.QPushButton(self.centralwidget)
self.OpenImage.setGeometry(QtCore.QRect(110,400,171,28))
self.OpenInmage.setObjectName("OpenImage")
由于这个部件是后来加上的,需要在函数retranslateUi()中添加一行:
self.OpenImage.setText(_translate("MainWindow","显示图像"))
#函数retranslateUi()会自动生成
此时运行查看结果:
已经有了新出现的按钮,最后一步,再次定义函数信号,将刚才新加的按钮链接到OpenCV_Sight函数中:
self.OpenImage.clicked.connect(self.OpenCV_Sight)
运行查看结果:
点击之后可以出现图像,目的达成。
完整代码:
import cv2.cv2 as cv
from PyQt5 import QtCore, QtGui, QtWidgets
import sys
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.Get_Url = QtWidgets.QPushButton(self.centralwidget)
self.Get_Url.setGeometry(QtCore.QRect(110, 480, 171, 28))
self.Get_Url.setObjectName("Get_Url")
self.The_Url = QtWidgets.QLabel(self.centralwidget)
self.The_Url.setGeometry(QtCore.QRect(80, 340, 601, 16))
self.The_Url.setObjectName("The_Url")
self.OpenImage = QtWidgets.QPushButton(self.centralwidget)
self.OpenImage.setGeometry(QtCore.QRect(110,400,171,28))
self.OpenImage.setObjectName("OpenImage")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
#设置点击按钮后的函数信号
self.Get_Url.clicked.connect(self.From_files)
self.OpenImage.clicked.connect(self.OpenCV_Sight)
def From_files(self):
the_image_url = QtWidgets.QFileDialog.getOpenFileName(None, 'select image', '', '')
url = str(the_image_url).split("'")
self.The_Url.setText(QtCore.QCoreApplication.translate("MainWindow", "路径:" + url[1]))
def OpenCV_Sight(self):
img = cv.imread(self.The_Url.text().split(":")[1]+":"+self.The_Url.text().split(":")[2])
cv.imshow('img',img)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.Get_Url.setText(_translate("MainWindow", "获取图像地址"))
self.The_Url.setText(_translate("MainWindow", "路径:未获取"))
self.OpenImage.setText(_translate("MainWindow","显示图像"))
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())