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

news/2024/6/18 21:50:42

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


http://www.niftyadmin.cn/n/351530.html

相关文章

【权限提升】Linux Kernel 权限提升漏洞 (CVE-2023-32233)

文章目录 前言声明一、漏洞描述二、影响版本三、本地复现四、修复方案 前言 Linux Netfilter 是一个在 Linux 内核中的网络数据包处理框架,也称作 iptables,它可以通过各种规则和过滤器,基于数据包的来源、目标地址、协议类型、端口号等信息…

【2023年4月美赛加赛】Z题:The future of Olympics 25页完整论文

【2023年4月美赛加赛】Z题:The future of Olympics 25页完整论文 1 题目 背景 国际奥委会(IOC)正面临着夏季奥运会和冬季奥运会申办数量的减少**[1]**。在过去,举办奥运会的竞争非常激烈,声望也很高。然而,最近,主办…

案例14:Java酒店管理系统设计与实现开题报告

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

privateGPT centos7环境下部署和研究

参考:gihtub代码 https://github.com/imartinez/privateGPT 安装 llama-cpp-python-0.1.48安装报错 Could not build wheels for llama-cpp-python, , which is required to install pyproject.toml-based projects搜索(结果较少)&#xff…

数据结构与算法之散列表详解

一、散列表概述 散列表(Hash Table)也叫哈希表,它是一种时间复杂度能够达到接近常数的数据结构,可以用来快速地存储和查找数据。散列表通过哈希函数来将键值对映射为一个索引值,然后通过这个索引值来在数组中访问对应…

C++ CS留学生期末答疑2

#include <iostream>using namespace std;int main() {int i 0;while (i < 10) {if (i % 2 0) {continue;}printf("%d", i);i i 1;}return 0; }#include <iostream>这是一个预处理指令&#xff0c;用于包含输入输出流库&#xff0c;使我们可以使用…

大模型时代的BERT 详解

最近在学习BERT。 简单说几句。 BERTBidirectional Encoder Representation from Transformer 作者是谷歌的团队 主要亮点是使用transformer和pre-trainning未标注的数据&#xff0c;训练出来一个通用的语言模型。 0&#xff1a;背景 视觉算法因为有ImageNet的存在&#…

公司只有1个测试,领导却让我测试10个项目,这不是为难我....

读者提问&#xff1a;公司只有 1个测试&#xff0c;领导让我同时测试 10个项目&#xff0c;我该怎么办&#xff1f;回答&#xff1a;如果我是那个测试&#xff0c;我会做这三件事 1、向上申请资源2、任务分配到人3、执行测试任务 一、向上申请资源 1个测试同时对接 10个项目&a…