项目背景
最近遇到这样一个需求:
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 cv2app = 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 = frameopWrapper.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'):breakcap.release()
cv2.destroyAllWindows()
注意事项
- 在示例代码中,我们使用了Flask框架创建网页,你可以根据需要选择其他框架。
- 在示例代码中,我们使用了OpenCV库读取摄像头视频流,你可以根据需要选择其他库或方法。
- 在示例代码中,我们没有实现关键点检测和数据计算的部分,你需要根据需要选择合适的算法和库来实现这部分功能。
- 在示例代码中,我们没有实现各个数据的合格标识符和建议的部分,你需要根据需要设计合适的逻辑来实现这部分功能。