推荐微信网站建设,湖南定制响应式网站有哪些,嘉兴快速建站合作,个人公益网站怎么制作正确的身体姿势是一个人整体健康的关键。然而#xff0c;保持正确的身体姿势可能很困难#xff0c;因为我们经常忘记这一点。这篇博文将引导您完成为此构建解决方案所需的步骤。最近#xff0c;我们在使用 POSE 进行身体姿势检测方面玩得很开心。它就像一个魅力#xff01;…
正确的身体姿势是一个人整体健康的关键。然而保持正确的身体姿势可能很困难因为我们经常忘记这一点。这篇博文将引导您完成为此构建解决方案所需的步骤。最近我们在使用 POSE 进行身体姿势检测方面玩得很开心。它就像一个魅力
文章目录
使用 Pose 进行身体姿势检测应用目的身体姿势检测和分析应用工作流程要求身体姿势检测代码说明使用 pose进行身体姿势检测
Pose 是一种高保真身体姿势跟踪解决方案可从 RGB 帧注意RGB图像帧渲染全身上的33 个 3D 地标和背景分割掩模。它利用 BlazePose[1] 拓扑这是 COCO[2]、BlazeFace[3] 和 BlazePalm[4] 拓扑的超集。 应用目标 – 身体追踪
我们的目标是从完美的侧视图检测一个人并测量颈部和躯干相对于某个参考轴的倾斜度。通过监测人弯曲低于某个阈值角度时的倾斜角度。 其他功能包括测量特定姿势的时间和相机对准。我们必须确保相机看到正确的侧视图。因此我们需要对齐功能。
添加 代码环境安装
pip install -r requirements.txt身体姿势检测代码说明
1. 导入库
import cv2
import numpy…
2. 计算偏移距离的函数
该设置要求人处于正确的侧视图中。该函数findDistance 帮助我们确定两点之间的偏移距离。它可以是髋点、眼睛或肩膀。 选择这些点是因为它们总是或多或少关于人体的中心轴对称。这样我们将在脚本中合并相机对齐功能。
def findDistance(x1, y1, x2, y2):
dist m.sqrt((x2-x1)**2(y2-y1)**2)
return dist3. 计算身体姿势倾斜度的功能
角度是姿势的主要决定因素。我们使用颈线和躯干线与 y 轴所成的角度。领口连接肩膀和眼睛。这里我们以肩部为支点。 同样躯干线连接臀部和肩膀其中臀部被认为是枢轴点 以颈线为例我们有以下几点。 P1 (x1,y1)肩部 P2 (x2, y2)眼睛 P3 (x3,y3)穿过P1的垂直轴上的任意点 显然P3的x 坐标与 P1 的 x 坐标相同。由于y3对所有y都有效因此为了简单起见我们取 y3 0。 我们采用向量方法来求三点的内角。两个向量P 12 和P 13之间的角度 由下式给出
def findAngle(x1, y1, x2, y2):theta m.acos( (y2 -y1)*(-y1) / (m.sqrt((x2 - x1)**2 (y2 - y1)**2 ) * y1) )degree int(180/m.pi)*thetareturn degree4. 发送不良身体姿势警报功能
使用此功能在检测到不良姿势时发送警报。我们将其留为空供您使用。您可以在方便的时候随意发挥创意和定制。例如您可以连接 Telegram Bot 来发出警报这非常简单。链接见参考文献[6]。或者您可以通过创建 Android 应用程序将其提升一个档次。
def sendWarning(x):pass
在这里初始化常量和方法。这些内容应该通过内联注释是不言自明的。
# Initialize frame
counters.good_frames 0bad_frames 0
# Font type.font cv2.FONT_HERSHEY_SIMPLEX #
Colors.blue (255, 127, 0)red (50, 50, 255)green (127, 255, 0)dark_blue (127, 20, 0)light_green (127, 233, 100)yellow (0, 255, 255)pink (255, 0, 255)
# Initialize mediapipe pose
class.mp_pose mp.solutions.posepose mp_pose.Pose()身体姿势检测主要功能
1. 创建视频捕获和视频写入器对象
为了进行演示我们使用预先录制的视频样本。在实践中您需要定位网络摄像头以捕获您的侧视图。在以下代码片段中创建了视频捕获和视频编写器对象。 如您所见我们正在获取视频元数据来创建视频捕获对象。如果要以mp4格式写入请将编解码器更改为*‘mp4v’。有关视频编写器和处理编解码器的更直观指南请查看有关OpenCV 视频编写器的文章。
# For webcam input replace file name with 0.
file_name input.mp4 cap cv2.VideoCapture(file_name)
# Meta.
fps int(cap.get(cv2.CAP_PROP_FPS))
width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
frame_size (width, height)
fourcc cv2.VideoWriter_fourcc(*mp4v)
# Video writer.
video_output cv2.VideoWriter(output.mp4, fourcc, fps, frame_size)2.身体姿势检测 主循环
fPose ()解决方案的可配置 API不需要太多调整。默认值足以检测姿势地标。但是如果我们希望实用程序生成分段掩码则 ENABLE_SEGMENTATION 标志必须设置为True。以下是姿势解决方案中的一些可配置 API 。STATIC_IMAGE_MODE这是一个布尔值。如果设置为True则会针对每个输入图像运行人物检测。这对于视频来说不是必需的视频中检测运行一次然后进行地标跟踪。默认值为False。 MODEL_COMPLEXITY默认值为 1。它可以是 0、1 或 2。如果选择更高的复杂度推理时间会增加。ENABLE_SEGMENTATION如果设置为True解决方案会生成分割掩模以及姿势地标。默认值为False。MIN_DETECTION_CONFIDENCE范围从 [0.0 – 1.0]。顾名思义它是检测被认为有效的最小置信度值。默认值为 0.5。MIN_TRACKING_CONFIDENCE范围从 [0.0 – 1.0]。它是被视为已跟踪的地标的最小置信值。默认值为 0.5。
通常默认值就可以很好地工作。因此我们不会在mp_pose.Pose().以下部分中传递任何参数该部分将讨论 RGB 帧的处理稍后我们可以从中提取姿势地标。最后我们将图像转换回 OpenCV 友好的 BGR颜色空间。
3. 获取身体姿势地标坐标
解决方案输出对象的pose_landmarks属性提供地标的标准化x和y坐标。因此为了获得实际值我们需要将输出分别乘以图像的宽度和高度。 地标“ LEFT_SHOULDER”、“RIGHT_SHOULDER”等是 PoseLandmark 类的属性。为了获取标准化坐标我们使用以下语法。
使用如下所示的表示形式来简化这些方法。
4. 对齐相机
这是为了确保相机捕捉到人的正确侧视图。我们正在测量左肩点和右肩点之间的水平距离。正确对齐后左右点应该几乎重合。 请注意偏移距离阈值基于对具有与视频样本精确尺寸的数据集的观察。如果您尝试使用更高分辨率的样本该值将会改变。它不必非常具体您可以根据自己的直觉设置阈值。 实际上距离法根本不是确定对齐的正确方法。它应该是基于角度的。 为简单起见我们使用距离方法。
# Calculate distance between left shoulder and right shoulderpoints.offset findDistance(l_shldr_x, l_shldr_y, r_shldr_x, r_shldr_y)
# Assist to align the camera to point at the side view of the person.
# Offset threshold 30 is based on results obtained from analysis over 100 samples.if offset 100: cv2.putText(image, str(int(offset)) Aligned, (w - 150, 30), font, 0.9, green, 2)else: cv2.putText(image, str(int(offset)) Not Aligned, (w - 150, 30), font, 0.9, red, 25. 计算身体姿势倾斜度并绘制地标
使用预定义函数获得倾角findAngle。地标及其连接如下图所示。
6. 身体姿势检测条件
根据姿势的好坏显示结果。同样阈值角度基于直觉。您可以根据需要设置阈值。每次检测时良好姿势和不良姿势的帧计数器都会分别递增。 特定姿势的时间可以通过帧数除以fps来计算。查看我们之前的博客文章中的fps 测量方法。 结论
这就是使用构建姿势校正器应用程序的全部内容。在这篇文章中我们实现检测人体姿势。您学习了如何获取姿势标志、可配置 API、输出等。我希望这篇博文可以帮助 姿势的基础知识并帮助您为下一个项目产生一些新想法。