Python-pyqt5+opencv视频播放器,上传本地视频(三)_pyqt5opencv_醉公子~的博客-程序员宅基地

技术标签: python  qt  exe  PyQt5  pyqt5  opencv  

在这里我们基于Python-Windows+Pycharm+PyQt5基础环境配置,1000%解决你的环境问题(一)的学习,我们搭建好PyQt5的基础环境,这里我们将进行制作一个简单的软件-----视频播放器;

基础环境:

  • Windows10
  • pycharm2019.3.4
  • python3.7.3
  • PyQt5
  • OpenCV4.5.1

在这里插入图片描述

在这里介绍几个重要的函数(方法)

1. getOpenFileName

videoName, _ = QFileDialog.getOpenFileName(self, "Open", "", "*.avi;;*.mp4;;All Files(*)")

QFileDialog.getOpenFileName (

      QWidget * parent = 0, #用于指定父组件

      const QString & caption = QString(),#对话框的标题;

      const QString & dir = QString(),#是对话框显示时默认打开的目录,"." 代表程序运行目录,"/" 代表当前盘符的根目录(Windows,Linux下/就是根目录了),
      也可以是平台相关的,比如"C:\\"等;例如我想打开程序运行目录下的Data文件夹作为默认打开路径,这里应该写成"./Data/",
      若想有一个默认选中的文件,则在目录后添加文件名即可:"./Data/teaser.graph"

      const QString & filter = QString(),#是对话框的后缀名过滤器,比如我们使用"Image Files(*.jpg *.png)"就让它只能显示后缀名是jpg或者png的文件。
      如果需要使用多个过滤器,使用";;"分割,比如"JPEG Files(*.jpg);;PNG Files(*.png)"

      QString * selectedFilter = 0,#是默认选择的过滤器

      Options options = 0 #是对话框的一些参数设定,比如只显示文件夹等等,它的取值是enum QFileDialog::Option,
      每个选项可以使用 | 运算组合起来。
      )

第一个返回值imgName记录选中的文件路径+文件名;
第二个返回值imgType记录文件的类型;
eg:在这里插入图片描述

2. QImage

from PyQt5.QtGui import *
q_image = QImage(frame.data,#img
				 width, #获取原始图片的宽
				 height,#获取原始图片的高
				 bytesPerLine,#通道
                 QImage.Format_RGB888).scaled(self.label.width().self.label.height())#转化为RGB,并把在label上展示的图片修改大小(使用scaled()方法)

在这里简单介绍一下Qpixmap类的常用方法
在这里插入图片描述

3. setPixmap / setText

setPixmap 是给label”赋值“(展示图片)
setText方法就是给文本框赋值

上才艺:

import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

import cv2
from PyQt5.QtCore import QTimer


class Video(QWidget):

    def __init__(self):
        super(Video, self).__init__()
        self.frame = []  # 存图片
        self.detectFlag = False  # 检测flag
        self.cap = []
        self.timer_camera = QTimer()  # 定义定时器

        # 外框
        self.resize(900, 650)
        self.setWindowTitle("Head Detection")
        # 图片label
        self.label = QLabel(self)
        self.label.setText("Waiting for video...")
        self.label.setFixedSize(800, 450)  # width height
        self.label.move(50, 100)
        self.label.setStyleSheet("QLabel{background:pink;}"
                                 "QLabel{color:rgb(100,100,100);font-size:15px;font-weight:bold;font-family:宋体;}"
                                 )
        # 显示人数label
        self.label_num = QLabel(self)
        self.label_num.setText("Waiting for detectiong...")
        self.label_num.setFixedSize(430, 40)  # width height
        self.label_num.move(200, 20)
        #self.label_num.setStyleSheet("QLabel{background:yellow;}")
        # 开启视频按键
        self.btn = QPushButton(self)
        self.btn.setText("Open")
        self.btn.move(150, 570)
        self.btn.clicked.connect(self.slotStart)
        # 检测按键
        # self.btn_detect = QPushButton(self)
        # self.btn_detect.setText("Detect")
        # self.btn_detect.move(400, 570)
        # self.btn_detect.setStyleSheet("QPushButton{background:red;}")  # 没检测红色,检测绿色
        # self.btn_detect.clicked.connect(self.detection)
        # 关闭视频按钮
        self.btn_stop = QPushButton(self)
        self.btn_stop.setText("Stop")
        self.btn_stop.move(700, 570)
        self.btn_stop.clicked.connect(self.slotStop)

    def slotStart(self):
        """ Slot function to start the progamme
            """
        videoName, _ = QFileDialog.getOpenFileName(self, "Open", "", "*.avi;;*.mp4;;All Files(*)")
        if videoName != "":  # “”为用户取消
            self.cap = cv2.VideoCapture(videoName)
            self.timer_camera.start(100)
            self.timer_camera.timeout.connect(self.openFrame)

    def slotStop(self):
        """ Slot function to stop the programme
            """
        if self.cap != []:
            self.cap.release()
            self.timer_camera.stop()  # 停止计时器
            self.label.setText("This video has been stopped.")
            self.label.setStyleSheet("QLabel{background:pink;}"
                                     "QLabel{color:rgb(100,100,100);font-size:15px;font-weight:bold;font-family:宋体;}"
                                     )
        else:
            self.label_num.setText("Push the left upper corner button to Quit.")
            Warming = QMessageBox.warning(self, "Warming", "Push the left upper corner button to Quit.",
                                          QMessageBox.Yes)

    def openFrame(self):
        """ Slot function to capture frame and process it
            """
        if (self.cap.isOpened()):
            ret, self.frame = self.cap.read()
            if ret:
                frame = cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB)
                if self.detectFlag == True:
                    # 检测代码self.frame
                    self.label_num.setText("There are " + str(5) + " people.")

                height, width, bytesPerComponent = frame.shape
                bytesPerLine = bytesPerComponent * width
                q_image = QImage(frame.data, width, height, bytesPerLine,
                                 QImage.Format_RGB888).scaled(self.label.width(), self.label.height())
                self.label.setPixmap(QPixmap.fromImage(q_image))
            else:
                self.cap.release()
                self.timer_camera.stop()  # 停止计时器

    def detection(self):
        self.detectFlag = not self.detectFlag  # 取反
        if self.detectFlag == True:
            self.btn_detect.setStyleSheet("QPushButton{background:green;}")
        else:
            self.btn_detect.setStyleSheet("QPushButton{background:red;}")
    #        self.label_num.setText("There are 5 people.")


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    my = Video()
    my.show()
    sys.exit(app.exec_())

在这里插入图片描述
希望这篇博文对你有用!
谢谢点赞评论!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_44936246/article/details/118179009

智能推荐

【转】Android中自动连接到指定SSID的Wi-Fi_harmonyos 2.0 wifi 编程自动连接到指定ssid-程序员宅基地

【转】Android中自动连接到指定SSID的Wi-Fi原文地址:http://www.cnblogs.com/pied/p/3767336.html最近在做一个项目,其中涉及到一块“自动连接已存在的wifi热点”的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏些许错误造成功能无法实现,经过浣熊多方努力,终于成功将功能实现,遂将一点点小成就拿出来与大家分享。在这篇文章中,作者定义了一个wifi工具类,其中存在着操作wif..._harmonyos 2.0 wifi 编程自动连接到指定ssid

mongodb添加用户密码并进行配置-程序员宅基地

//mongodb设置用户名密码,在mongodb/bin目录下use admin db.addUser('user12345','foobar'); app.use(session({ store: new MongoStore({ // Basic usage host: 'localhost', // Default, optional,可不写

Javascript的知识总结三-程序员宅基地

重點知識匯總1-1 深拷贝和浅拷贝的区分浅拷贝和深拷贝:只针对object 和Array 这样的复杂的对象。浅拷贝(只拷贝一层)var arr1 = [1,2,3],arr2 = ['a','b']; arr1 =arr2; console.log(arr1);//(2)["a", "b"]可以看到arr1改变了,这叫浅拷贝1-2 浅拷贝的方法对象浅拷贝...

python3在同一行内输入n个数并用列表保存-程序员宅基地

最近在学习算法,经常遇到一行有多个数据,用空格或者','进行分割。最开始不懂,直接百度,n = input()n = int(n)list1 = []list1 = input().split()list2 = []i = 0while i < n: m = int(list1[i]) list2.append(m) i += 1print(lis...

【python】pyQT5中ComboBox的用法_pyqt combobox_GEEK.攻城狮的博客-程序员宅基地

pyQT5中ComboBox的用法常用的方法1、添加下拉选项#添加一个下拉选项self.comboBox.addItem("默认文本")#从列表中添加下拉选项self.comboBox.addItems(["文本1", "文本2", "文本3"])2、设置显示项目self.comboBox.setCurrentIndex(2)3、获取选项中的索引self.comboBox.currentIndex()4、获取选中项的文本self.comboBox.currentText()_pyqt combobox

【算法】时间复杂度/运行时间——大O表示法-程序员宅基地

对于所有算法,我们都要讨论其运行时间。一般而言,应该选择效率最高的算法,以最大程度地减少运行时间或占用空间。大O表示法是一种特殊的表示法,指出了算法的速度有多快。大O表示法 并不能表示具体算法任务运行的时间,这也没有意义,因为任务量总是在变。我们需要知道运行时间如何随任务量增长而增长,这正是大O法的用武之地。大O法表示指出了算法有多快。例如,假设列表包含n个元素。简单查找需要检查每个元素,因此需要执行n次操作。使用大O表示法,这个运行时间表示为O(n)。并没有时间单位s,这是因为大O法指的并非以秒为单.

随便推点

Python中路径的写法(绝对路径)_python绝对路径怎么写-程序员宅基地

第一种,直接写r 后面路径是单 反斜杠即可r'E:\Program\Python\yukino.jpg'第二种,直接写路径,需要是双 反斜杠'E:\\Program\\Python\\yukino.jpg'第三种,直接写路径,需要是斜杠 不然是转义符'E:/Program/Python/yukino.jpg'..._python绝对路径怎么写

std::ifstream 打开文件,获得文件流 并赋给std::string-程序员宅基地

// 打开文件,获得文件流 std::ifstream inFile(fileName.c_str(), std::ios::in | std::ios::binary); std::ostringstream oss; oss << inFile.rdbuf(); std::string buffer = oss.str(); inFile.close();

ubuntu 16.04 qt5.6 mysql_解决Ubuntu16.04上QT5.7开发QMYSQL数据库 mysql drivers not loaded问题...-程序员宅基地

Qmsql not loaded :平台 qt5.7 Ubuntu16.04no@no-70MYA004CN:~$ cd /home/no/Qt5.7.0/5.7/gcc_64/plugins/sqldriversno@no-70MYA004CN:~/Qt5.7.0/5.7/gcc_64/plugins/sqldrivers$ldd libqsqlmysql.so(上面指令查看所有依赖关系)./...

Delphi MDI 子窗体的创建和销毁 [zhuan]_delphi 子窗体-程序员宅基地

文章来源: Delphi MDI 子窗体的创建和销毁1.如果要创建一个mdi child,先看是否有这个child 存在,如果有,则用它,如果没有再创建//该函数判断MDI 子窗体是否存在,再进行创建和显示function isInclude(formclass: TFormClass): boolean;var i: Integer; form: TObjec_delphi 子窗体

camera测试标准_usb摄像头灰阶标准一般是多少阶-程序员宅基地

原文地址:http://www.52rd.com/bbs/Dispbbs.asp?BoardID=86&ID=69390一、ISO12233 Camera Resolution ChartISO12233分辨率测试标板遵照ISO12233的标准“摄影-电子照相画面-衡量方法"。这个测试标板在1 X 大小的这个活动区域,测量20 cm 高度只有约0.1毫米的误差。他具有几乎大部分解析_usb摄像头灰阶标准一般是多少阶

软件工程——程序编码_软件工程 编码 程序编码-程序员宅基地

一、程序设计语言1.分类汇编语言:第一代,第二代计算机用高级语言:比汇编语言编码语言少3-7倍,第三代计算机使用.高级语言又可细分为四种:①系统实现语言:克服汇编语言的缺点,提供控制语句和变量类型检验功能,可直接使用机器的操作②静态高级语言:给程序员提供控制语句③块结构高级语言:直接提供有限形式的动态存储分配④动态高级语言:动态的完成所有的内存管理,专用语言2.语言的选择(1).应用领域的不同来选择:商业-COBOL、4GLS 科学计算-FOETR..._软件工程 编码 程序编码