PYQT 读取摄像头显示视频(Qtimer的方式 )

news2024/11/27 11:40:23

建立界面

使用qtdesigner设计一个基本的播放视频界面
在这里插入图片描述
使用PYUIC生成对应代码文件,如下:

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

# Form implementation generated from reading ui file 'Test_UI.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_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(883, 637)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton_start = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_start.setGeometry(QtCore.QRect(160, 480, 141, 51))
        self.pushButton_start.setObjectName("pushButton_start")
        self.label_show = QtWidgets.QLabel(self.centralwidget)
        self.label_show.setGeometry(QtCore.QRect(150, 60, 541, 371))
        self.label_show.setStyleSheet("background-color: rgb(0, 0, 0);")
        self.label_show.setText("")
        self.label_show.setObjectName("label_show")
        self.pushButton_end = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_end.setGeometry(QtCore.QRect(550, 480, 141, 51))
        self.pushButton_end.setObjectName("pushButton_end")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 883, 22))
        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)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton_start.setText(_translate("MainWindow", "开始"))
        self.pushButton_end.setText(_translate("MainWindow", "结束"))

主函数

核心需要实现的功能就是按下按钮打开摄像头进行读取,然后关闭摄像头

通过QTimer实现

这样可以比较简单的实现,就是timer计时到了就新读取一帧

from PyQt5 import QtWidgets,QtCore
from PyQt5.QtWidgets import QMainWindow,QApplication
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
import cv2

import Test_UI

import threading


# 注意:ui界面文件是个MainWindow,那么MyApp就必须继承 QMainWindow
# 类似的,若ui界面文件是个对话框,那么MyApp就必须继承 QDialog
class Test_window(QtWidgets.QMainWindow,Test_UI.Ui_MainWindow):
    def __init__(self,parent=None):
        super(Test_window,self).__init__(parent)
        self.setupUi(self)
        self.CAM_NUM = 0
        self.cap = cv2.VideoCapture()

        self.timer = QTimer()
        self.timer.timeout.connect(self.show_pic)

        # 文件选择按钮
        self.pushButton_start.clicked.connect(self.open_camera)
        self.pushButton_end.clicked.connect(self.close_camera)

        self.pushButton_start.setEnabled(True)
        # 初始状态不能关闭摄像头
        self.pushButton_end.setEnabled(False)

    def open_camera(self):
        # 检测该设备是否能打开
        flag = self.cap.open(self.CAM_NUM)
        print(flag)
        if flag is False:
            QMessageBox.information(self, "警告", "该设备未正常连接", QMessageBox.Ok)
        else:
            # 幕布可以播放
            self.label_show.setEnabled(True)
            # 打开摄像头按钮不能点击
            self.pushButton_start.setEnabled(False)
            # 关闭摄像头按钮可以点击
            self.pushButton_end.setEnabled(True)
            self.timer.start()
            print("beginning!")

    # 关闭相机
    def close_camera(self):
        self.cap.release()
        self.pushButton_start.setEnabled(True)
        self.pushButton_end.setEnabled(False)
        self.timer.stop()

    #   显示视频图像
    def show_pic(self):
        ret, img = self.cap.read()
        if ret:
            cur_frame = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            # 视频流的长和宽
            height, width = cur_frame.shape[:2]
            pixmap = QImage(cur_frame.data, width, height, QImage.Format_RGB888)
            pixmap = QPixmap.fromImage(pixmap)
            # # 获取是视频流和label窗口的长宽比值的最大值,适应label窗口播放,不然显示不全
            # ratio = max(width / self.label.width(), height / self.label.height())
            # pixmap.setDevicePixelRatio(ratio)
            # print("here")
            # # 视频流置于label中间部分播放
            # self.label_show.setAlignment(Qt.AlignCenter)
            self.label_show.setPixmap(pixmap)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mytest = Test_window()
    mytest.show()
    app.exec_()

加上对于图像的处理

比如我这里加上对于姿态识别,好像不用到多线程也行,就直接在图片显示函数里,进行图片的推理就行了,没什么太大的影响。

from PyQt5 import QtWidgets,QtCore
from PyQt5.QtWidgets import QMainWindow,QApplication
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
import cv2

import Test_UI

import threading

import Gesture_Model


# 注意:ui界面文件是个MainWindow,那么MyApp就必须继承 QMainWindow
# 类似的,若ui界面文件是个对话框,那么MyApp就必须继承 QDialog
class Test_window(QtWidgets.QMainWindow,Test_UI.Ui_MainWindow):
    def __init__(self,parent=None):
        super(Test_window,self).__init__(parent)
        self.setupUi(self)
        self.CAM_NUM = 0
        self.cap = cv2.VideoCapture()

        self.geture_model = Gesture_Model.Gesture()

        self.timer = QTimer()
        self.timer.timeout.connect(self.show_pic)

        # 文件选择按钮
        self.pushButton_start.clicked.connect(self.open_camera)
        self.pushButton_end.clicked.connect(self.close_camera)

        self.pushButton_start.setEnabled(True)
        # 初始状态不能关闭摄像头
        self.pushButton_end.setEnabled(False)

    def open_camera(self):
        # 检测该设备是否能打开
        # flag = self.cap.open(self.CAM_NUM)
        flag = self.cap.open('./test/002.mp4')
        print(flag)
        if flag is False:
            QMessageBox.information(self, "警告", "该设备未正常连接", QMessageBox.Ok)
        else:
            # 幕布可以播放
            self.label_show.setEnabled(True)
            # 打开摄像头按钮不能点击
            self.pushButton_start.setEnabled(False)
            # 关闭摄像头按钮可以点击
            self.pushButton_end.setEnabled(True)
            self.timer.start()
            print("beginning!")

    # 关闭相机
    def close_camera(self):
        self.cap.release()
        self.pushButton_start.setEnabled(True)
        self.pushButton_end.setEnabled(False)
        self.timer.stop()

    #   显示视频图像
    def show_pic(self):
        ret, img = self.cap.read()
        if ret:
            cur_frame = self.geture_model.pred(img)
            cur_frame = cv2.cvtColor(cur_frame, cv2.COLOR_BGR2RGB)
            # 视频流的长和宽
            height, width = cur_frame.shape[:2]
            pixmap = QImage(cur_frame.data, width, height, QImage.Format_RGB888)
            pixmap = QPixmap.fromImage(pixmap).scaled(self.label_show.width(), self.label_show.height())
            self.label_show.setPixmap(pixmap)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mytest = Test_window()
    mytest.show()
    app.exec_()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/781819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【iOS】多界面传值

文章目录 前言一、属性传值二、协议传值三、block传值四、KVO传值五、KVO的自动触发与手动触发六、通知传值总结 前言 在写网易云音乐以及3GShare包括后面的学生管理系统时,用到许多界面传值方法,特撰写博客记录目前学过的几种多界面传值方法 一、属性…

Zabbix-server监控mysql及httpd服务

目录 一、Zabbix监控mysql数据库 1、为server.Zabbix.com添加服务模板 2、创建mysql服务图形 二、server.zabbix.com服务器操作 编辑chk_mysql.sh脚本 三、server.Zabbix.com测试 四、查看web效果 五、Zabbix监控apache(httpd服务) 安装master 六、…

基于Python+多层RNN+Tensorflow藏头诗与歌词智能生成-深度学习算法应用(含全部工程源码)+训练数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境Tensorflow 环境PyCharm环境 模块实现古诗生成1. 数据预处理2. 模型构建3. 模型训练及保存4. 使用模型生成古诗5. 产生藏头诗6. 用词云展示生成的古诗 歌词生成1. 数据预处理2. 模型构建3. 模型训练并保存4. 生成…

时序约束案例(没有解决)

问题记录 SDI显示项目要求:当外部摄像头无接入时,FPGA产生彩条给显示芯片。当外部摄像头有接入时,显示数据来自于海思。目前能成功显示,但是需要把输出给显示驱动芯片的时钟取反后才可以。尝试使用output delay约束不成功。 项目架构描述 …

【Redis-02】Redis的缓存

Redis的缓存 1.概念1.1什么是缓存1.2为什么使用缓存1.3如何使用1.3.1不适用缓存之前1.3.2 缓存模型和思路(使用方法)1.3.3 使用之后 2.缓存更新策略2.1数据库缓存不一致解决方案2.2数据库和缓存不一致采用什么方案2.3代码实例 3.缓存穿透3.1缓存穿透是什…

Qt6 Qt Quick UI原型学习QML第六篇

文章目录 效果展示动画片第一小节源码(AnimationExample.qml)主文件解释语法 源码子文件(ClickableImageV2.qml)解释语法 效果展示 动画片第一小节 源码(AnimationExample.qml)主文件 import QtQuick 2.1…

自动驾驶感知系统-激光雷达

感知系统 现有的车载传感器主要包括超声波雷达、激光雷达、毫米波雷达、车载摄像头、红外探头等。主流的自动驾驶感知平台以雷达和车载摄像头为主,呈现多传感器融合发展趋势。基于测量能力和环境适应性,预计雷达和车载摄像头会保持其感知平台霸主地位&a…

Python Selenium设计模式及代码实现

前言 本文就python selenium自动化测试实践中所需要的POM设计模式进行分享,以便大家在实践中对POM的特点、应用场景和核心思想有一定的理解和掌握。 为什么要用POM 基于python selenium2开始UI级自动化测试并不是多么艰巨的任务。**只需要定位到元素,…

vue中export和export default的使用

<script> export default {name: HelloWorld } $(function () {alert(引入成功) }) </script> 1、export的使用 比喻index.js要使用test.js中的数据&#xff0c;首先在test.js文件中进行导出操作 代码如下&#xff1a; export function list() {alert("list…

EasyExcel写出包含多个sheet页的Excel

EasyExcel导出包含多个sheet页的Excel 1.引入依赖 引入如下的EasyExcel的依赖&#xff0c;或直接下载jar包 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></depende…

文心千帆大模型平台,一站式企业级大模型平台

文心千帆大模型平台&#xff0c;一站式企业级大模型平台 0. 前言1. 人工智能发展历程1.1 传统机器学习1.2 深度学习1.3 大模型时代 2. 文心千帆2.1 文心千帆介绍2.2 文心千帆应用场景2.3 文心千帆平台优势 3. 文心千帆初体验3.1 注册流程3.2 创建应用3.3 在线测试3.4 数据服务3…

玩转ChatGPT:Custom instructions (vol. 1)

一、写在前面 据说GPT-4又被削了&#xff0c;前几天让TA改代码&#xff0c;来来回回好几次才成功。 可以看到之前3小时25条的限制&#xff0c;现在改成了3小时50条&#xff0c;可不可以理解为&#xff1a;以前一个指令能完成的任务&#xff0c;现在得两条指令&#xff1f; 可…

如何将windows下的应用程序直接放到ubuntu下运行

安装wine https://blog.csdn.net/gc_2299/article/details/129077372 安装.NET https://dotnet.microsoft.com/en-us/download/dotnet-framework/net472

Vue中的props配置

结构&#xff1a; main.js //引入Vue import Vue from vue //引入App import App from "./App"; //关闭Vue的生产提示 Vue.config.productionTip false//创建vm new Vue({el:#app,render:h>h(App) }) App.vue <template><div><Student name&qu…

运行Yolov5 7.0遇到的问题

遇到的错误 Traceback (most recent call last):File "E:\Users\user\anaconda3\envs\torch17\lib\site-packages\git\__init__.py", line 89, in <module>refresh()File "E:\Users\user\anaconda3\envs\torch17\lib\site-packages\git\__init__.py"…

RocketMQ Windows环境下启动导致C盘爆满原因及解决办法

原因 rocketmq取的默认路径是user.home路径&#xff0c;也就是用户的根目录&#xff0c;一般存储放在跟路径下的 /store目录。 在源码中也可以看到&#xff1a; 这里会有一个问题&#xff0c;RocketMQ很容易导致C盘空间不够&#xff0c;在使用过程中&#xff0c;创建一个主题默…

二,jmeter的简介和使用

文章目录 一、jmeter简介及安装1. 简介2. 安装 二、jmeter设置语言三、jmeter文件路径说明四、编写jmeter脚本五、乱码的处理&#xff1a;1. 请求内容出现乱码处理方法2. 响应内容出现乱码处理方法 六、写脚本方法扩展录制脚本&#xff1a; 七、 脚本功能增强 一、jmeter简介及…

pytorch学习——第二个模型(逻辑回归)

参考该博客系统学习Pytorch笔记二&#xff1a;Pytorch的动态图、自动求导及逻辑回归 c l a s s { 0 0.5 > y 1 0.5 ≤ y class\left\{ \begin{array}{rcl} 0 & & {0.5 > y}\\ 1 & & {0.5 \le y}\\ \end{array} \right. class{01​​0.5>y0.5≤y​ 根…

图数据库Neo4j学习一——基本介绍

文章目录 1各类数据库基本概念1.1关系型数据库&#xff08;SQL&#xff09;1.2非关系型数据库&#xff08;NoSQL&#xff09;1.3图数据库1.3.1图数据库特点1.3.2图数据库应用场景 2图数据库基本概念2.1用户访问菜单2.2节点&#xff08;用户、角色、菜单&#xff09;2.3关系&…

动态规划:从入门到入土系列(一)

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 前言 本篇…