使用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
相关产品推荐
相关产品推荐

