pyqt5和opencv播放视频

直接上代码

# @time: 2022/3/24 17:10
# @Author: wangshubo
# @File: main.py
# @description:
# @author_email: '971490321@qq.com'
import sys
import os
import cv2
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import QPalette, QBrush, QPixmap


class UiMainWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(UiMainWindow, self).__init__(parent)

        self.timerCamera = QtCore.QTimer() #初始化定时器
        self.cap = cv2.VideoCapture() #初始化摄像头
        self.camNum = r"D:/images/anquanmao.flv"
        self.setUi()
        self.slotInit()
        self.flagWork = 0
        self.x = 0
        self.count = 0

    def setUi(self):
        self.layoutMain = QtWidgets.QHBoxLayout()
        self.layoutFuncButton = QtWidgets.QHBoxLayout()
        self.layoutDataShow = QtWidgets.QVBoxLayout()

        self.btnOpenCam = QtWidgets.QPushButton("打开相机")
        self.btnCloseCam = QtWidgets.QPushButton("退出")

        #button颜色修改
        btnColor = [self.btnOpenCam, self.btnCloseCam]
        for i in range(2):
            btnColor[i].setStyleSheet("QPushButton{color:black}" "QPushButton:hover{color:red}"
                                      "QPushButton{background-color:rgb(78, 255, 255)}" "QPushButton{border:2px}"
                                      "QPushButton{border_radius:10px}"
                                      "QPushButton{padding: 2px 4px}")
        self.btnOpenCam.setMinimumHeight(50)
        self.btnCloseCam.setMinimumHeight(50)

        self.move(500, 500)
        #信息显示
        self.labelCamera = QtWidgets.QLabel()
        self.labelMove = QtWidgets.QLabel()
        self.labelMove.setFixedSize(100, 100)

        self.labelCamera.setFixedSize(641, 481)
        self.labelCamera.setAutoFillBackground(False)

        self.layoutFuncButton.addWidget(self.btnOpenCam)
        self.layoutFuncButton.addWidget(self.btnCloseCam)
        self.layoutFuncButton.addWidget(self.labelMove)

        self.layoutMain.addLayout(self.layoutFuncButton)
        self.layoutMain.addWidget(self.labelCamera)

        self.setLayout(self.layoutMain)
        self.labelMove.raise_()

        self.setWindowTitle("摄像头")
    def slotInit(self):
        self.btnOpenCam.clicked.connect(self.opencamera)
        self.timerCamera.timeout.connect(self.showcamera)
        self.btnCloseCam.clicked.connect(self.close)

    def opencamera(self):
        if self.timerCamera.isActive() == False:
            flag = self.cap.open(self.camNum) #打开摄像头操作
            if flag == False:
                msg = QtWidgets.QMessageBox.warning(self, 'warning', '请检测相机与电脑是否链接正确',
                                                    buttons=QtWidgets.QMessageBox.Ok,
                                                    defaultButton=QtWidgets.QMessageBox.Ok)
            else:
                self.timerCamera.start(30)
                self.btnOpenCam.setText('关闭相机')
        else:
            self.timerCamera.stop()
            self.cap.release()
            self.labelCamera.clear()
            self.btnOpenCam.setText('打开相机')

    def showcamera(self):
        flag, self.image = self.cap.read()
        show = cv2.resize(self.image, (640, 480))
        show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
        showImage = QtGui.QImage(show.data, show.shape[1], show.shape[0], QtGui.QImage.Format_RGB888)
        self.labelCamera.setPixmap(QtGui.QPixmap.fromImage(showImage))

    def closeEvent(self, e):
        print("关闭")
        ok = QtWidgets.QPushButton()
        cancel = QtWidgets.QPushButton()
        msg = QtWidgets.QMessageBox(QtWidgets.QMessageBox.warning, '关闭', '是否关闭!')
        msg.addButton(ok, QtWidgets.QMessageBox.ActionRole)
        msg.addButton(cancel, QtWidgets.QMessageBox.RejectRole)
        ok.setText('确定')
        cancel.setText('取消')
        if msg.exec_() == QtWidgets.QMessageBox.RejectRole:
            e.ignore()
        else:
            if self.cap.isOpened():
                self.cap.release()
            if self.timerCamera.isActive():
                self.timerCamera.stop()
            e.accept()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = UiMainWindow()
    win.show()
    sys.exit(app.exec_())
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 PyQt5OpenCV 库来播放 RTSP 流。下面是一些实现的示例代码: ```python import sys import cv2 from PyQt5.QtCore import Qt from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtWidgets import QApplication, QLabel class RTSPPlayer(QLabel): def __init__(self, rtsp_url): super().__init__() self.rtsp_url = rtsp_url self.cap = cv2.VideoCapture(self.rtsp_url) self.setFixedSize(640, 480) self.start() def start(self): self.timer = self.startTimer(1) # 1ms self.playing = True def stop(self): self.killTimer(self.timer) self.playing = False def timerEvent(self, event): if event.timerId() == self.timer: ret, frame = self.cap.read() if ret: frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) img = QImage(frame.data, frame.shape[1], frame.shape[0], QImage.Format_RGB888) pix = QPixmap.fromImage(img) self.setPixmap(pix.scaled(self.width(), self.height(), Qt.KeepAspectRatio)) def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.stop() self.close() if __name__ == '__main__': app = QApplication(sys.argv) player = RTSPPlayer('rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov') player.show() sys.exit(app.exec_()) ``` 在这个示例代码中,我们创建了一个 `RTSPPlayer` 类来播放 RTSP 流。在 `__init__` 方法中,我们初始化了一个 `cv2.VideoCapture` 对象,用于读取 RTSP 流。在 `start` 方法中,我们启动了一个定时器,用于定时读取视频帧,并将其转换为 QImage 和 QPixmap 对象,最后将图像显示在 QLabel 上。在 `stop` 方法中,我们停止了定时器。在 `keyPressEvent` 方法中,我们监听了 ESC 键,用于停止播放和关闭窗口。 在示例代码中,我们使用了一个公共的 RTSP 流地址进行测试。你可以将 `RTSPPlayer` 类作为一个自定义的 QWidget,嵌入到你的 PyQt5 应用程序中使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值