目录
- 0. 前言
- 1. opencv简介
- 2. midiepipe简介
- 3. yolo5简介
- 4. 虚拟环境搭建以及工程目录设置
- 5. 部分代码展示
- 6. 项目成果
- 7. 说明
0. 前言
本项目由我与gay友以及三位21级学弟历时一年共同合作完成
为了给运动者提供一种更加科学、更加精准的个性化运动方案,设计实现了一个家庭健身智能推荐及姿态监测系统。
实现原理如下:
系统根据已检测个体的身体指标,为其推荐个性化健身方案;通过动态采集肢体关节的运动数据值,将采集到的肢体关节的运动数据值与预设的肢体关节的运动数据域值进行实时比较,若超出预设的域值范围,则进行提示,以达到保持正确姿态的需求,从而实现对人体运动姿势的监测和报警等功能。
运行程序之后,会调用摄像头,录制运动视频,随后对视频的姿态进行分析从而判断您的运动姿态是否标准。
操作系统:Windows10 家庭版
开发环境:Pycharm Community 2022.3
此项目依赖于 Python3.8
第三方库:opencv,midiepipe,pygame
由opencv实现视频流获取,pygame中mixer模块实现语音播报,midiepipe实现动作点捕获,使用yolo5训练标准动作模型。
1. opencv简介
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库。它是由英特尔公司开发并维护的,具有跨平台、高效、简单易用等特点,被广泛应用于计算机视觉领域。
OpenCV 可以完成许多计算机视觉任务,包括图像处理、目标检测、人脸识别、视觉跟踪、结构光扫描、立体视觉、机器学习等。它支持多种编程语言,包括 C++、Python、Java 等,其中 Python 是最流行的语言之一。
OpenCV 的一些重要功能包括:
- 图像和视频 I/O
- 图像处理和变换,如缩放、旋转、截取等
- 特征提取和描述,如边缘检测、ORB、SIFT、SURF 等
- 目标检测和跟踪,如 Haar Cascade、HOG+SVM、KCF 等
- 人脸识别,包括人脸检测、对齐、特征提取等
视频分析和计算机视觉算法,如光流法、背景建模、分割、立体视觉、全景图像拼接等
2. midiepipe简介
MIDIEpipe(MIDI Event Processor)是一种 Python 编写的 MIDI 数据处理框架,它可以帮助用户对 MIDI 数据进行高效且灵活的处理。
MIDIEpipe 可以将 MIDI 数据源的输入、处理和输出进行抽象和分离,并且可以在每一步中执行一些特定的操作,例如过滤、转换、记录、调整等等。用户可以通过编写 MIDIEpipe 脚本,自定义这些操作来实现特定的 MIDI 数据处理。同时,MIDIEpipe 还支持 MIDI 设备的连接,可以实现实时 MIDI 数据捕获和处理。
MIDIEpipe 库具有强大且易于使用的 API,支持 MIDI 数据读取、过滤、转换、输出等多种操作,同时还支持一系列 MIDI 设备的接口,可以轻松实现 MIDI 设备和系统的交互。MIDIEpipe 还支持使用 Python 脚本对 MIDI 数据进行处理,这为用户提供了高度的灵活性和扩展性。
总体来说,MIDIEpipe 是一个非常强大且易于使用的 MIDI 数据处理框架,可以帮助 Python 开发者更好地处理 MIDI 数据,实现各种有趣的 MIDI 应用。
3. yolo5简介
YOLOv5(You Only Look Once version 5)是由 Ultralytics 公司最近推出的目标检测算法,相较于前一版 YOLOv4,性能提升较多,在速度和准确率上都得到了很好的平衡。YOLOv5中包含了多种模型,可以用于目标检测、物体分割和人像分割等领域。
与其他目标检测算法不同的是,YOLOv5 在检测过程中只需要一次前向传播,即可得到目标的位置和分类信息。同时,YOLOv5 还采用了一种新的 Backbone 算法,也就是 ResNet 的变体 CSPNet,可以更好地解决深度神经网络训练时的梯度消失问题,达到更好的性能。
目前,YOLOv5 在计算机视觉领域的应用非常广泛,尤其是在需要实时性的场景下表现良好。例如,行人检测、车辆检测、物体跟踪、安保监控等应用场景中,都可以使用 YOLOv5 进行快速而准确的物体检测。
4. 虚拟环境搭建以及工程目录设置
你可以使用以下第三方库实现此项目的虚拟环境搭建:
requirement.txt
PIL == 8.4.0
pygame == 2.0.2
eyed3 == 0.9.6
python-opencv == 4.5.5
mediapipe== 0.8.9.1
numpy== 1.21.4
项目源文件目录:
main.py
dispose.py
voice.py
camera.py
hand_test.py
5. 部分代码展示
camera.py
import cv2
def videocapture():
cap = cv2.VideoCapture(0) # 生成读取摄像头对象
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 获取视频的宽度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 获取视频的高度
fps = cap.get(cv2.CAP_PROP_FPS) # 获取视频的帧率
fourcc = int(cap.get(cv2.CAP_PROP_FOURCC)) # 视频的编码
# 定义视频对象输出
writer = cv2.VideoWriter("./video_result.mp4", fourcc, fps, (width, height))
while cap.isOpened():
ret, frame = cap.read() # 读取摄像头画面
cv2.imshow('teswell', frame) # 显示画面
key = cv2.waitKey(24)
'''转化为灰度图像进行处理'''
# gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 将捕获的一帧图像灰度化处理
# frame = cv2.flip(gray, 1) # 图像翻转(0:垂直翻转;1:水平翻转;-1:垂直水平翻转)
# frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 将捕获的一帧图像灰度化处理
# frame = cv2.flip(frame, 1)
writer.write(frame) # 视频保存
# 按Q退出
if key == ord('q'):
break
cap.release() # 释放摄像头
cv2.destroyAllWindows() # 释放所有显示图像窗口
dispose.py
import os
import cv2
import mediapipe as mp
import time
import os
# os.environ["CUDA_DEVICES_ORDER"]="PCI_BUS_IS"
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
def fun():
# mp.solutions.drawing_utils用于绘制
mp_drawing = mp.solutions.drawing_utils
# 参数:1、颜色,2、线条粗细,3、点的半径
DrawingSpec_point = mp_drawing.DrawingSpec((0, 255, 0), 1, 1)
DrawingSpec_line = mp_drawing.DrawingSpec((173,255,47), 1, 1)
# mp.solutions.holistic是一个类别,是人的整体
mp_holistic = mp.solutions.holistic
# 参数:1、是否检测静态图片,2、姿态模型的复杂度,3、结果看起来平滑(用于video有效),4、检测阈值,5、跟踪阈值
holistic = mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5)
cap = cv2.VideoCapture('./video_result.mp4')
while cap.isOpened():
success, image = cap.read()
if not success:
print("Ignoring empty camera frame.")
# open_mp3()
break
image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 处理RGB图像
results = holistic.process(image1)
'''
mp_holistic.PoseLandmark类中共33个人体骨骼点
mp_holistic.HandLandmark类中共21个手部关键点
脸部有468个关键点
'''
# 省略部分核心代码
def analysic():
fun()
holistic.close()
cv2.destroyAllWindows()
cap.release()
6. 项目成果
无论是半身、全身帧都能够将人体重要动作分析的结点给采集到。
实际上它可以实现分析视频并于标准动作进行比对的效果,由于视频不便上传,所以在此不放视频演示效果。
7. 说明
为保护产权,本项目的代码和资源文件并不完整。
- 语音包换成一个无实际意义的语音
- 本项目
dispose.py
和hand_test.py
删除了核心算法代码,无法完成核心功能。
本文参考:
家庭健身智能推荐与姿态监测系统 | 道坤