matplotlib绘制3D人体姿态

效果图如下:

导入必要的库:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

假设你已经读取了人体关键点的信息,此处直接用静态数据。

post_out = np.array([
    [0,0,0.787822068],
    [0.123238757,-0.040780518,0.78164047],
    [0.131162703,0.05052188,0.356339693],
    [0.101998687,-0.134696901,0],
    [-0.123237714,0.040785622,0.79400897],
    [-0.040740184,0.075435936,0.358784974],
    [-0.032220125,-0.093336225,0.009030402],
    [-0.004283257,-0.027451605,1.036530614],
    [-0.020511895,-0.014475852,1.293020725],
    [-0.035262831,0.071317613,1.387965202],
    [-0.07418853,0.023139238,1.495238662],
    [-0.176504895,0.024071693,1.260654569],
    [-0.167135298,0.210691005,1.104242444],
    [0.009177908,0.251894534,1.199225664],
    [0.130504638,-0.098547608,1.273252487],
    [0.233572304,-0.229689911,1.055113673],
    [0.307354271,-0.038980789,0.936925113],
])

创建图表对象

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

创建显示函数:

def show3Dpose(vals, ax):
    ax.view_init(elev=15., azim=70)

    lcolor=(0,0,1)
    rcolor=(1,0,0)

    I = np.array( [0, 0, 1, 4, 2, 5, 0, 7,  8,  8, 14, 15, 11, 12, 8,  9])
    J = np.array( [1, 4, 2, 5, 3, 6, 7, 8, 14, 11, 15, 16, 12, 13, 9, 10])

    LR = np.array([0, 1, 0, 1, 0, 1, 0, 0, 0,   1,  0,  0,  1,  1, 0, 0], dtype=bool)

    for i in np.arange( len(I) ):
        x, y, z = [np.array( [vals[I[i], j], vals[J[i], j]] ) for j in range(3)]
        ax.plot(x, y, z, lw=2, color = lcolor if LR[i] else rcolor)

    RADIUS = 0.72
    RADIUS_Z = 0.7

    xroot, yroot, zroot = vals[0,0], vals[0,1], vals[0,2]
    ax.set_xlim3d([-RADIUS+xroot, RADIUS+xroot])
    ax.set_ylim3d([-RADIUS+yroot, RADIUS+yroot])
    ax.set_zlim3d([-RADIUS_Z+zroot, RADIUS_Z+zroot])
    ax.set_aspect('auto') # works fine in matplotlib==2.2.2

    white = (1.0, 1.0, 1.0, 0.0)
    ax.xaxis.set_pane_color(white) 
    ax.yaxis.set_pane_color(white)
    ax.zaxis.set_pane_color(white)

    ax.tick_params('x', labelbottom = False)
    ax.tick_params('y', labelleft = False)
    ax.tick_params('z', labelleft = False)

调用函数,输出图像:

show3Dpose(post_out,ax)
plt.show()

 

完整代码

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

post_out = np.array([
    [0,0,0.787822068],
    [0.123238757,-0.040780518,0.78164047],
    [0.131162703,0.05052188,0.356339693],
    [0.101998687,-0.134696901,0],
    [-0.123237714,0.040785622,0.79400897],
    [-0.040740184,0.075435936,0.358784974],
    [-0.032220125,-0.093336225,0.009030402],
    [-0.004283257,-0.027451605,1.036530614],
    [-0.020511895,-0.014475852,1.293020725],
    [-0.035262831,0.071317613,1.387965202],
    [-0.07418853,0.023139238,1.495238662],
    [-0.176504895,0.024071693,1.260654569],
    [-0.167135298,0.210691005,1.104242444],
    [0.009177908,0.251894534,1.199225664],
    [0.130504638,-0.098547608,1.273252487],
    [0.233572304,-0.229689911,1.055113673],
    [0.307354271,-0.038980789,0.936925113],
])

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

def show3Dpose(vals, ax):
    ax.view_init(elev=15., azim=70)

    lcolor=(0,0,1)
    rcolor=(1,0,0)

    I = np.array( [0, 0, 1, 4, 2, 5, 0, 7,  8,  8, 14, 15, 11, 12, 8,  9])
    J = np.array( [1, 4, 2, 5, 3, 6, 7, 8, 14, 11, 15, 16, 12, 13, 9, 10])

    LR = np.array([0, 1, 0, 1, 0, 1, 0, 0, 0,   1,  0,  0,  1,  1, 0, 0], dtype=bool)

    for i in np.arange( len(I) ):
        x, y, z = [np.array( [vals[I[i], j], vals[J[i], j]] ) for j in range(3)]
        ax.plot(x, y, z, lw=2, color = lcolor if LR[i] else rcolor)

    RADIUS = 0.72
    RADIUS_Z = 0.7

    xroot, yroot, zroot = vals[0,0], vals[0,1], vals[0,2]
    ax.set_xlim3d([-RADIUS+xroot, RADIUS+xroot])
    ax.set_ylim3d([-RADIUS+yroot, RADIUS+yroot])
    ax.set_zlim3d([-RADIUS_Z+zroot, RADIUS_Z+zroot])
    ax.set_aspect('auto') # works fine in matplotlib==2.2.2

    white = (1.0, 1.0, 1.0, 0.0)
    ax.xaxis.set_pane_color(white) 
    ax.yaxis.set_pane_color(white)
    ax.zaxis.set_pane_color(white)

    ax.tick_params('x', labelbottom = False)
    ax.tick_params('y', labelleft = False)
    ax.tick_params('z', labelleft = False)

show3Dpose(post_out,ax)
plt.show()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于我是AI语言模型,无法提供图形绘制功能,但是我可以提供实现此功能的代码示例,您可以在jupyter notebook或者python IDE中运行此代码实现动态人体3D姿态图的绘制。 ```python import numpy as np from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import matplotlib.animation as animation # 生成数据 np.random.seed(2018) data = np.random.randn(32, 3) data[0] = [-1, -1, -1] data[1] = [-1, 1, -1] data[2] = [1, 1, -1] data[3] = [1, -1, -1] data[4] = [-1, -1, 1] data[5] = [-1, 1, 1] data[6] = [1, 1, 1] data[7] = [1, -1, 1] # 构造骨骼 bones = [[0, 1], [1, 2], [2, 3], [3, 0], [4, 5], [5, 6], [6, 7], [7, 4], [0, 4], [1, 5], [2, 6], [3, 7]] # 构造人体姿态 poses = [[0, 1, 2, 3, 0, 4, 5, 6, 7, 4], [0, 4, 5, 1, 2, 6, 7, 3, 2, 1], [0, 1, 5, 4, 7, 6, 2, 3, 7, 4], [0, 4, 7, 3, 2, 6, 5, 1, 5, 6], [0, 1, 2, 3, 0, 4, 7, 6, 5, 1], [4, 5, 6, 7, 4, 0, 1, 2, 3, 7], [0, 4, 7, 3, 2, 6, 5, 1, 2, 6], [0, 1, 5, 4, 7, 6, 2, 3, 3, 7]] # 定义动画函数 def animate(i): ax.clear() ax.set_xlim([-2, 2]) ax.set_ylim([-2, 2]) ax.set_zlim([-2, 2]) ax.view_init(azim=i, elev=30) for pose in poses: xs = [data[bones[k][0]][0] for k in pose] ys = [data[bones[k][0]][1] for k in pose] zs = [data[bones[k][0]][2] for k in pose] ax.plot(xs, ys, zs, color='b') # 定义主函数 def main(): fig = plt.figure() global ax ax = fig.add_subplot(111, projection='3d') ani = animation.FuncAnimation(fig, animate, frames=np.arange(0, 360, 2), interval=50) plt.show() if __name__ == '__main__': main() ``` 在运行此代码后,您将会看到一个动态的人体3D姿态图。如果您想要更改人体姿态,可以修改代码中的poses列表。如果您想要更改骨骼的连接方式,可以修改代码中的bones列表。如果您想要更改人体的形状,可以修改代码中的data列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值