项目背景
最近遇到这样一个需求:
1:实时追踪关键点组成人体模型(手臂包括三个点:手腕,肘关节,双肩;腿部包括胯骨,膝盖,脚踝)
2:运用追踪到的关键点分析计算出的关键数据包括手臂弯曲角度,双脚间距离与肩宽的比例,重心相对高度,步频,弹跳相对高度
3:界面
3.1:带追踪到的关键点的实时追踪画面
3.1:计算出的实时相关数据(2中列出的)
3.2:各个数据的合格标识符(在范围内为绿色,在范围外为红色)(每个数据范围随便设置,能体现三个状态就行,及小于范围,范围内,大于范围)
3.3:针对每个数据提出一条建议,判断数据在3.2括号内的哪种范围,以步频为例,小于范围就建议加快步频,在范围内就建议保持状态,大于范围就建议请降低步频
4:提供方式:网页
5:主要编程语言:Python
基本原理及概念
- 使用深度学习算法,如OpenPose或PoseNet,实时检测视频帧中的人体姿态。
- 从检测到的姿态中提取关键点,包括手腕、肘关节、双肩、胯骨、膝盖和脚踝。
- 计算关键数据,如手臂弯曲角度、双脚间距离与肩宽的比例、重心相对高度、步频和弹跳相对高度。
- 使用Python的Flask或Django框架创建网页,展示实时追踪画面、计算出的实时相关数据以及各个数据的合格标识符和建议。
示例代码
以下是个简单的Flask应用示例,用于展示实时追踪画面和计算出的实时相关数据:
from flask import Flask, render_template
import cv2
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
def gen():
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if ret:
# 在此处添加关键点检测和数据计算的代码
# ...
# 将处理后的帧转换为JPEG格式并返回
ret, jpeg = cv2.imencode('.jpg', frame)
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + jpeg.tobytes() + b'\r\n')
@app.route('/video_feed')
def video_feed():
return Response(gen(),
mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == '__main__':
app.run(debug=True)
在index.html
文件中,可以使用以下代码展示实时追踪画面和计算出的实时相关数据:
<!DOCTYPE html>
<html>
<head>
<title>实时追踪关键点组成人体模型</title>
</head>
<body>
<h1>实时追踪画面</h1>
<img src="{{ url_for('video_feed') }}" alt="Video" width="640" height="480">
<h1>实时相关数据</h1>
<ul>
<li>手臂弯曲角度: {{ elbow_angle }}°</li>
<li>双脚间距离与肩宽的比例: {{ leg_width_ratio }}</li>
<li>重心相对高度: {{ center_of_mass_height }}</li>
<li>步频: {{ step_frequency }}</li>
<li>弹跳相对高度: {{ bounce_height_ratio }}</li>
</ul>
</body>
</html>
核心代码:
# 以 OpenPose 为例,使用 OpenPose 进行人体姿势估计并获取关键点信息
import cv2
import numpy as np
import openpose
# 初始化 OpenPose 模型
params = {"model_folder": "openpose/models/"}
opWrapper = openpose.WrapperPython()
opWrapper.configure(params)
opWrapper.start()
# 读取视频流
cap = cv2.VideoCapture('input_video.mp4')
while True:
# 读取视频帧
ret, frame = cap.read()
# 将帧传递给 OpenPose 模型进行处理
datum = openpose.Datum()
datum.cvInputData = frame
opWrapper.emplaceAndPop([datum])
# 获取关键点信息
keypoints = datum.poseKeypoints
# 在画面上绘制关键点
if keypoints is not None:
for person in keypoints:
for point in person:
cv2.circle(frame, (int(point[0]), int(point[1])), 3, (0, 255, 0), -1)
# 显示结果
cv2.imshow("OpenPose Output", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
注意事项
- 在示例代码中,我们使用了Flask框架创建网页,你可以根据需要选择其他框架。
- 在示例代码中,我们使用了OpenCV库读取摄像头视频流,你可以根据需要选择其他库或方法。
- 在示例代码中,我们没有实现关键点检测和数据计算的部分,你需要根据需要选择合适的算法和库来实现这部分功能。
- 在示例代码中,我们没有实现各个数据的合格标识符和建议的部分,你需要根据需要设计合适的逻辑来实现这部分功能。