7
7
8
8
from .annotation import Point3D , is_local_path
9
9
from .constants import (
10
+ CAMERA_MODEL_KEY ,
10
11
CAMERA_PARAMS_KEY ,
11
12
CX_KEY ,
12
13
CY_KEY ,
13
14
FX_KEY ,
14
15
FY_KEY ,
15
16
HEADING_KEY ,
16
17
IMAGE_URL_KEY ,
18
+ K1_KEY ,
19
+ K2_KEY ,
20
+ K3_KEY ,
21
+ K4_KEY ,
17
22
METADATA_KEY ,
18
23
ORIGINAL_IMAGE_URL_KEY ,
24
+ P1_KEY ,
25
+ P2_KEY ,
19
26
POINTCLOUD_URL_KEY ,
20
27
POSITION_KEY ,
21
28
REFERENCE_ID_KEY ,
29
36
)
30
37
31
38
39
+ class CameraModels (Enum ):
40
+ BROWN_CONRADY = "brown_conrady"
41
+ FISHEYE = "fisheye"
42
+
43
+ def __contains__ (self , item ):
44
+ try :
45
+ self (item )
46
+ except ValueError :
47
+ return False
48
+ return True
49
+
50
+
32
51
@dataclass
33
52
class Quaternion :
34
53
"""Quaternion objects are used to represent rotation.
@@ -92,6 +111,20 @@ class CameraParams:
92
111
fy : float
93
112
cx : float
94
113
cy : float
114
+ camera_model : str
115
+ k1 : float
116
+ k2 : float
117
+ k3 : float
118
+ k4 : float
119
+ p1 : float
120
+ p2 : float
121
+
122
+ def __post_init__ (self ):
123
+ if self .camera_model is not None :
124
+ if self .camera_model not in CameraModels :
125
+ raise ValueError (
126
+ f'Invalid Camera Model, the supported options are "{ CameraModels .BROWN_CONRADY } " and "{ CameraModels .FISHEYE } "'
127
+ )
95
128
96
129
@classmethod
97
130
def from_json (cls , payload : Dict [str , Any ]):
@@ -103,18 +136,40 @@ def from_json(cls, payload: Dict[str, Any]):
103
136
payload [FY_KEY ],
104
137
payload [CX_KEY ],
105
138
payload [CY_KEY ],
139
+ payload .get (K1_KEY , None ),
140
+ payload .get (K2_KEY , None ),
141
+ payload .get (K3_KEY , None ),
142
+ payload .get (K4_KEY , None ),
143
+ payload .get (P1_KEY , None ),
144
+ payload .get (P2_KEY , None ),
145
+ payload .get (CAMERA_MODEL_KEY , None ),
106
146
)
107
147
108
148
def to_payload (self ) -> dict :
109
149
"""Serializes camera params object to schematized JSON dict."""
110
- return {
150
+ payload = {
111
151
POSITION_KEY : self .position .to_payload (),
112
152
HEADING_KEY : self .heading .to_payload (),
113
153
FX_KEY : self .fx ,
114
154
FY_KEY : self .fy ,
115
155
CX_KEY : self .cx ,
116
156
CY_KEY : self .cy ,
117
157
}
158
+ if self .k1 :
159
+ payload [K1_KEY ] = self .k1
160
+ if self .k2 :
161
+ payload [K2_KEY ] = self .k2
162
+ if self .k3 :
163
+ payload [K3_KEY ] = self .k3
164
+ if self .k4 :
165
+ payload [K4_KEY ] = self .k4
166
+ if self .p1 :
167
+ payload [P1_KEY ] = self .p1
168
+ if self .p2 :
169
+ payload [P2_KEY ] = self .p2
170
+ if self .camera_model :
171
+ payload [CAMERA_MODEL_KEY ] = self .camera_model
172
+ return payload
118
173
119
174
120
175
class DatasetItemType (Enum ):
0 commit comments