PyQt5从零到有(附案例:将视频切成图片)

参考博文:超全!Python图形界面框架PyQt5使用指南! - 知乎

https://www.cnblogs.com/yunxiaofei/p/10804747.html

1、PyQt5安装
pip install pyqt5

pip install pyqt5-tools

我运行pip install pyqt5之后提示pyqt已经安装过了,根据提示安装的目录确实找到了pyqt

运行pip install pyqt5-tools成功安装,具体信息见下图:

2、启动qt designer

C:\Users\DIY-PC\AppData\Local\Programs\Python\Python38\Lib\site-packages\qt5_applications\Qt\bin

上面是我的存放地址

设计成这样:

3、ui转化为python

保存后将生成的.ui文件转化成.py文件,cmd命令行(快捷键win+r)中输入:

C:\Users\DIY-PC\AppData\Local\Programs\Python\Python38\python.exe -m PyQt5.uic.pyuic D:\python\pyqt\ui\screenshot.ui -o D:\python\pyqt\ui\screenshot.py

生成成功:

4、修改完善代码

5、完整代码

项目结构:

screenshot.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'D:\python\pyqt\ui\screenshot.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 300)
        self.confirm = QtWidgets.QDialogButtonBox(Dialog)
        self.confirm.setGeometry(QtCore.QRect(30, 240, 341, 32))
        self.confirm.setOrientation(QtCore.Qt.Horizontal)
        self.confirm.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.confirm.setObjectName("confirm")
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(30, 20, 54, 12))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(Dialog)
        self.label_2.setGeometry(QtCore.QRect(30, 50, 54, 12))
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(Dialog)
        self.label_3.setGeometry(QtCore.QRect(30, 80, 54, 20))
        self.label_3.setObjectName("label_3")
        self.pattern = QtWidgets.QComboBox(Dialog)
        self.pattern.setGeometry(QtCore.QRect(90, 80, 69, 22))
        self.pattern.setObjectName("pattern")
        self.pattern.addItem("")
        self.pattern.addItem("")
        self.inputdir = QtWidgets.QLineEdit(Dialog)
        self.inputdir.setGeometry(QtCore.QRect(90, 20, 281, 20))
        self.inputdir.setObjectName("inputdir")
        self.outputdir = QtWidgets.QLineEdit(Dialog)
        self.outputdir.setGeometry(QtCore.QRect(90, 50, 281, 20))
        self.outputdir.setObjectName("outputdir")
        self.output = QtWidgets.QTextEdit(Dialog)
        self.output.setGeometry(QtCore.QRect(30, 130, 341, 101))
        self.output.setObjectName("output")

        self.retranslateUi(Dialog)
        self.confirm.accepted.connect(Dialog.accept) # type: ignore
        self.confirm.rejected.connect(Dialog.clearText) # type: ignore
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.label.setText(_translate("Dialog", "视频路径:"))
        self.label_2.setText(_translate("Dialog", "输出路径:"))
        self.label_3.setText(_translate("Dialog", "截取模式:"))
        self.pattern.setCurrentText(_translate("Dialog", "按帧"))
        self.pattern.setItemText(0, _translate("Dialog", "按帧"))
        self.pattern.setItemText(1, _translate("Dialog", "按秒"))

 main.py

import sys
import os
import cv2
import screenshot

from PyQt5.QtWidgets import QApplication, QDialog

import requests

class MainDialog(QDialog):

    def __init__(self, parent=None):

        super(QDialog, self).__init__(parent)

        self.ui = screenshot.Ui_Dialog()

        self.ui.setupUi(self)

    def accept(self):
        video_path=self.ui.inputdir.text()
        f_save_path=self.ui.outputdir.text()
        maskText = self.ui.pattern.currentText()

        mask = self.getCode(maskText)
        frame_interval = 2  # 设置帧率间隔
        time_interval = 1  # 设置时间间隔(单位:s)
     
        if (mask == 1):
            print("当前模式:按照帧率截取视频\n帧率间隔:"+str(frame_interval))
        elif (mask == 2):
            print("当前模式:按照时间截取视频\n时间间隔:"+str(time_interval)+"s")
     
        videos = os.listdir(video_path)
        for video_name in videos:
            file_name = video_name.split('.')[0]  # 拆分视频文件名称 ,剔除后缀
            folder_name = f_save_path + file_name  # 保存图片的上级目录+对应每条视频名称 构成新的目录存放每个视频
            os.makedirs(folder_name, exist_ok=True)  # 创建存放视频的对应目录
            vc = cv2.VideoCapture(video_path + video_name)  # 读入视频文件
            fps = vc.get(cv2.CAP_PROP_FPS)  # 获取当前视频帧率
            rval = vc.isOpened()  # 判断视频是否打开
            print(video_path + video_name)
            c = 1
            while rval:  # 循环读取视频帧
                rval, frame = vc.read()  # videoCapture.read() 函数,第一个返回值为是否成功获取视频帧,第二个返回值为返回的视频帧;
                pic_path = folder_name + '/'
                if rval:
                    if(mask == 1):
                        if (c % round(frame_interval) == 0):  # 每隔frame_interval帧存储一次
     
                            cv2.imencode('.jpg', frame)[1].tofile(
                                pic_path + file_name + '_' + str(round(c / frame_interval)) + '.jpg')  # 中文路径也可以保存
     
                            #print(file_name + '_' + str(round(c / frame_interval)) + '.jpg')
                        cv2.waitKey(1)
                        c = c + 1
                    elif(mask == 2):
                        if (c % (round(fps)*time_interval) == 0):  # 每隔time_interval秒存储一次
                            cv2.imencode('.jpg', frame)[1].tofile(
                                pic_path + file_name + '_' + str(round(c / fps)) + '.jpg')
                            print(file_name + '_' + str(round(c / fps)) + '.jpg')
                        cv2.waitKey(1)
                        c = c + 1
                else:
                    break
            vc.release()
            outputText=('save_success:' + folder_name)
        

        self.ui.output.setText(outputText)

    def getCode(self, cityName):

        cityDict = {"按帧": 1,

                    "按秒": 2}

        return cityDict[cityName]

    def clearText(self):

        self.ui.textEdit.clear()

if __name__ == '__main__':

    myapp = QApplication(sys.argv)

    myDlg = MainDialog()

    myDlg.show()

    sys.exit(myapp.exec_())
6、运行效果

 

 

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值