如何将Google ML姿态检测API提取的坐标转换为通用3D坐标系点值?
从Google ML姿态检测API的2D像素坐标+预测Z值转换为3D空间坐标
前置概念明确
先理清楚API输出参数的核心定义:
(x,y):裁剪后图像的像素坐标,原点在左上角,x向右、y向下z:相对深度值,以左右髋部连线中点为基准,朝向摄像头为负,远离摄像头为正
转换步骤
1. 自定义3D基准坐标系
先建立一个和API参数匹配的基础3D坐标系,确保后续映射逻辑统一:
- 原点:直接用左右髋部关键点的连线中点(和API的z值基准对齐)
- 轴方向:
- X轴:水平向右(和图像像素x方向一致)
- Y轴:垂直向上(修正像素坐标系y向下的方向问题)
- Z轴:垂直于相机平面,朝向摄像头为负、远离为正(和API的z值定义完全匹配)
2. 像素坐标转同尺度3D坐标
API的(x,y)是像素单位,z是相对深度,需要先统一尺度:
- 第一步:将像素坐标转为以图像中心为原点的相对坐标
假设裁剪后图像宽度为W,高度为H,计算:
对y取反是为了让轴方向和3D坐标系的Y轴(向上)对齐。x_rel = x - W/2 y_rel = H/2 - y - 第二步:用人体真实比例校准缩放系数
由于API的z没有绝对单位,我们用人体生理真实比例将像素单位转为物理单位(比如米):
比如成年人左右髋部真实宽度约0.3-0.4米,先算出API中左右髋部的像素距离hip_pixel_dist = abs(x_hip_left - x_hip_right),再计算缩放系数:
最终得到3D坐标系下的X、Y值:scale = 真实髋部宽度 / hip_pixel_distX = x_rel * scale Y = y_rel * scale
3. 复用API的z值作为3D Z坐标
API输出的z值本身就是以髋部中点为基准的相对深度,和我们定义的3D坐标系Z轴方向一致,直接复用即可:
Z = api_z_value
4. 适配任意3D空间(可选)
如果要将模型放到自定义3D场景的指定位置,可做以下变换:
- 平移:给(X,Y,Z)加上目标位置偏移量
(tx, ty, tz),得到最终坐标:X' = X + tx Y' = Y + ty Z' = Z + tz - 旋转:通过旋转矩阵对(X,Y,Z)进行旋转(比如绕Y轴旋转θ角),调整模型朝向以适配场景需求。
注意事项
- 必须使用裁剪后图像的尺寸计算,不能用原图尺寸,否则坐标会完全错位
- 缩放系数可通过多个关键点校准:比如同时用肩宽、髋宽的真实比例取平均值,提升3D模型精度
- 时刻检查坐标方向:若模型出现翻转、错位,优先确认Y轴和Z轴方向是否与定义一致
内容的提问来源于stack exchange,提问作者max.back
相关产品推荐
相关产品推荐

