以前学习PyQt5的时候做过的一个小程序,现在也把它整理上来。
这是运行时的主界面
主要功能类似与常用的看图软件,因为最初我的想法是把他做成一个功能比较类似PS的软件,所以当时名字设成了MyPS,结果仅仅完成了九牛一毛。。。
以下是完整代码:
1.CVshopmainwindow.py
从designer设计界面,转成的代码。主要是定义了主窗口以及一些信号槽
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'CVshopmainwindow.ui'
#
# Created by: PyQt5 UI code generator 5.11.2
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(900, 600)
MainWindow.setMinimumSize(QtCore.QSize(900, 600))
MainWindow.setMaximumSize(QtCore.QSize(900, 600))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setText("")
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 900, 23))
self.menubar.setObjectName("menubar")
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName("menu")
self.menuOpen = QtWidgets.QMenu(self.menu)
self.menuOpen.setObjectName("menuOpen")
self.menuTools = QtWidgets.QMenu(self.menubar)
self.menuTools.setObjectName("menuTools")
self.menuVideo = QtWidgets.QMenu(self.menubar)
self.menuVideo.setObjectName("menuVideo")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.toolBar = QtWidgets.QToolBar(MainWindow)
self.toolBar.setObjectName("toolBar")
MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
self.actionExit = QtWidgets.QAction(MainWindow)
self.actionExit.setObjectName("actionExit")
self.actionRotate = QtWidgets.QAction(MainWindow)
self.actionRotate.setObjectName("actionRotate")
self.actionFlip = QtWidgets.QAction(MainWindow)
self.actionFlip.setObjectName("actionFlip")
self.actionCamera = QtWidgets.QAction(MainWindow)
self.actionCamera.setObjectName("actionCamera")
self.actionFile = QtWidgets.QAction(MainWindow)
self.actionFile.setObjectName("actionFile")
self.actionSnip = QtWidgets.QAction(MainWindow)
self.actionSnip.setObjectName("actionSnip")
self.actionZoomIn = QtWidgets.QAction(MainWindow)
self.actionZoomIn.setObjectName("actionZoomIn")
self.actionZoomOut = QtWidgets.QAction(MainWindow)
self.actionZoomOut.setObjectName("actionZoomOut")
self.actionSaveAs = QtWidgets.QAction(MainWindow)
self.actionSaveAs.setObjectName("actionSaveAs")
self.actionSave = QtWidgets.QAction(MainWindow)
self.actionSave.setObjectName("actionSave")
self.actionRecord = QtWidgets.QAction(MainWindow)
self.actionRecord.setObjectName("actionRecord")
self.menuOpen.addAction(self.actionFile)
self.menuOpen.addAction(self.actionCamera)
self.menu.addAction(self.menuOpen.menuAction())
self.menu.addAction(self.actionSave)
self.menu.addAction(self.actionSaveAs)
self.menu.addAction(self.actionExit)
self.menuTools.addAction(self.actionFlip)
self.menuTools.addAction(self.actionRotate)
self.menuTools.addAction(self.actionZoomIn)
self.menuTools.addAction(self.actionZoomOut)
self.menuVideo.addAction(self.actionSnip)
self.menuVideo.addAction(self.actionRecord)
self.menubar.addAction(self.menu.menuAction())
self.menubar.addAction(self.menuTools.menuAction())
self.menubar.addAction(self.menuVideo.menuAction())
self.toolBar.addAction(self.actionSnip)
self.toolBar.addAction(self.actionFlip)
self.toolBar.addAction(self.actionRotate)
self.retranslateUi(MainWindow)
self.actionExit.triggered.connect(MainWindow.close)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.menu.setTitle(_translate("MainWindow", "File"))
self.menuOpen.setTitle(_translate("MainWindow", "Open"))
self.menuTools.setTitle(_translate("MainWindow", "Tools"))
self.menuVideo.setTitle(_translate("MainWindow", "Video"))
self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
self.actionExit.setText(_translate("MainWindow", "Exit"))
self.actionRotate.setText(_translate("MainWindow", "Rotate"))
self.actionFlip.setText(_translate("MainWindow", "Flip"))
self.actionCamera.setText(_translate("MainWindow", "Camera"))
self.actionFile.setText(_translate("MainWindow", "File"))
self.actionFile.setShortcut(_translate("MainWindow", "Ctrl+O"))
self.actionSnip.setText(_translate("MainWindow", "Snip"))
self.actionZoomIn.setText(_translate("MainWindow", "Zoom In"))
self.actionZoomOut.setText(_translate("MainWindow", "Zoom Out"))
self.actionSaveAs.setText(_translate("MainWindow", "Save as"))
self.actionSaveAs.setToolTip(_translate("MainWindow", "Save File"))
self.actionSaveAs.setShortcut(_translate("MainWindow", "F2"))
self.actionSave.setText(_translate("MainWindow", "Save"))
self.actionSave.setToolTip(_translate("MainWindow", "Save Image"))
self.actionSave.setShortcut(_translate("MainWindow", "Ctrl+S"))
self.actionRecord.setText(_translate("MainWindow", "Record"))
2.MyPS.py
#!/usr/bin/python
#coding:utf-8
"""
@author: SPRATUMN
@software: PyCharm
@file: MyPS.py
@time: 2018/9/16 22:02
"""
import CVshopmainwindow
import cv2 as cv
import numpy as np
import sys
from PyQt5.QtWidgets import QMainWindow, QMessageBox, QFileDialog, QApplication
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import Qt
# 主窗口类,继承窗口Ui_MainWindow主界面
class MyPS(QMainWindow, CVshopmainwindow.Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
# 窗口属性修改
self.setWindowTitle('PS')
self.label.setAlignment(Qt.AlignCenter)
self.actionSnip.setDisabled(True)
self.actionRecord.setDisabled(True)
# 实例属性初始化
self.cap = cv.VideoCapture(0)
self.fName = ''
self.mat = np.zeros([1, 1, 3], np.uint8)
# 信号槽连接
self.actionFile.triggered.connect(self.load_file)
self.actionCamera.triggered.connect(self.open_camera)
self.actionRotate.triggered.connect(self.rotate_image)
self.actionFlip.triggered.connect(self.flip_image)
self.actionSnip.triggered.connect(self.snip_image)
self.actionRecord.triggered.connect(self.record_camera)
# 加载文件,根据后缀判断文件类型
def load_file(self):
if self.cap.isOpened():
self.cap.release()
self.actionSnip.setDisabled(True)
self.fName = QFileDialog.getOpenFileName(self, 'Open File', './',
'Image Files (*.png *.jpg *.bmp);;Video Files (*.mp4 *.mkv)')
if self.fName[0].endswith('png') or self.fName[0].endswith('jpg') or self.fName[0].endswith('bmp'):
self.mat = cv.imread(self.fName[0])
self.display_image(self.mat)
elif self.fName[0].endswith('mp4') or self.fName[0].endswith('mkv'):
QMessageBox.warning(self, 'Warning', 'video file', QMessageBox.Ok)
self.cap.open(self.fName[0])
while self.cap.isOpened():
self.actionSnip.setEnabled(True)
self.actionRecord.setEnabled(True)
ret, cam_img = self.cap.read()
if ret:
self.display_image(cam_img)
cv.waitKey(33)
# 打开摄像头
def open_camera(self):
self.cap = cv.VideoCapture(0)
if self.cap.isOpened():
self.cap.release()
if self.cap.open(0):
while self.cap.isOpened():
self.actionSnip.setEnabled(True)
self.actionRecord.setEnabled(True)
ret, cam_img = self.cap.read()
if ret:
self.display_image(cam_img)
cv.waitKey(33)
else:
QMessageBox.warning(self, 'Error', 'Open camera fail', QMessageBox.Ok)
# 录制摄像头视频
def record_camera(self):
pass
# 获取视频当前帧的图片
def snip_image(self):
if self.cap.isOpened():
ret, self.mat = self.cap.read()
if ret:
self.actionSnip.setDisabled(True)
self.actionRecord.setDisabled(True)
self.display_image(self.mat)
self.cap.release()
# 使用label显示图片
def display_image(self, imge):
height, width, channels = imge.shape
if height > 400 or width > 800:
rate = height / 400 if height / 400 > width / 800 else width / 800
width = int(width / rate)
height = int(height / rate)
img = cv.resize(imge, (width, height))
else:
img = imge
self.statusbar.showMessage('img size:({},{})'.format(width, height))
self.statusbar.show()
line_bytes = channels * width
qt_image = cv.cvtColor(img, cv.COLOR_BGR2RGB)
label_image: QImage = QImage(qt_image.data, width, height, line_bytes, QImage.Format_RGB888)
self.label.setPixmap(QPixmap.fromImage(label_image))
def mousePressEvent(self, event):
print('clicked at (', event.x(), ',', event.y(), ')')
def closeEvent(self, *args, **kwargs):
self.cap.release()
def rotate_image(self):
self.mat = cv.transpose(self.mat)
self.mat = cv.flip(self.mat, 1)
self.display_image(self.mat)
def flip_image(self):
self.mat = cv.flip(self.mat, 1)
self.display_image(self.mat)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MyPS()
w.show()
sys.exit(app.exec_())