基于OpenCV和PyQt5的跳绳计数器应用程序

news2024/11/25 7:05:12

基于OpenCV和PyQt5的跳绳计数器应用程序

介绍

本文将介绍一个基于OpenCV和PyQt5的跳绳计数器应用程序。该程序可以使用计算机摄像头来检测跳绳动作,并计算跳绳次数。本文将介绍程序的实现方法和实现细节,包括背景减除算法和轮廓检测算法的使用。

背景减除算法

背景减除算法是一种常用的图像处理技术,用于从静态摄像头拍摄的视频中提取运动目标。该算法基于假设,即摄像头的背景是静态的,而运动目标是动态的。因此,通过将当前帧图像与背景帧图像进行差分,可以得到运动目标的二值图像。

在本程序中,我们使用了MOG2背景减除算法。该算法是一种基于高斯混合模型的背景减除算法。它将每个像素的灰度值建模为多个高斯分布的混合,其中每个高斯分布表示不同的背景或前景区域。通过比较当前帧图像的像素值与背景模型的像素值来确定每个像素是否属于前景区域。

轮廓检测算法

轮廓检测算法是一种用于检测图像中对象轮廓的算法。在本程序中,我们使用了OpenCV中的findContours函数来检测跳绳动作的轮廓。该函数接受一个二值图像和一些参数,然后返回一个轮廓列表。轮廓是由一系列连续的点组成的,表示对象的边界。通过计算轮廓的数量,我们可以确定跳绳次数。

应用程序实现

本程序使用了Python编程语言和PyQt5 GUI框架。程序界面分为两个部分:视频显示区域和跳绳计数器。

Video类是程序的核心组件,它负责处理视频帧,并使用背景减除算法和轮廓检测算法来检测跳绳动作。Video类继承了QThread类,因此可以在单独的线程中运行,以避免阻塞主线程。

程序的实现基本上是以下几个步骤:

1.初始化程序界面和Video类。

2.启动Video线程并开始视频捕捉。

3.在每个视频帧中,使用背景减除算法提取前景区域。

4.使用轮廓检测算法检测跳绳动作的轮廓。

5.计算跳绳次数并更新计数器。

6.将视频帧显示在界面上。

7.等待下一帧视频并重复上述步骤。

完整代码

import cv2
from PyQt5 import QtCore, QtGui, QtWidgets
import numpy as np

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        # 设置主窗口属性
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)

        # 添加Central Widget
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        # 添加Widget用于显示视频
        self.video_widget = QtWidgets.QLabel(self.centralwidget)
        self.video_widget.setGeometry(QtCore.QRect(100, 100, 640, 480))
        self.video_widget.setFrameShape(QtWidgets.QFrame.Box)
        self.video_widget.setText("")
        self.video_widget.setAlignment(QtCore.Qt.AlignCenter)
        self.video_widget.setObjectName("video_widget")

        # 添加Label用于显示跳绳次数
        self.result_label = QtWidgets.QLabel(self.centralwidget)
        self.result_label.setGeometry(QtCore.QRect(275, 30, 250, 50))
        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")

        # 设置主窗口的Central Widget为self.centralwidget
        MainWindow.setCentralWidget(self.centralwidget)




class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        # 创建UI对象
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # 创建视频对象并连接信号
        self.video = Video(self.ui.video_widget)
        self.video.frame_update.connect(self.ui.video_widget.setPixmap)
        self.video.count_update.connect(self.ui.result_label.setText)

        # 启动视频
        self.video.readFrame()




class Video(QtCore.QObject):
    frame_update = QtCore.pyqtSignal(QtGui.QPixmap)
    count_update = QtCore.pyqtSignal(str)

    def __init__(self, widget):
        super().__init__()
        self.cap = cv2.VideoCapture("跳绳2.mp4")
        self.fgbg = cv2.createBackgroundSubtractorMOG2()
        self.count = 0
        self.jumping = False
        self.widget = widget
        self.timer = QtCore.QTimer()

        # 连接定时器信号
        self.timer.timeout.connect(self.readFrame)

        # 每100毫秒读取一帧
        self.timer.start(100)

    def readFrame(self):
        ret, frame = self.cap.read()
        if not ret:
            self.timer.stop()
            return

        fgmask = self.fgbg.apply(frame)

        thresh = cv2.threshold(fgmask, 50, 255, cv2.THRESH_BINARY)[1]

        contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        if len(contours) > 0:
            largest_contour = max(contours, key=cv2.contourArea)
            if cv2.contourArea(largest_contour) > 1000:
                if not self.jumping:
                    self.jumping = True
                    self.count += 1
            else:
                self.jumping = False

        cv2.putText(frame, "Count: {}".format(self.count), (10, 50),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)

        # 将opencv图像格式转换为QPixmap
        h, w, ch = frame.shape
        bytes_per_line = ch * w
        convert_to_Qt_format = QtGui.QImage(frame.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
        p = convert_to_Qt_format.scaled(640, 480, QtCore.Qt.KeepAspectRatio)
        pixmap = QtGui.QPixmap.fromImage(p)

        # 发送新帧信号
        self.frame_update.emit(pixmap)

        # 发送计数信号
        self.count_update.emit("跳绳次数:%d" % self.count)






if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = MainWindow()
    MainWindow.show()
    sys.exit(app.exec_())


检测效果

在这里插入图片描述

结论

本文介绍了一个基于OpenCV和PyQt5的跳绳计数器应用程序的实现方法和实现细节。通过使用背景减除算法和轮廓检测算法,该程序可以准确地检测跳绳动作,并计算跳绳次数。该程序不仅可以用于跳绳计数,还可以用于其他需要检测运动目标的应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/559692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux(云计算)期末复习资料

1:linux概述 ​ Linux是一种自由、开放源代码的操作系统,它最初由芬兰的Linus Torvalds在1991年开发,目前已经成为世界上最流行的操作系统之一。Linux操作系统的特点是免费、稳定、安全、可定制、可移植性强、支持多任务、多用户等。 2&…

[VRTK4.0]安装VRTKv4Tilia软件包导入程序

学习目标: 演示如何从Unitv资源商店安装VRTKv4Tilia包导入器,以轻松访问VRTKv4Tilia包,这些包为构建XR体验提供了各种有用的功能. 简述: 推荐使用2022.2.11F1以上版本来进行VRTK使用,我们可以从Unity资产商店导入Tilia包管理器&am…

Windows和Kali上使用proxychains代理流量

Windows和Kali上使用proxychains代理流量 PS. 本文演示都是在kali进行的,如有出入还请联系我哦1. Linux(Debian)1.1. 检查一下是否有proxychains1.2 修改config文件 2. Linux(Debian)安装proxychians43. Windows3.1 下载3.2 配置 4. Windows下的配置5. 测试 PS. 写这…

你知道黑客是什么样?

1 前言 现代人的生活离不开互联网,提到互联网人们总会想到一个词,那就是黑客。对于黑客大家对他们的了解却只局限于电影、电视中他们“无处不在”的可怕和他们“翻手为云覆手为雨”的技术中。但真正的黑客到底是什么? 2 什么是黑客 笔挺的…

【STL模版库】模拟实现list类模版 {深度剖析list迭代器,实现list深拷贝}

一、核心结构 template <class T> struct list_node{ //[1]T _data; //[2]list_node *_next; //指向下一个节点list_node *_prev; //指向前一个节点list_node(const T &val T()):_data(val),_next(nullptr),_prev(nullptr){} };template <class T> class Myl…

截图自动添加水印(macOS/windows)

文章目录 1. 截图自动加水印1.1. windows1.2. macOS 2. 对已有图像批量加水印2.1 windows2.2 macOS 1. 截图自动加水印 1.1. windows 直接看这篇文章&#xff0c;一键截图自动生成水印/自动签名主要就是使用一个叫 SPX 的软件 1.2. macOS 其实apple的操作系统&#xff0c;i…

7、行为模式-观察者模式

一、观察者模式 当对象间存在一对多关系时&#xff0c;则使用观察者模式&#xff08;Observer Pattern&#xff09;。比如&#xff0c;当一个对象被修改时&#xff0c;则会自动通知依赖它的对象。观察者模式属于行为型模式。 介绍 意图&#xff1a;定义对象间的一种一对多的…

第十章:C语言的调试

很多小伙伴刚开始听到C语言的调试&#xff0c;这是个啥&#xff0c;表示很怀疑&#xff0c;敲代码不就是直接就是干嘛&#xff0c;结果很多小白们&#xff0c;一运行错误多的数都数不过来。就开始这改改&#xff0c;那删删&#xff0c;莫名奇妙就运行成功了。到最后都不知道到底…

WEB自动化测试,一定得掌握的8个核心知识点

​ 编辑 写在前面 使用 cypress 进行端对端测试&#xff0c;和其他的一些框架有一个显著不同的地方&#xff0c;它使用 JavaScript 作为编程语言。 传统主流的 selenium 框架是支持多语言的&#xff0c;大多数 QA 会的 python 和 Java 语言都可以编写 selenium 代码&#xff0…

Android逆向之雷速体育(360加固)

本教程仅限于学术探讨&#xff0c;也没有专门针对某个网站而编写&#xff0c;禁止用于非法用途、商业活动等&#xff0c;否则后果自负。如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01; 目录 一、攻克难点 二、分析接口 三、结束 一、攻克难点 本期app难点&am…

2023远程控制软件排行榜

对远程控制软件的排名可能是主观的&#xff0c;因为它取决于个人的需求和偏好。 但是&#xff0c;这里列出了因其功能和性能而广受认可的流行远程控制软件&#xff1a; TeamViewer TeamViewer 是一款成熟的远程控制软件&#xff0c;以其易用性和广泛的功能而闻名。 它支持远程…

君子签电子签章助推企业实现印章“集中统一管控”和“分级分权管理”

对于中大型企业来说&#xff0c;印章管理一直以来都是个“老大难”问题。 在中大型企业&#xff0c;印章数量多&#xff0c;大多分散在各个分/子公司的各个部门&#xff0c;企业印章无法统一进行有效管理。印章分散各地&#xff0c;异地分/子公司跨区域盖章难&#xff1b;分/子…

java servlet 二手物品交易平台Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java servlet 二手物品交易平台是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助 系统采用 serlvetdaobean 模式开发 &#xff0c;系统具有完整的源代码和数据 库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,My…

Allure在本地不安装allure服务的情况下打开Allure Html报告

前言 我们使用pytestallure生成Allure测试报告后&#xff0c;需要发给领导查看报告的详细信息。此时我们通过将allure生成的html报告压缩成压缩包后发送给领导&#xff0c;但是领导电脑由于没有安装Allure服务&#xff0c;打开会全部显示“Loading”&#xff0c; 无法查看到报…

信创办公–基于WPS的PPT最佳实践系列 (插入表格或图标)

信创办公–基于WPS的PPT最佳实践系列 &#xff08;插入图表或图标&#xff09; 目录 项目背景操作步骤1、插入表格2、实现放映功能 项目背景 当表格数据过大时&#xff0c;将其复制粘贴到PPT上时会显得插入的表格内容小、拥挤&#xff0c;使PPT看起来不美观。这个问题我们可以…

《微服务实战》 第十七章 Redis下载与安装

前言 Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库,由意大利人 Salvatore Sanfilippo 使用 C 语言编写。 与 SQL 型数据库截然不同,Redis 没有提供新建数据库的操作,因为它自带了 16 (0—15)个数据库(默…

牛客 BM76 正则表达式匹配 【动态规划】

描述 请实现一个函数用来匹配包括.和*的正则表达式。 1.模式中的字符.表示任意一个字符 2.模式中的字符*表示它前面的字符可以出现任意次&#xff08;包含0次&#xff09;。 在本题中&#xff0c;匹配是指字符串的所有字符匹配整个模式。例如&#xff0c;字符串"aaa"…

可算是熬出头了,测试6年,费时8个月,入职阿里,涨薪14K

前言 你的努力&#xff0c;终将成就无可替代的自己。 本科毕业后就一直从事测试的工作&#xff0c;和多数人一样&#xff0c;最开始从事点点点的工作&#xff0c;看着自己的同学一步一步往上走&#xff0c;自己还是在原地踏步&#xff0c;说实话这不是自己想要的状态。 一年半…

GPT_academic详细使用介绍与配置—可润色,翻译,解释代码(GPT助力学术,借助New Bing可实现免费使用)

&#x1f951; Welcome to Aedream同学 s blog! &#x1f951; 文章目录 绪论进入项目地址下载并解压到本地配置python3.11版本的虚拟环境安装运行所需的依赖库配置config配置代理文件配置GPT的api&#xff08;可选&#xff0c;按token计费&#xff09;配置NewBing的cookie&…

课程表 II:拓扑i排序

Problem: 210. 课程表 II 文章目录 思路解题方法1&#xff1a;首先新建一个inDegree数组用来存放所有的点的入度&#xff1a;int[] inDegree new int[numCourses];2&#xff1a;然后遍历所有子数组将所有点及其入度存进去&#xff0c;这道题就是课程号本身为坐标&#xff0c;对…