前几期文章中,我们分享了人脸468点检测与人手28点检测的技术实现,本期我们将重点介绍人体姿态检测及其应用。
人体姿态检测在多个领域发挥着重要作用,例如体育锻炼的量化、手语识别及全身手势控制等。此外,在增强现实技术中,人体姿态检测还能将数字内容和信息覆盖在现实世界之上。
MediaPipe Pose 是一种用于高精度人体姿态跟踪的机器学习解决方案,基于 Blazepose 的研究成果,并利用 ML Kit Pose Detection API 提供 RGB 视频帧中的33个2D标志(或25个下身标志)。当前最先进的方法依赖于强大的桌面环境进行推理,而 MediaPipe Pose 方法可以在大多数现代手机甚至 Web 上实现实时性能。
MediaPipe Pose 使用两步检测器-跟踪器的 ML 管道。首先,检测器在每一帧中定位感兴趣的人体区域(ROI)。接下来,跟踪器使用 ROI 裁剪后的帧作为输入来预测 ROI 内的姿态关键点。对于视频用例,只有在需要时(如第一帧)或者当跟踪器无法识别前一帧中的姿态时才会调用检测器。其余情况下,管道会从前一帧的姿态关键点中推导出 ROI。
该检测器借鉴了轻量级模型的设计理念,用于定位和预测人体姿态的关键点。它不仅预测了25个下身标志,还额外预测了两个虚拟关键点,用于描述人体的中心、旋转和缩放情况。具体来说,它预测了人体臀部的中点、包围整个人体的圆的半径以及连接肩部和臀部中点的直线的倾斜角度。
MediaPipe Pose 中的地标模型有两种版本:一种可以预测33个姿态地标位置的全身模型,另一种仅预测前25个姿态地标。后者在某些情况下可能更加准确,特别是在下半身不可见的情况下。
```python import cv2 import mediapipe as mp
mpdrawing = mp.solutions.drawingutils mppose = mp.solutions.pose drawingspec = mpdrawing.DrawingSpec(thickness=2, circleradius=1) drawingspec1 = mpdrawing.DrawingSpec(thickness=2, circle_radius=1, color=(255, 255, 255))
pose = mppose.Pose(staticimagemode=True, mindetection_confidence=0.5)
file = 'images/4.jpg' image = cv2.imread(file) imageheight, imagewidth, _ = image.shape
results = pose.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
print(f'Nose coordinates: ({results.poselandmarks.landmark[mppose.PoseLandmark.NOSE].x * imagewidth}, {results.poselandmarks.landmark[mppose.PoseLandmark.NOSE].y * imageheight})')
annotatedimage = image.copy() mpdrawing.drawlandmarks( annotatedimage, results.poselandmarks, mppose.POSECONNECTIONS, landmarkdrawingspec=drawingspec, connectiondrawingspec=drawing_spec1 )
cv2.imshow('annotatedimage', annotatedimage) cv2.waitKey(0) cv2.imwrite('images/pose11.png', annotated_image) pose.close() ```
这段代码首先初始化了一个人体姿态检测器,然后读取了一张测试图片,并将其转换为 RGB 格式进行姿态检测。接着,它打印了鼻子的坐标,并使用 mp_drawing.draw_landmarks
函数绘制了姿态关键点,最后保存了检测结果。
```python import cv2 import mediapipe as mp import time
mpdrawing = mp.solutions.drawingutils mppose = mp.solutions.pose drawingspec = mpdrawing.DrawingSpec(thickness=2, circleradius=1) drawingspec1 = mpdrawing.DrawingSpec(thickness=2, circle_radius=1, color=(255, 255, 255))
pose = mppose.Pose(mindetectionconfidence=0.5, mintracking_confidence=0.5)
cap = cv2.VideoCapture(0) time.sleep(2)
while cap.isOpened(): success, image = cap.read() if not success: print("Ignoring empty camera frame.") continue
# 翻转图像并转换为RGB格式
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
image.flags.writeable = False
# 进行姿态检测
results = pose.process(image)
# 设置图像可写并转换回BGR格式
image.flags.writeable = True
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
# 绘制姿态关键点
mp_drawing.draw_landmarks(
image,
results.pose_landmarks,
mp_pose.POSE_CONNECTIONS,
landmark_drawing_spec=drawing_spec,
connection_drawing_spec=drawing_spec1
)
# 显示检测结果
cv2.imshow('MediaPipe Pose', image)
if cv2.waitKey(5) & 0xFF == ord('q'):
break
pose.close() cap.release() ```
这段代码展示了如何使用 MediaPipe Pose 实现实时视频中的姿态检测。首先,它打开了摄像头,然后在一个循环中捕获每一帧图像。每帧图像被翻转并转换为 RGB 格式进行姿态检测,然后绘制关键点并在屏幕上实时显示。
通过上述实现,我们可以开发多种应用,例如在电视上添加摄像头,实时检测观看者的姿态,评估其是否保持健康姿势;或者在教育环境中,监控学生上课和写字时的姿态,从而提供反馈。此外,这种技术也可以应用于体育运动的评判等领域。
以上便是对人体姿态检测及其应用的详细介绍。希望这些信息对你有所帮助!