Skip to content

Commit

Permalink
refactor(sensor): use dynamic attr and public attrs in CameraIntrinsics
Browse files Browse the repository at this point in the history
- Use dynamic attr for `distortion_coefficients` in `CameraIntrinsics`
- Change private attrs to public attrs in `CameraIntrinsics`

PR Closed: #606
  • Loading branch information
Lee-000 committed May 26, 2021
1 parent e056c1d commit 18fd027
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 73 deletions.
65 changes: 13 additions & 52 deletions tensorbay/sensor/intrinsics.py
Original file line number Diff line number Diff line change
Expand Up @@ -543,17 +543,16 @@ def __init__( # pylint: disable=too-many-arguments
camera_matrix: Optional[MatrixType] = None,
**kwargs: float,
) -> None:
self._camera_matrix = CameraMatrix(fx, fy, cx, cy, skew, matrix=camera_matrix)
self._distortion_coefficients = DistortionCoefficients.loads(kwargs) if kwargs else None
self.camera_matrix = CameraMatrix(fx, fy, cx, cy, skew, matrix=camera_matrix)
if kwargs:
self.distortion_coefficients = DistortionCoefficients.loads(kwargs)

def _loads(self, contents: Dict[str, Dict[str, float]]) -> None:
self._camera_matrix = CameraMatrix.loads(contents["cameraMatrix"])
self.camera_matrix = CameraMatrix.loads(contents["cameraMatrix"])
if "distortionCoefficients" in contents:
self._distortion_coefficients = DistortionCoefficients.loads(
self.distortion_coefficients = DistortionCoefficients.loads(
contents["distortionCoefficients"]
)
else:
self._distortion_coefficients = None

@classmethod
def loads(cls: Type[_T], contents: Dict[str, Dict[str, float]]) -> _T:
Expand Down Expand Up @@ -602,44 +601,6 @@ def loads(cls: Type[_T], contents: Dict[str, Dict[str, float]]) -> _T:
"""
return common_loads(cls, contents)

@property
def camera_matrix(self) -> CameraMatrix:
"""Get the camera matrix of the camera intrinsics.
Returns:
:class:`CameraMatrix` class object containing fx, fy, cx, cy, skew(optional).
Examples:
>>> camera_intrinsics.camera_matrix
CameraMatrix(
(fx): 1,
(fy): 2,
(cx): 3,
(cy): 4,
(skew): 3
)
"""
return self._camera_matrix

@property
def distortion_coefficients(self) -> Optional[DistortionCoefficients]:
"""Get the distortion coefficients of the camera intrinsics, could be None.
Returns:
:class:`DistortionCoefficients` class object containing tangential and
radial distortion coefficients.
Examples:
>>> camera_intrinsics.distortion_coefficients
DistortionCoefficients(
(p1): 5,
(k1): 6
)
"""
return self._distortion_coefficients

def dumps(self) -> Dict[str, Dict[str, float]]:
"""Dumps the camera intrinsics into a dict.
Expand All @@ -652,9 +613,9 @@ def dumps(self) -> Dict[str, Dict[str, float]]:
'distortionCoefficients': {'p1': 5, 'k1': 6}}
"""
contents = {"cameraMatrix": self._camera_matrix.dumps()}
if self._distortion_coefficients:
contents["distortionCoefficients"] = self._distortion_coefficients.dumps()
contents = {"cameraMatrix": self.camera_matrix.dumps()}
if hasattr(self, "distortion_coefficients"):
contents["distortionCoefficients"] = self.distortion_coefficients.dumps()

return contents

Expand Down Expand Up @@ -700,7 +661,7 @@ def set_camera_matrix( # pylint: disable=[too-many-arguments, invalid-name]
)
"""
self._camera_matrix = CameraMatrix(fx, fy, cx, cy, skew, matrix=matrix)
self.camera_matrix = CameraMatrix(fx, fy, cx, cy, skew, matrix=matrix)

def set_distortion_coefficients(self, **kwargs: float) -> None:
"""Set distortion coefficients of the camera intrinsics.
Expand Down Expand Up @@ -728,7 +689,7 @@ def set_distortion_coefficients(self, **kwargs: float) -> None:
)
"""
self._distortion_coefficients = DistortionCoefficients(**kwargs)
self.distortion_coefficients = DistortionCoefficients(**kwargs)

def project(self, point: Sequence[float], is_fisheye: bool = False) -> Vector2D:
"""Project a point to the pixel coordinates.
Expand Down Expand Up @@ -759,6 +720,6 @@ def project(self, point: Sequence[float], is_fisheye: bool = False) -> Vector2D:
Vector2D(9.158401093771875, 28.633604375087504)
"""
if self._distortion_coefficients:
point = self._distortion_coefficients.distort(point, is_fisheye)
return self._camera_matrix.project(point)
if hasattr(self, "distortion_coefficients"):
point = self.distortion_coefficients.distort(point, is_fisheye)
return self.camera_matrix.project(point)
14 changes: 4 additions & 10 deletions tensorbay/sensor/tests/test_intrinsics.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,10 @@ def test_init(self):
assert camera_intrinsics_2.distortion_coefficients.p1 == 7
assert camera_intrinsics_2.distortion_coefficients.k1 == 8

camera_intrinsics_3 = CameraIntrinsics(fx=1, fy=2, cx=3, cy=4)
with pytest.raises(AttributeError):
camera_intrinsics_3.distortion_coefficients

def test_loads(self):
camera_intrinsics = CameraIntrinsics.loads(_CAMERAINTRINSICS_DATA)

Expand Down Expand Up @@ -257,16 +261,6 @@ def test_dumps(self):
camera_intrinsics = CameraIntrinsics(fx=1, fy=2, cx=3, cy=4, skew=0, p1=1, k1=2)
assert camera_intrinsics.dumps() == _CAMERAINTRINSICS_DATA

def test_camera_matrix(self):
camera_intrinsics = CameraIntrinsics(camera_matrix=_3x3_MATRIX, p1=1, p2=2, k1=1, k2=2)
assert camera_intrinsics.camera_matrix == CameraMatrix(matrix=_3x3_MATRIX)

def test_distortion_coefficients(self):
camera_intrinsics = CameraIntrinsics(camera_matrix=_3x3_MATRIX, p1=1, p2=2, k1=1, k2=2)
distortion_coefficients = camera_intrinsics.distortion_coefficients

assert distortion_coefficients == DistortionCoefficients(p1=1, p2=2, k1=1, k2=2)

def test_set_camera_matrix(self):
camera_intrinsics = CameraIntrinsics(fx=0, fy=0, cx=0, cy=0, p1=0, p2=0, k1=0, k2=0)
camera_intrinsics.set_camera_matrix(fx=2, fy=6, cx=4, cy=7, skew=3)
Expand Down
53 changes: 42 additions & 11 deletions tests/test_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,43 @@

from .utility import get_dataset_name

LIDAR_DATA = {
"name": "Lidar1",
"type": "LIDAR",
"extrinsics": {
"translation": {"x": 1, "y": 2, "z": 3},
"rotation": {"w": 1.0, "x": 2.0, "y": 3.0, "z": 4.0},
SENSORS_DATA = [
{
"name": "Lidar1",
"type": "LIDAR",
"extrinsics": {
"translation": {"x": 1, "y": 2, "z": 3},
"rotation": {"w": 1.0, "x": 2.0, "y": 3.0, "z": 4.0},
},
},
}
{
"name": "Camera1",
"type": "CAMERA",
},
{
"name": "Camera2",
"type": "CAMERA",
"extrinsics": {
"translation": {"x": 1, "y": 2, "z": 3},
"rotation": {"w": 1.0, "x": 2.0, "y": 3.0, "z": 4.0},
},
"intrinsics": {
"cameraMatrix": {"fx": 1, "fy": 2, "cx": 3, "cy": 4, "skew": 5},
},
},
{
"name": "Camera3",
"type": "CAMERA",
"extrinsics": {
"translation": {"x": 1, "y": 2, "z": 3},
"rotation": {"w": 1.0, "x": 2.0, "y": 3.0, "z": 4.0},
},
"intrinsics": {
"cameraMatrix": {"fx": 1, "fy": 2, "cx": 3, "cy": 4, "skew": 5},
"distortionCoefficients": {"k1": 1.0, "k2": 2.0, "p1": 3.0, "p2": 4.0},
},
},
]


class TestSensor:
Expand All @@ -26,13 +55,15 @@ def test_sensor(self, accesskey, url):
dataset_client.create_draft("draft-1")
segment_client = dataset_client.get_or_create_segment("segment1")

segment_client.upload_sensor(Sensor.loads(LIDAR_DATA))
for sensor_data in SENSORS_DATA:
segment_client.upload_sensor(Sensor.loads(sensor_data))

sensors = segment_client.get_sensors()
assert sensors == Sensors.loads([LIDAR_DATA])
assert sensors == Sensors.loads(SENSORS_DATA)

segment_client.delete_sensor(LIDAR_DATA["name"])
segment_client.delete_sensor(SENSORS_DATA[0]["name"])
sensors = segment_client.get_sensors()
assert len(sensors) == 0
assert len(sensors) == 3
assert sensors == Sensors.loads(SENSORS_DATA[1:])

gas_client.delete_dataset(dataset_name)

0 comments on commit 18fd027

Please sign in to comment.