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

Mediapipe姿势估计转归一化坐标为像素坐标时报list无__round__方法错

错误原因

你触发类型报错的核心原因是归一化坐标被错误包装为了列表类型:你定义x、y时额外加了方括号,把原本是float类型的坐标值塞进了列表,后续传入to_pixel_coords函数的test_coord实际是([x_float], [y_float])的结构,遍历取值时拿到的是列表而非数值,round()无法对列表做运算就会抛出对应错误。你之前尝试转字符串、转元组的操作都没有解决“最终传入round的不是数值”的本质问题,所以报错依然存在。

修改方案
  1. 去掉x、y赋值时的方括号,直接取浮点数值
  2. 转换得到像素坐标后拆包即可传入mouse.move使用
  3. 额外修复原代码中重复颜色转换、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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 03:09:03