NTU RGB-D 60 骨架数据集3D可视化

这篇具有很好参考价值的文章主要介绍了NTU RGB-D 60 骨架数据集3D可视化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 说明

本文是对动作识别、动作预测常见数据集NTU RGB-D 60的3D可视化,运行中可以用鼠标拖动可以查看不同视角,可以保存成GIF图,可以将Gif解析成单帧PNG图片进行进一步处理,可以将所有帧图片凭借成一个整体,实现论文中的美观度。

当然,这个代码适用于所有的骨架数据集,只需要做出一点点修改即可

2. 实现效果

实现的效果如图:
ntu60数据集,计算机视觉:从0基础开始的奋斗历程,python,深度学习,计算机视觉,人工智能


旋转视角看看:
ntu60数据集,计算机视觉:从0基础开始的奋斗历程,python,深度学习,计算机视觉,人工智能


解析成单帧图片:

ntu60数据集,计算机视觉:从0基础开始的奋斗历程,python,深度学习,计算机视觉,人工智能


拼接成一个整体图:
ntu60数据集,计算机视觉:从0基础开始的奋斗历程,python,深度学习,计算机视觉,人工智能

基本上实现了一些论文中的可视化效果

3. NTU RGB-D 60数据集的3D可视化代码

话不多说,直接上代码:

编写不易,如果对你有帮助的话可以关注、点赞、收藏支持一波,有问题欢迎评论,一定会回复你的

有的人显示不出来可能是版本问题,贴一下我运行的版本:

  • python: 3.8.12
  • pillow(即PIL): 8.4.0
  • matplotlib:3.4.3
  • numpy:·1.21.3
from PIL import Image
import os
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation as animation
matplotlib.use('TkAgg')


def create_pose(ax,plots,vals, update=False):
    connect = [
        (1,2),(2,21),(21,3),(3,4), (9,21),
        (9,10),(10,11),(11,12),(12,24),(12,25),
         (1,17), (17,18), (18,19), (19,20), (5, 21),
        (5,6), (6,7), (7,8), (8,22),(8,23),
         (1,13), (13,14),(14,15),(15,16)
        ]
    connect = [(i - 1, j - 1) for (i, j) in connect]

    LR =[
        False, False, False, False, True,
        True, True, True, True, True,
        True, True, True, True, False,
         False, False, False, False, False,
        False,False,False,False
] #这里可以设置哪些骨架是左边,哪些是右边,有时候不准可以全设置为True

# Start and endpoints of our representation
    I   = np.array([touple[0] for touple in connect])
    J   = np.array([touple[1] for touple in connect])

    lcolor = "#9b59b6" #设置骨架颜色,左右颜色
    rcolor = "#2ecc71"

    for i in np.arange( len(I) ):
        x = np.array( [vals[I[i], 0], vals[J[i], 0]] )
        z = np.array( [vals[I[i], 1], vals[J[i], 1]] )
        y = np.array( [vals[I[i], 2], vals[J[i], 2]] )
        if not update:
            plots.append(ax.plot(x, y, z, lw=2,linestyle='-' ,c=lcolor if LR[i] else rcolor))

        elif update:
            plots[i][0].set_xdata(x)
            plots[i][0].set_ydata(y)
            plots[i][0].set_3d_properties(z)
            plots[i][0].set_color(lcolor if LR[i] else rcolor)
    
    return plots
   # ax.legend(loc='lower left')

def update_gt(num, data_gt, plots_gt, fig, ax):
    gt_vals = data_gt[num]
    plots_gt = create_pose(ax, plots_gt, gt_vals, update=True)

    r = 0.75
    xroot, zroot, yroot = gt_vals[0, 0], gt_vals[0, 1], gt_vals[0, 2]
    ax.set_xlim3d([-r + xroot, r + xroot])
    ax.set_ylim3d([-r + yroot, r + yroot])
    ax.set_zlim3d([-r + zroot, r + zroot])

    return plots_gt


def visualize(input ,vision_num, save_path):
    # input dim : t, v, c
    data_gt = input
    print(data_gt.shape)
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.view_init(elev=20, azim=-40) #视角转换

    vals = np.zeros((25, 3)) # or joints_to_consider
    gt_plots=[]

    gt_plots=create_pose(ax,gt_plots,vals,update=False)

    #以下是关于坐标轴的设置,如果需要可以打开
    # ax.set_xlabel("x")
    # ax.set_ylabel("y")
    # ax.set_zlabel("z")
    # ax.legend(loc='lower left')
    # ax.set_xlim3d([-1, 1.5])
    # ax.set_xlabel('X')
    # ax.set_ylim3d([-1, 1.5])
    # ax.set_ylabel('Y')
    # ax.set_zlim3d([0.0, 1.5])
    # ax.set_zlabel('Z')
    # ax.set_title('设置标题')

    line_anim_gt = animation.FuncAnimation(fig, update_gt,vision_num,  fargs=(data_gt,gt_plots,fig,ax),interval=70, blit=False)

    #下面是关闭坐标轴和网格,如果需要可以取消注释,即可去掉坐标轴和网格
    # ax.axis('off') # 关闭坐标轴
    # ax.grid(b=None) #关闭网格

    plt.show()

    gt_name = 'test.gif' #保存名称

    line_anim_gt.save(save_path + '/' + gt_name,writer='pillow')

def get_data(file_name):
    max_V = 25 #节点数
    max_M = 2 #骨架数量
    with open(file_name, 'r') as fr:
        frame_num = int(fr.readline())
        point = np.zeros((3, frame_num, 25, 2))
        for frame in range(frame_num):
            person_num = int(fr.readline())
            for person in range(person_num):
                fr.readline()
                joint_num = int(fr.readline())
                for joint in range(joint_num):
                    v = fr.readline().split(' ')
                    if joint < max_V and person < max_M:
                        point[0,frame,joint,person] = float(v[0])#一个关节的一个坐标
                        point[1,frame,joint,person] = float(v[1])
                        point[2,frame,joint,person] = float(v[2])
    point = point[:,:,:,0] #只取一个人
    # point = np.expand_dims(point, -1)
    return point

def get_gif_imgs(gif_path, save_path):
    """
    提取动图中的每一帧图片,并保存到文件夹中
    """
    new_path = save_path
    gif = Image.open(gif_path)
    try:
        gif.save(f"{new_path}/{gif.tell()}"+"_frame.png")
        while True:
            gif.seek(gif.tell() + 1)
            gif.save(f'{new_path}/{gif.tell()}'+"_frame.png")
    except Exception as e:
        print("处理结束")

if __name__ == '__main__':
    file_name = 'S018C001P008R002A062.skeleton' #设置文件名
    input = get_data(file_name).transpose(1,2,0)
    vision_num = 70 #要可视化多少帧
    print('视频帧数共{}帧,需要可视化{}帧'.format(input.shape[0], vision_num))
    if vision_num > input.shape[0]:
        print('要可视化的帧数大于视频总帧数!')

    save_path = './result'
    if not os.path.exists(save_path):
        os.makedirs(save_path)
    visualize(input, vision_num, save_path)

    #解析gif
    gif_path = save_path + '/' + 'test.gif'
    get_gif_imgs(gif_path, save_path) #将gif解析成每一帧图片

编写不易,转载请注明出处

4. NTU RGB-D 60的 2D简单可视化

请查看我的上一篇博客:如何用Matplotlib优雅地实现NTU-RGB D骨架可视化

5. 联系方式

有问题欢迎邮件联系:
1759412770@qq,com文章来源地址https://www.toymoban.com/news/detail-567304.html

到了这里,关于NTU RGB-D 60 骨架数据集3D可视化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 3D Web可视化平台助力Aras开发PLM系统:提供数据访问、可视化和发布功能

    HOOPS中文网 慧都科技是HOOPS全套产品中国地区指定授权经销商,提供3D软件开发工具HOOPS售卖、试用、中文试用指导服务、中文技术支持。 http://techsoft3d.evget.com/ Aras是一个面向数字化工业应用的开放性平台,帮助世界领先的复杂互联产品制造商转变其产品生命周期流程,以获得

    2024年02月03日
    浏览(64)
  • 毕设 疫情数据分析与3D可视化 - python 大数据

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月10日
    浏览(42)
  • 3D感知技术(7)RGB-D融合

    D即depth,RGB-D融合即为从深度相机得到的每个点云“染色”; 如果是两个rgb相机组成的立体视觉系统,一般地,完成双目标定、矫正对齐操作后,以做相机为参考坐标系,点云对应的RGB信息,可直接从左图对应获取; 目前,市面上的RGBD相机,通常采用两个感红外的灰度相机

    2024年02月12日
    浏览(51)
  • MATLAB中3D点云数据的处理与可视化

    3D点云数据是表示3D形状的一种数据结构,它通常是通过激光扫描、立体摄影或其他3D扫描技术获得的。处理和可视化这些数据在很多领域中都非常有用,比如计算机视觉、机器人技术、地理信息系统等。MATLAB提供了一系列的工具,可以帮助我们方便地进行3D点云数据的处理与

    2024年02月03日
    浏览(50)
  • 竞赛项目 疫情数据分析与3D可视化 - python 大数据

    🔥 优质竞赛项目系列,今天要分享的是 🚩 大数据全国疫情数据分析与3D可视化 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:2分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/danch

    2024年02月13日
    浏览(34)
  • 水电站运行数据3D可视化展示方便管理运维

    水电站是现代能源体系中的重要组成部分,对于保障国家能源安全和经济发展具有重要的意义。然而,由于水电站的建设和管理涉及到大量的技术和专业知识,许多人对水电站的运行和维护存在许多疑惑和困惑。为了解决这些问题,我们引入了全新的水电站三维可视化展示系

    2024年02月12日
    浏览(41)
  • Three.js学习项目--3D抗美援朝数据可视化

    部分场景 体验地址 https://kmyc.hongbin.xyz/ 操作说明 视频 操作说明 我做了哪些(功能) draco解析glb模型 同时处理部分纹理请求 减轻一次加载纹理压力 手动控制轨道控制器镜头动画 多音频拼接 控制 封装动画播放器 控制进度切换 动画进度控制器 同步音频 模拟视频体验 useCon

    2024年02月11日
    浏览(71)
  • DataGear 制作基于 three.js 的 3D 数据可视化看板

    DataGear 支持采用原生的HTML、JavaScript、CSS制作数据可视化看板,也支持导入由 npm 、 vite 等前端工具构建的前端程序包。得益于这一特性,可以很容易制作基于three.js的3D数据可视化看板。 首先,参考three.js的官方教程 https://threejs.org/docs/index.html#manual/en/introduction/Installation 编写

    2024年03月09日
    浏览(58)
  • 介绍动作识别数据集:“NTU RGB+D”数据集和“NTU RGB+D 120”数据集

    动作识别数据集:“NTU RGB+D”数据集和“NTU RGB+D 120”数据集 (还包括AUTH UAV手势数据集:NTU 4级) 本页介绍两个数据集:“NTU RGB+D”和“NTU RGB+D 120”。 “NTU RGB+D”包含60个动作类和56,880个视频样本。 “NTU RGB+D 120”扩展了“NTU RGB+D”,增加了另外60个类和另外57,600个视频样

    2024年02月04日
    浏览(27)
  • 计算机设计大赛 疫情数据分析与3D可视化 - python 大数据

    🔥 优质竞赛项目系列,今天要分享的是 🚩 大数据全国疫情数据分析与3D可视化 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:2分 工作量:3分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/danch

    2024年03月22日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包