基于OpenCV和PyQt5的跳远成果展示程序

基于OpenCV和PyQt5的跳远成果展示程序

近年来,体育运动越来越受到人们的关注,其中跳远是一项备受瞩目的运动项目。为了更好地展示运动员的跳远成果,本文将介绍一种基于OpenCV和PyQt5的跳远成果展示程序实现方法。

本文的跳远成果展示程序主要包括两个部分:一是通过读取视频中的图像,计算运动员的跳跃距离;二是在界面上显示运动员跳跃的视频和跳跃距离结果。下面我们将分别介绍这两个部分的实现方法。

一、计算跳跃距离

1.获取背景图像

程序最开始需要获取跳跃场地的背景图像。为了方便计算跳跃距离,我们需要将背景图像转换为灰度图像,并进行高斯模糊处理。

self.cap = cv2.VideoCapture('跳远3.mp4')
_, self.bg_frame = self.cap.read()
self.bg_frame = cv2.cvtColor(self.bg_frame, cv2.COLOR_BGR2GRAY)
self.bg_frame = cv2.GaussianBlur(self.bg_frame, (21, 21), 0)

2.读取视频帧并计算跳跃距离

程序在读取每一帧视频图像时,需要将其转换为灰度图像,并进行高斯模糊处理。接着,通过背景减除和二值化处理来得到前景图像,并在前景图像中查找最大的轮廓。最后,根据最大轮廓的椭圆长轴长度来计算跳跃距离。

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (21, 21), 0)
# 背景减除
diff = cv2.absdiff(self.bg_frame, gray)
thresh = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY)[1]
# 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓并计算跳跃距离
if len(contours) > 0:
    c = max(contours, key=cv2.contourArea)
    cv2.drawContours(frame, [c], 0, (0, 255, 0), 2)
    (x, y), radius = cv2.minEnclosingCircle(c)
    cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 0), 2)
    if len(c) > 4:
        ellipse = cv2.fitEllipse(c)
        cv2.ellipse(frame, ellipse, (0, 255, 0), 2)
        self.distance = ellipse[1][0] * 0.025

二、界面显示

程序的界面显示主要通过PyQt5库来实现。我们在界面上添加一个QLabel用于显示跳跃视频,并添加另一个QLabel用于显示跳跃距离结果。同时,我们还需要添加一个定时器来定时刷新跳跃视频和跳跃距离结果。

class Main(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.video = Video()
        self.initUI()

    def initUI(self):
        self.setGeometry(100, 100, 1200, 700)
        self.setWindowTitle('Jumping Distance')

        # 添加用于显示视频的QLabel
        self.video_label = QtWidgets.QLabel(self)
        self.video_label.setGeometry(QtCore.QRect(100, 50, 1000, 600))
        self.video_label.setFrameShape(QtWidgets.QFrame.Box)

        # 添加用于显示跳跃距离的QLabel
        self.result_label = QtWidgets.QLabel(self)
        self.result_label.setGeometry(QtCore.QRect(275, 30, 300, 100))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.result_label.setFont(font)
        self.result_label.setAlignment(QtCore.Qt.AlignCenter)
        self.result_label.setObjectName("result_label")

        # 添加一个定时器
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.updateFrame)
        self.timer.start(1)

在每次定时器触发时,我们将调用Video类的readFrame方法来获取视频图像,并将其显示在QLabel上。同时,我们还需要更新跳跃距离结果,并在QLabel上显示。

def updateFrame(self):
    frame = self.video.readFrame()
    if frame is not None:
        # 将Qt格式的图像显示在QLabel上
        self.video_label.setPixmap(QtGui.QPixmap.fromImage(frame))

        # 在self.result_label上显示跳跃距离结果
        self.result_label.setText("跳跃距离:%.2f 米" % self.video.distance)

通过上述方法,我们就可以实现跳远成果展示程序的功能。在使用程序时,我们只需要将视频文件与代码文件放置在同一个目录下,并运行程序即可。在程序运行过程中,我们可以实时地看到运动员跳跃的视频和跳跃距离结果,从而更好地展示运动员的跳跃成果。

三.效果展示

在这里插入图片描述

总结

本文介绍了一种基于Python和OpenCV库的跳远成果展示程序实现方法。通过计算视频中运动员的跳跃距离,并在界面上实时显示跳跃视频和跳跃距离结果,可以更好地展示运动员的跳远成果。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,我了解您的问题。基于OpenCV和PyQt的火焰识别程序可以通过以下步骤实现: 1. 安装OpenCV和PyQt库 您需要在您的计算机上安装OpenCV和PyQt库。您可以使用以下命令在终端中安装它们: ``` pip install opencv-python pip install pyqt5 ``` 2. 创建PyQt界面 使用PyQt可以轻松创建一个用户界面。您可以使用Qt Designer创建一个界面,然后使用PyQt加载它。您可以在此处了解有关如何使用Qt Designer的更多信息:https://doc.qt.io/qt-5/qtdesigner-manual.html。 3. 读取视频并进行火焰检测 使用OpenCV,您可以读取摄像头或视频文件。您可以使用以下代码读取视频文件: ``` cap = cv2.VideoCapture('video.mp4') while True: ret, frame = cap.read() if not ret: break # 进行火焰检测 ``` 然后,您可以使用OpenCV的火焰检测算法来检测视频中的火焰。例如,您可以使用以下代码: ``` gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (11, 11), 0) edged = cv2.Canny(blurred, 50, 150) (cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for c in cnts: # 计算火焰区域 ``` 4. 在PyQt界面上显示结果 最后,您可以将检测到的火焰区域绘制在PyQt界面上。您可以使用以下代码在PyQt界面上显示帧: ``` pixmap = QPixmap.fromImage(QImage(frame, frame.shape[1], frame.shape[0], QImage.Format_RGB888).rgbSwapped()) self.label.setPixmap(pixmap) ``` 您可以将此代码放置在适当的位置,例如PyQt的定时器中,以便在每个时间间隔内更新帧。 这些步骤可以帮助您创建一个基于OpenCV和PyQt的火焰识别程序
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南蓬幽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值