mediapipe构建手部角度列表
时间: 2025-01-01 14:21:53 浏览: 1
### 如何使用 MediaPipe 构建手部关键点角度列表
MediaPipe 提供了强大的工具用于捕捉和处理人体不同部分的姿态数据,特别是对于手部姿态的精确检测。为了构建手部关键点的角度列表,主要依赖于 MediaPie 的 Hand Landmark Model 来获取手部各个关节的位置信息。
通过这些位置信息,可以计算相邻骨骼之间的夹角,从而形成手部姿势的角度描述。具体来说,在捕获到的手部图像上应用 MediaPipe 手部模块后,会得到一系列代表手指和其他重要特征点坐标的集合[^1]。
下面是一个 Python 脚本的例子,展示了如何利用 MediaPipe 库来创建这样的角度列表:
```python
import cv2
import mediapipe as mp
import math
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(static_image_mode=False,
max_num_hands=2,
min_detection_confidence=0.5)
def calculate_angle(a, b, c):
"""
计算由三个点构成的角度。
参数:
a (list): 第一点坐标[x,y,z]
b (list): 中间点坐标[x,y,z],作为顶点
c (list): 第三点坐标[x,y,z]
返回:
float: 角度值(单位为度数)
"""
radians = math.atan2(c[1]-b[1], c[0]-b[0]) - math.atan2(a[1]-b[1], a[0]-b[0])
angle = abs(radians*180.0/math.pi)
if angle > 180.0:
angle = 360-angle
return round(angle, 2)
cap = cv2.VideoCapture(0)
while cap.isOpened():
success, image = cap.read()
if not success:
break
# 将BGR转RGB并翻转水平方向上的颜色通道顺序
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = hands.process(image_rgb).multi_hand_landmarks
angles_list = []
if results is not None and len(results.multi_hand_landmarks)>0 :
handLms = results.multi_hand_landmarks[0].landmark
for id in range(len(handLms)):
if id % 4 != 0 or id == 0: continue
point_a = [handLms[id-1].x, handLms[id-1].y, handLms[id-1].z]
point_b = [handLms[id].x, handLms[id].y, handLms[id].z]
try:
next_point_id = id + 4 if id < 20 else id - 16
point_c = [handLms[next_point_id].x, handLms[next_point_id].y, handLms[next_point_id].z]
angle = calculate_angle(point_a, point_b, point_c)
angles_list.append((id, angle))
except IndexError:
pass
print(f'当前帧中的手部角度列表:{angles_list}')
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
cv2.destroyAllWindows()
```
这段代码实现了对手指各节之间形成的特定角度进行测量,并将其存储在一个列表中以便后续分析或可视化显示。此过程涉及到遍历所有可能组成角度的关键点组合,并调用 `calculate_angle` 函数完成实际的角度计算工作[^4]。
阅读全文