Skip to content

Commit d4e3d1b

Browse files
authored
add support for optional camera_parameters (#255)
1 parent 1cd7e8d commit d4e3d1b

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

nucleus/constants.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
AUTOTAGS_KEY = "autotags"
2626
AUTOTAG_SCORE_THRESHOLD = "score_threshold"
2727
EXPORTED_ROWS = "exportedRows"
28+
CAMERA_MODEL_KEY = "camera_model"
2829
CAMERA_PARAMS_KEY = "camera_params"
2930
CLASS_PDF_KEY = "class_pdf"
3031
CONFIDENCE_KEY = "confidence"
@@ -64,6 +65,10 @@
6465
ITEM_KEY = "item"
6566
ITEM_METADATA_SCHEMA_KEY = "item_metadata_schema"
6667
JOB_ID_KEY = "job_id"
68+
K1_KEY = "k1"
69+
K2_KEY = "k2"
70+
K3_KEY = "k3"
71+
K4_KEY = "k4"
6772
KEEP_HISTORY_KEY = "keep_history"
6873
LENGTH_KEY = "length"
6974
JOB_STATUS_KEY = "job_status"
@@ -82,6 +87,8 @@
8287
NUCLEUS_ENDPOINT = "https://api.scale.com/v1/nucleus"
8388
NUM_SENSORS_KEY = "num_sensors"
8489
ORIGINAL_IMAGE_URL_KEY = "original_image_url"
90+
P1_KEY = "p1"
91+
P2_KEY = "p2"
8592
POINTCLOUD_KEY = "pointcloud"
8693
POINTCLOUD_LOCATION_KEY = "pointcloud_location"
8794
POINTCLOUD_URL_KEY = "pointcloud_url"

nucleus/dataset_item.py

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,22 @@
77

88
from .annotation import Point3D, is_local_path
99
from .constants import (
10+
CAMERA_MODEL_KEY,
1011
CAMERA_PARAMS_KEY,
1112
CX_KEY,
1213
CY_KEY,
1314
FX_KEY,
1415
FY_KEY,
1516
HEADING_KEY,
1617
IMAGE_URL_KEY,
18+
K1_KEY,
19+
K2_KEY,
20+
K3_KEY,
21+
K4_KEY,
1722
METADATA_KEY,
1823
ORIGINAL_IMAGE_URL_KEY,
24+
P1_KEY,
25+
P2_KEY,
1926
POINTCLOUD_URL_KEY,
2027
POSITION_KEY,
2128
REFERENCE_ID_KEY,
@@ -29,6 +36,18 @@
2936
)
3037

3138

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+
3251
@dataclass
3352
class Quaternion:
3453
"""Quaternion objects are used to represent rotation.
@@ -92,6 +111,20 @@ class CameraParams:
92111
fy: float
93112
cx: float
94113
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+
)
95128

96129
@classmethod
97130
def from_json(cls, payload: Dict[str, Any]):
@@ -103,18 +136,40 @@ def from_json(cls, payload: Dict[str, Any]):
103136
payload[FY_KEY],
104137
payload[CX_KEY],
105138
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),
106146
)
107147

108148
def to_payload(self) -> dict:
109149
"""Serializes camera params object to schematized JSON dict."""
110-
return {
150+
payload = {
111151
POSITION_KEY: self.position.to_payload(),
112152
HEADING_KEY: self.heading.to_payload(),
113153
FX_KEY: self.fx,
114154
FY_KEY: self.fy,
115155
CX_KEY: self.cx,
116156
CY_KEY: self.cy,
117157
}
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
118173

119174

120175
class DatasetItemType(Enum):

0 commit comments

Comments
 (0)