首页 > 解决方案 > 使用python在3D图中绘制骨架点

问题描述

我正在做我的大学项目,我有 NTU RGBD 数据集的骨架文件但我很困惑这些骨架文件代表什么,这是骨架文件的一部分

103
1
72057594037931101 0 1 1 1 1 0 0.02764709 0.05745083 2
25
0.2181153 0.1725972 3.785547 277.419 191.8218 1036.233 519.1677 -0.2059419 0.05349901 0.9692109 -0.1239193 2
0.2323292 0.4326636 3.714767 279.2439 165.8569 1041.918 444.3235 -0.2272637 0.05621852 0.964434 -0.1227094 2
0.2457799 0.6877249 3.633897 281.1529 139.0885 1047.837 367.3966 -0.2486043 0.0660736 0.9535829 -0.1565561 2
0.2128507 0.8079225 3.581995 278.1617 125.6969 1039.476 328.9554 0 0 0 0 2
0.1109304 0.6111551 3.716962 267.2831 148.2511 1007.479 393.5405 0.2179059 0.7353331 -0.6371263 -0.07663021 2
0.100875 0.4286715 3.742593 266.2123 166.5774 1004.187 446.2603 0.03366299 0.7429995 -0.0668001 -0.6650987 1
0.1186992 0.3428923 3.556542 268.5588 173.2219 1011.711 465.4302 -0.5255184 0.8340511 0.1235747 -0.1136605 1
0.1165352 0.3173672 3.550741 268.3543 175.7982 1011.131 472.8558 -0.1148792 0.9877279 -0.0299019 -0.1014999 2
0.3449145 0.5740387 3.588655 291.5822 149.8556 1078.05 398.4594 -0.1106443 0.771432 0.5446612 -0.3098302 2
0.4211396 0.3847547 3.627778 298.8716 169.6459 1098.838 455.4754 0.06063642 0.961247 0.2020273 0.1775176 2
0.1918999 0.3189077 3.540756 276.1781 175.5411 1033.77 472.192 0.4641625 0.2649592 -0.3935434 0.7479796 2
0.1298675 0.317039 3.542577 269.7591 175.7559 1015.225 472.7473 0.6194489 0.3464894 -0.3181734 0.6284853 2
0.162766 0.1745395 3.778471 272.0995 191.6048 1020.896 518.4943 -0.05136763 -0.6810405 0.7174643 -0.1370778 2
0.1975115 -0.1360554 3.904381 274.8451 221.2371 1028.12 604.0775 -0.1458015 -0.5206363 0.1335629 0.8305664 2
0.2442706 -0.4201995 4.054147 278.3998 246.4292 1037.602 676.7612 -0.04763737 0.1068644 0.244998 0.9624379 2
0.2040377 -0.476396 4.094294 274.5897 251.0867 1026.418 690.1627 0 0 0 0 2
0.2699234 0.1678491 3.730005 282.8167 192.0363 1052.036 519.8357 -0.2298583 0.6472055 0.644957 -0.3351428 2
0.3105748 -0.1462299 3.818383 286.1002 222.5039 1060.931 607.8004 0.08184162 0.837252 0.1252462 0.5259509 2
0.3428889 -0.433214 3.943258 288.1872 248.7218 1066.199 683.3955 0.2016301 0.9774966 0.05738356 0.02351441 2
0.2951482 -0.5017325 3.968896 283.5814 254.7903 1052.752 700.8542 0 0 0 0 2
0.2425592 0.6247278 3.656055 280.6673 145.8599 1046.329 386.8308 -0.2489336 0.06207102 0.9568546 -0.1364125 2
0.1200176 0.2955468 3.532409 268.7763 177.8907 1012.419 478.8939 0 0 0 0 2
0.0989792 0.3459614 3.527539 266.6139 172.6136 1006.227 463.6581 0 0 0 0 2
0.08710064 0.2988889 3.54619 265.3322 177.6662 1002.409 478.2144 0 0 0 0 2
0.1268453 0.2813963 3.549525 269.4193 179.4981 1014.19 483.5357 0 0 0 0 2

现在我想使用 matlpotlib 绘制这些文件,但我不知道如何读取这些文件。

标签: pythonmatplotlibplot3d

解决方案


你可以使用这个骨架阅读器:https ://github.com/zhujiagang/st-gcn-data-len/blob/master/tools/ntu_read_skeleton.py

为了更好地使用,我对此做了一些小改动。您可以简单地使用文件名调用 extract_keypoints(),您将获得一个 numpy 数组,其中包含每个关节和每个视频帧的所有 x、y、z 坐标。

class NTURGBSkeletonReader():
      def read_skeleton(self, file):
        with open(file, 'r') as f:
            skeleton_sequence = {}
            skeleton_sequence['numFrame'] = int(f.readline())
            skeleton_sequence['frameInfo'] = []
            for t in range(skeleton_sequence['numFrame']):
                frame_info = {}
                frame_info['numBody'] = int(f.readline())
                frame_info['bodyInfo'] = []
                for m in range(frame_info['numBody']):
                    body_info = {}
                    body_info_key = [
                        'bodyID', 'clipedEdges', 'handLeftConfidence',
                        'handLeftState', 'handRightConfidence', 'handRightState',
                        'isResticted', 'leanX', 'leanY', 'trackingState'
                    ]
                    body_info = {
                        k: float(v)
                        for k, v in zip(body_info_key, f.readline().split())
                    }
                    body_info['numJoint'] = int(f.readline())
                    body_info['jointInfo'] = []
                    for v in range(body_info['numJoint']):
                        joint_info_key = [
                            'x', 'y', 'z', 'depthX', 'depthY', 'colorX', 'colorY',
                            'orientationW', 'orientationX', 'orientationY',
                            'orientationZ', 'trackingState'
                        ]
                        joint_info = {
                            k: float(v)
                            for k, v in zip(joint_info_key, f.readline().split())
                        }
                        body_info['jointInfo'].append(joint_info)
                    frame_info['bodyInfo'].append(body_info)
                skeleton_sequence['frameInfo'].append(frame_info)
        return skeleton_sequence

    def extract_keypoints(self, file_path):
        ntu_skeleton_seq = self.read_skeleton(file_path)
        sequence = []
        for frame in ntu_skeleton_seq['frameInfo']:
            if len(frame['bodyInfo']) == 1:
                keypoints = np.array([[key['x'], key['y'], key['z'], 1] for key in frame['bodyInfo'][0]['jointInfo']])

                sequence.append(keypoints)

        return np.array(sequence)


推荐阅读