pyqt+opencv的视频开始和暂停功能怎么做

请问这个代码怎么加上开始和暂停功能

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

# Form implementation generated from reading ui file 'Bodybuilding.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# 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
from PyQt5.QtGui import QPixmap
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QDir,QUrl
import A as a
import pushUp as pu
import mediapipe as mp
import math
import cv2
import numpy as np
import time
import PoseModule as pm


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(778, 794)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget.setGeometry(QtCore.QRect(10, 10, 761, 751))
        self.layoutWidget.setObjectName("layoutWidget")
        self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.layoutWidget)
        self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label_2 = QtWidgets.QLabel(self.layoutWidget)
        self.label_2.setText("")
        self.label_2.setPixmap(QtGui.QPixmap(":/LOGO/LOGO.png"))
        self.label_2.setScaledContents(True)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout.addWidget(self.label_2)
        self.label = QtWidgets.QLabel(self.layoutWidget)
        self.label.setStyleSheet("font: 25pt \"华文行楷\";")
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.pushButton = QtWidgets.QPushButton(self.layoutWidget)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout_2.addWidget(self.pushButton)
        self.pushButton_2 = QtWidgets.QPushButton(self.layoutWidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout_2.addWidget(self.pushButton_2)
        self.pushButton_3 = QtWidgets.QPushButton(self.layoutWidget)
        self.pushButton_3.setObjectName("pushButton_3")
        self.horizontalLayout_2.addWidget(self.pushButton_3)
        self.pushButton_4 = QtWidgets.QPushButton(self.layoutWidget)
        self.pushButton_4.setObjectName("pushButton_4")
        self.horizontalLayout_2.addWidget(self.pushButton_4)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.verticalLayout_3.addLayout(self.verticalLayout)
        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.line = QtWidgets.QFrame(self.layoutWidget)
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.verticalLayout_2.addWidget(self.line)
        self.label_3 = QtWidgets.QLabel(self.layoutWidget)
        self.label_3.setText("")
        self.label_3.setObjectName("label_3")
        self.verticalLayout_2.addWidget(self.label_3)
        self.verticalLayout_3.addLayout(self.verticalLayout_2)
        self.verticalLayout_3.setStretch(0, 1)
        self.verticalLayout_3.setStretch(1, 8)
        # MainWindow.setCentralWidget(self.centralwidget)
        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", "健身"))
        self.label.setText(_translate("MainWindow", "人体姿态识别健身辅助系统"))
        self.pushButton.setText(_translate("MainWindow", "实时检测"))
        self.pushButton_2.setText(_translate("MainWindow", "加载视频"))
        self.pushButton_3.setText(_translate("MainWindow", "开始"))
        self.pushButton_4.setText(_translate("MainWindow", "暂停"))
        self.pushButton.clicked.connect(self.click1)#实时检测
        self.pushButton_2.clicked.connect(self.click2)#加载视频
        # self.pushButton_3.clicked.connect(self.click3)#开始
        # self.pushButton_4.clicked.connect(self.click4)#暂停

    # def __init__(self):
    #     self.timer_camera = QtCore.QTimer()  # 创建定时器


    def click1(self):
        self.push(0)

    def click2(self):
        self.videoPath, _ = QFileDialog.getOpenFileName(self.centralwidget, "Open Video", "../images/", "*.mp4 *.avi *.flv")
        print("Open Video: ", self.videoPath)
        var1 = self.videoPath
        self.push(var1)

    def push(self,var1):
        cap = cv2.VideoCapture(var1)

        detector = pm.poseDetector()
        count = 0
        dir = 0
        pTime = 0
        while True:
            success, img = cap.read()
            img = cv2.resize(img, (1280, 720))
            # img = cv2.imread("AiTrainer/test.jpg")
            img = detector.findPose(img, False)
            lmList = detector.findPosition(img, False)
            # print(lmList)
            if len(lmList) != 0:
                # 右臂
                # angle = detector.findAngle(img, 12, 14, 16)
                # # 左臂
                angle = detector.findAngle(img, 11, 13, 15)
                per = np.interp(angle, (185, 300), (100, 0))
                bar = np.interp(angle, (185, 300), (100, 650))
                # print(angle, per)

                # Check for the dumbbell curls
                color = (255, 0, 255)
                if per == 100:  # 百分比
                    color = (0, 255, 0)
                    if dir == 0:
                        count += 0.5
                        dir = 1
                if per == 0:
                    color = (0, 255, 0)
                    if dir == 1:
                        count += 0.5
                        dir = 0
                print(count)

                # Draw Bar
                cv2.rectangle(img, (1100, 100), (1175, 650), color, 3)
                cv2.rectangle(img, (1100, int(bar)), (1175, 650), color, cv2.FILLED)
                cv2.putText(img, f'{int(per)} %', (1100, 75), cv2.FONT_HERSHEY_PLAIN, 4,
                            color, 4)

                # 计数
                cv2.rectangle(img, (0, 500), (300, 720), (0, 255, 0), cv2.FILLED)  # 计数框调节
                cv2.putText(img, str(int(count)), (45, 670), cv2.FONT_HERSHEY_PLAIN, 10,
                            (255, 0, 0), 20)

            cTime = time.time()
            fps = 1 / (cTime - pTime)
            pTime = cTime
            cv2.putText(img, str(int(fps)), (50, 100), cv2.FONT_HERSHEY_PLAIN, 5,
                        (255, 0, 0), 5)

            # cv2.imshow("Image", img)
            # 将openCV获取的帧图片格式进行转换,openCV读取帧图片的格式是BGR
            QtImgBuf = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
            # 把转换格式后的帧图片,实例化QImage对象
            QtImg = QtGui.QImage(QtImgBuf.data, QtImgBuf.shape[1], QtImgBuf.shape[0], QtGui.QImage.Format_RGB32)
            # VideoPlayer是UI界面中的label对象。先用QtImg实例和QPixmap对象,然后将其传给label
            self.label_3.setPixmap(QPixmap.fromImage(QtImg))
            # 使用QLabel的setScaledContents方法,是图片自适应QLabel的大小
            self.label_3.setScaledContents(True)

            cv2.waitKey(1)


import Bodybuilding_rc
import LOGO_rc
import test_rc
if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    widget = QtWidgets.QWidget()
    ui = Ui_MainWindow()
    ui.setupUi(widget)
    widget.show()
    sys.exit(app.exec_())


要实现视频的开始和暂停功能,可以使用 QMediaPlayerQMediaPlaylist 类来播放视频,并通过 QPushButton 控件来控制播放状态。

下面是一个简单的示例代码,演示了如何在 PyQT 和 OpenCV 中实现视频播放和暂停功能:

from PyQt5.QtCore import QSize, QUrl
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabel, QFileDialog
from PyQt5.QtMultimedia import QMediaPlayer, QMediaPlaylist, QMediaContent
import sys
import cv2


class VideoPlayer(QMainWindow):
    def __init__(self):
        super().__init__()

        # 创建播放器和播放列表
        self.player = QMediaPlayer(self)
        self.playlist = QMediaPlaylist(self.player)
        self.player.setPlaylist(self.playlist)

        # 创建视频显示控件和控制按钮
        self.label = QLabel()
        self.play_button = QPushButton("Play")
        self.pause_button = QPushButton("Pause")

        # 设置按钮大小
        button_size = QSize(100, 50)
        self.play_button.setFixedSize(button_size)
        self.pause_button.setFixedSize(button_size)

        # 设置界面布局
        layout = QVBoxLayout()
        layout.addWidget(self.label)
        layout.addWidget(self.play_button)
        layout.addWidget(self.pause_button)

        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

        # 连接按钮的信号槽函数
        self.play_button.clicked.connect(self.playVideo)
        self.pause_button.clicked.connect(self.pauseVideo)

        # 显示窗口
        self.setGeometry(100, 100, 640, 480)
        self.show()

    def playVideo(self):
        # 打开文件选择对话框,获取视频文件路径
        file_path, _ = QFileDialog.getOpenFileName(self, "Open Video", QDir.homePath(), "Video Files (*.mp4 *.avi)")

        if file_path:
            # 将视频文件添加到播放列表
            self.playlist.clear()
            url = QUrl.fromLocalFile(file_path)
            content = QMediaContent(url)
            self.playlist.addMedia(content)

            # 开始播放视频
            self.player.setVideoOutput(self.label)
            self.player.play()

    def pauseVideo(self):
        # 暂停视频播放
        self.player.pause()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    player = VideoPlayer()
    sys.exit(app.exec_())

注意,在此示例代码中,我们使用了 QMediaPlayerQMediaPlaylist 类来播放视频,并使用 QLabel 控件来显示视频画面。在 playVideo 函数中,我们通过调用 getOpenFileName 函数打开一个文件选择对话框,让用户选择要播放的视频文件。然后,我们将所选文件添加到播放列表中,并开始播放视频。同时,我们还添加了一个 Pause 按钮,当用户点击该按钮时,我们将暂停视频播放。

你可以根据自己的需求修改和扩展这个示例代码,例如,如果需要使用 OpenCV 库来处理视频,可以在 playVideo 函数中添加相应的代码。