基于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库的跳远成果展示程序实现方法。通过计算视频中运动员的跳跃距离,并在界面上实时显示跳跃视频和跳跃距离结果,可以更好地展示运动员的跳远成果。

猜你喜欢

转载自blog.csdn.net/qq_46556714/article/details/130830793