You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MediaPipe与OpenCV显示左右手手腕坐标的代码问题排查

问题原因
  • 代码在try块开头直接同时读取左右手腕的 landmark 坐标,只要有任意一只手没有被检测到,对应的results.left_hand_landmarks或者results.right_hand_landmarks就为None,此时直接访问.landmark[0]属性会触发异常,程序直接执行except下的pass逻辑,所有坐标都不会渲染。只有当两只手同时被检测到时,开头的四个坐标赋值语句才不会报错,代码才能走到后续渲染坐标的步骤,这就是只有双手同时存在才显示坐标的核心原因。
  • 现有逻辑还存在坐标覆盖问题:如果两只手同时被检测到,右手的坐标赋值会覆盖左手的坐标值,最终只能显示右手的坐标。
修正方案

将原有try块的逻辑替换为如下代码,先判断对应手是否被检测到,再读取坐标,同时可以按需选择坐标显示逻辑:

方案1:同时显示左右手坐标(推荐)

# 初始化文本变量,避免未定义报错
left_x_text = "左手未检测"
left_y_text = ""
right_x_text = "右手未检测"
right_y_text = ""

# 仅当左手被检测到时读取坐标
if results.left_hand_landmarks:
    wrist_left_x = results.left_hand_landmarks.landmark[0].x
    wrist_left_y = results.left_hand_landmarks.landmark[0].y
    left_x_text = f"左手X: {round(wrist_left_x, 3)}"
    left_y_text = f"左手Y: {round(wrist_left_y, 3)}"

# 仅当右手被检测到时读取坐标
if results.right_hand_landmarks:
    wrist_right_x = results.right_hand_landmarks.landmark[0].x
    wrist_right_y = results.right_hand_landmarks.landmark[0].y
    right_x_text = f"右手X: {round(wrist_right_x, 3)}"
    right_y_text = f"右手Y: {round(wrist_right_y, 3)}"

# 错开位置渲染左右手坐标
cv2.putText(image, left_x_text, (30, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA)
cv2.putText(image, left_y_text, (30, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA)
cv2.putText(image, right_x_text, (30, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA)
cv2.putText(image, right_y_text, (30, 100), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA)

方案2:仅显示当前伸出的单只手坐标

show_x = "未检测到手"
show_y = ""
if results.left_hand_landmarks:
    show_x = f"手腕X: {round(results.left_hand_landmarks.landmark[0].x, 3)}"
    show_y = f"手腕Y: {round(results.left_hand_landmarks.landmark[0].y, 3)}"
elif results.right_hand_landmarks:
    show_x = f"手腕X: {round(results.right_hand_landmarks.landmark[0].x, 3)}"
    show_y = f"手腕Y: {round(results.right_hand_landmarks.landmark[0].y, 3)}"

cv2.putText(image, show_x, (30, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA)
cv2.putText(image, show_y, (30, 50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA)

内容的提问来源于stack exchange,提问作者mourat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:39:04