Mediapipe姿势估计转归一化坐标为像素坐标时报list无__round__方法错
错误原因
你触发类型报错的核心原因是归一化坐标被错误包装为了列表类型:你定义x、y时额外加了方括号,把原本是float类型的坐标值塞进了列表,后续传入to_pixel_coords函数的test_coord实际是([x_float], [y_float])的结构,遍历取值时拿到的是列表而非数值,round()无法对列表做运算就会抛出对应错误。你之前尝试转字符串、转元组的操作都没有解决“最终传入round的不是数值”的本质问题,所以报错依然存在。
修改方案
- 去掉
x、y赋值时的方括号,直接取浮点数值 - 转换得到像素坐标后拆包即可传入
mouse.move使用 - 额外修复原代码中重复颜色转换、FPS计算变量初始化位置错误的冗余/逻辑问题
修正后的完整代码如下:
import cv2 import mediapipe as mp import numpy as np import time import pyautogui import mouse mp_drawing = mp.solutions.drawing_utils mp_pose = mp.solutions.pose # 屏幕分辨率 SCREEN_DIMENSIONS = (1920, 1080) # 定义视频编码 fourcc = cv2.VideoWriter_fourcc(*"XVID") # 创建视频写入对象 out = cv2.VideoWriter("output.avi", fourcc, 20.0, SCREEN_DIMENSIONS) # 坐标转换函数提前定义,不要放在循环内重复创建 def to_pixel_coords(relative_coords): return tuple(round(coord * dimension) for coord, dimension in zip(relative_coords, SCREEN_DIMENSIONS)) with mp_pose.Pose(min_detection_confidence=0.1, min_tracking_confidence=0.9) as pose: # FPS计算变量放在循环外初始化 pTime = 0 while True: # 截图 img = pyautogui.screenshot() # 转numpy数组适配OpenCV frame = np.array(img) # BGR转RGB image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) image.flags.writeable = False # 姿态检测 results = pose.process(image) # 转回BGR用于渲染 image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) landmarks = results.pose_landmarks.landmark # 去掉方括号,直接取浮点坐标值 x = landmarks[mp_pose.PoseLandmark.NOSE.value].x y = landmarks[mp_pose.PoseLandmark.NOSE.value].y test_coord = (x, y) # 转像素坐标 pixel_x, pixel_y = to_pixel_coords(test_coord) print(pixel_x, pixel_y) # 控制鼠标移动 mouse.move(pixel_x, pixel_y) # 渲染关键点 mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS, mp_drawing.DrawingSpec(color=(245,117,66), thickness=2, circle_radius=2), mp_drawing.DrawingSpec(color=(245,66,230), thickness=2, circle_radius=2) ) # 写入视频 out.write(frame) # 计算FPS cTime = time.time() fps = 1 / (cTime - pTime) pTime = cTime cv2.putText(image, str(int(fps)), (20, 50), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3) cv2.imshow('Mediapipe Feed', image) if cv2.waitKey(10) & 0xFF == ord('q'): break out.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者Massive_M8
相关产品推荐
相关产品推荐

