1
1
import json
2
2
from abc import ABC
3
3
from dataclasses import dataclass , field
4
- from typing import Optional , Union , Dict , List , Set
4
+ from typing import Optional , Union , Any , Dict , List , Set
5
5
from enum import Enum
6
6
from nucleus .constants import (
7
7
CAMERA_PARAMS_KEY ,
8
+ CX_KEY ,
9
+ CY_KEY ,
8
10
FRAMES_KEY ,
11
+ FX_KEY ,
12
+ FY_KEY ,
13
+ HEADING_KEY ,
9
14
INDEX_KEY ,
10
15
ITEMS_KEY ,
11
16
METADATA_KEY ,
17
+ POSITION_KEY ,
12
18
REFERENCE_ID_KEY ,
13
19
TYPE_KEY ,
14
20
URL_KEY ,
21
+ W_KEY ,
22
+ X_KEY ,
23
+ Y_KEY ,
24
+ Z_KEY ,
15
25
)
16
26
from .annotation import Point3D
17
27
from .utils import flatten
@@ -29,6 +39,20 @@ class Quaternion:
29
39
z : float
30
40
w : float
31
41
42
+ @classmethod
43
+ def from_json (cls , payload : Dict [str , float ]):
44
+ return cls (
45
+ payload [X_KEY ], payload [Y_KEY ], payload [Z_KEY ], payload [W_KEY ]
46
+ )
47
+
48
+ def to_payload (self ) -> dict :
49
+ return {
50
+ X_KEY : self .x ,
51
+ Y_KEY : self .y ,
52
+ Z_KEY : self .z ,
53
+ W_KEY : self .w ,
54
+ }
55
+
32
56
33
57
@dataclass
34
58
class CameraParams :
@@ -39,6 +63,27 @@ class CameraParams:
39
63
cx : float
40
64
cy : float
41
65
66
+ @classmethod
67
+ def from_json (cls , payload : Dict [str , Any ]):
68
+ return cls (
69
+ Point3D .from_json (payload [POSITION_KEY ]),
70
+ Quaternion .from_json (payload [HEADING_KEY ]),
71
+ payload [FX_KEY ],
72
+ payload [FY_KEY ],
73
+ payload [CX_KEY ],
74
+ payload [CY_KEY ],
75
+ )
76
+
77
+ def to_payload (self ) -> dict :
78
+ return {
79
+ POSITION_KEY : self .position .to_payload (),
80
+ HEADING_KEY : self .heading .to_payload (),
81
+ FX_KEY : self .fx ,
82
+ FY_KEY : self .fy ,
83
+ CX_KEY : self .cx ,
84
+ CY_KEY : self .cy ,
85
+ }
86
+
42
87
43
88
@dataclass
44
89
class SceneDatasetItem :
@@ -60,17 +105,21 @@ def from_json(cls, payload: dict):
60
105
type = payload .get (TYPE_KEY , "" ),
61
106
reference_id = payload .get (REFERENCE_ID_KEY , None ),
62
107
metadata = payload .get (METADATA_KEY , None ),
63
- camera_params = payload .get (CAMERA_PARAMS_KEY , None ),
108
+ camera_params = CameraParams .from_json (
109
+ payload .get (CAMERA_PARAMS_KEY , {})
110
+ ),
64
111
)
65
112
66
113
def to_payload (self ) -> dict :
67
- return {
114
+ payload = {
68
115
URL_KEY : self .url ,
69
116
TYPE_KEY : self .type ,
70
117
REFERENCE_ID_KEY : self .reference_id ,
71
118
METADATA_KEY : self .metadata ,
72
- CAMERA_PARAMS_KEY : self .camera_params ,
73
119
}
120
+ if self .camera_params :
121
+ payload [CAMERA_PARAMS_KEY ] = self .camera_params .to_payload ()
122
+ return payload
74
123
75
124
def to_json (self ) -> str :
76
125
return json .dumps (self .to_payload (), allow_nan = False )
0 commit comments