Source code for supervisely.pointcloud_annotation.pointcloud_figure

# coding: utf-8
from __future__ import annotations

from typing import Dict, Optional, Union
from uuid import UUID

from supervisely._utils import take_with_default
from supervisely.geometry.geometry import Geometry
from supervisely.pointcloud_annotation.pointcloud_episode_object import (
    PointcloudEpisodeObject,
)
from supervisely.pointcloud_annotation.pointcloud_episode_object_collection import (
    PointcloudEpisodeObjectCollection,
)
from supervisely.pointcloud_annotation.pointcloud_object import PointcloudObject
from supervisely.pointcloud_annotation.pointcloud_object_collection import (
    PointcloudObjectCollection,
)
from supervisely.video_annotation.key_id_map import KeyIdMap
from supervisely.video_annotation.video_figure import VideoFigure


[docs]class PointcloudFigure(VideoFigure): """ PointcloudFigure object for :class:`PointcloudAnnotation<supervisely.pointcloud_annotation.pointcloud_annotation.PointcloudAnnotation>` or :class:`PointcloudEpisodeAnnotation<supervisely.pointcloud_annotation.pointcloud_episode_annotation.PointcloudEpisodeAnnotation>`. :class:`PointcloudFigure<PointcloudFigure>` objects is immutable. :param parent_object: PointcloudObject or PointcloudObject object. :type parent_object: Union[PointcloudObject, PointcloudEpisodeObject] :param geometry: Label :class:`geometry<supervisely.geometry.geometry.Geometry>`. :type geometry: Geometry :param frame_index: Index of Frame to which PointcloudFigure belongs. :type frame_index: int :param key: KeyIdMap object. :type key: KeyIdMap, optional :param class_id: ID of :class:`PointcloudObject<PointcloudObject>` (or :class:`PointcloudEpisodeObject<PointcloudEpisodeObject>`) to which PointcloudFigure belongs. :type class_id: int, optional :param labeler_login: Login of the user who created PointcloudFigure. :type labeler_login: str, optional :param updated_at: Date and Time when PointcloudFigure was modified last. Date Format: Year:Month:Day:Hour:Minute:Seconds. Example: '2021-01-22T19:37:50.158Z'. :type updated_at: str, optional :param created_at: Date and Time when PointcloudFigure was created. Date Format is the same as in "updated_at" parameter. :type created_at: str, optional :Usage example: .. code-block:: python import supervisely as sly from supervisely.geometry.cuboid_3d import Cuboid3d, Vector3d obj_class_car = sly.ObjClass('car', Cuboid3d) pointcloud_obj_car = sly.PointcloudObject(obj_class_car) position, rotation, dimension = Vector3d(-3.4, 28.9, -0.7), Vector3d(0., 0, -0.03), Vector3d(1.8, 3.9, 1.6) cuboid = Cuboid3d(position, rotation, dimension) frame_index = 10 figure = sly.PointcloudFigure(pointcloud_obj_car, cuboid, frame_index=frame_index) print(figure.to_json()) # Output: { # "geometry": { # "dimensions": { "x": 1.8, "y": 3.9, "z": 1.6 }, # "position": { "x": -3.4, "y": 28.9, "z": -0.7 }, # "rotation": { "x": 0.0, "y": 0, "z": -0.03 } # }, # "geometryType": "cuboid_3d", # "key": "4beae1be12624b70ad533c8be7477605", # "objectKey": "c1e1965efc0d4ae9b0b39367b04d637a" # } """ def __init__( self, parent_object: Union[PointcloudObject, PointcloudEpisodeObject], geometry: Geometry, frame_index: Optional[int] = None, key: Optional[UUID] = None, class_id: Optional[int] = None, labeler_login: Optional[str] = None, updated_at: Optional[str] = None, created_at: Optional[str] = None, **kwargs, ): super().__init__( parent_object, geometry, frame_index, key=key, class_id=class_id, labeler_login=labeler_login, updated_at=updated_at, created_at=created_at, ) # @TODO: validate geometry - allowed: only cuboid_3d + point_cloud @property def parent_object(self) -> Union[PointcloudObject, PointcloudEpisodeObject]: """ PointcloudObject of current PointcloudFigure. :return: PointcloudObject ot PointcloudEpisodeObject object :rtype: :class:`PointcloudObject<PointcloudObject>` or :class:`PointcloudEpisodeObject<PointcloudEpisodeObject>` :Usage example: .. code-block:: python pointcloud_obj_car = pointcloud_figure_car.parent_object print(pointcloud_obj_car.to_json()) # Output: { # "key": "d573c6f081544e3da20022d932b259c1", # "classTitle": "car", # "tags": [] # } """ return super().parent_object @property def video_object(self) -> None: """Not supported for pointcloud.""" raise NotImplementedError("If you faced this error, please write to technical support.")
[docs] def validate_bounds(self, img_size, _auto_correct=False): """Not supported for pointcloud.""" raise NotImplementedError()
[docs] @classmethod def from_json( cls, data: Dict, objects: Union[PointcloudObjectCollection, PointcloudEpisodeObjectCollection], frame_index: Optional[int] = None, key_id_map: Optional[KeyIdMap] = None, ) -> PointcloudFigure: """ Convert a json dict to PointcloudFigure. Read more about `Supervisely format <https://docs.supervise.ly/data-organization/00_ann_format_navi>`_. :param data: Dict in json format. :type data: dict :param objects: PointcloudObjectCollection or PointcloudEpisodeObjectCollection object. :type objects: PointcloudObjectCollection or PointcloudEpisodeObjectCollection :param frame_index: Index of Frame to which PointcloudFigure belongs. :type frame_index: int :param key_id_map: KeyIdMap object. :type key_id_map: KeyIdMap, optional :raises: :class:`RuntimeError`, if point cloudobject ID and pointcloud object key are None, if pointcloud object key and key_id_map are None, if pointcloud object with given id not found in key_id_map :return: PointcloudFigure object :rtype: :class:`PointcloudFigure` :Usage example: .. code-block:: python import supervisely as sly from supervisely.geometry.cuboid_3d import Cuboid3d, Vector3d obj_class_car = sly.ObjClass('car', Cuboid3d) pointcloud_obj_car = sly.PointcloudObject(obj_class_car) position, rotation, dimension = Vector3d(-3.4, 28.9, -0.7), Vector3d(0., 0, -0.03), Vector3d(1.8, 3.9, 1.6) cuboid = Cuboid3d(position, rotation, dimension) frame_index = 10 figure = sly.PointcloudFigure(pointcloud_obj_car, cuboid, frame_index=frame_index) pointcloud_figure_json = figure.to_json(save_meta=True) new_pointcloud_figure = sly.PointcloudFigure.from_json( pointcloud_figure_json, sly.PointcloudObjectCollection([pointcloud_obj_car]), frame_index ) """ return super().from_json(data, objects, frame_index, key_id_map)
[docs] def clone( self, parent_object: Optional[Union[PointcloudObject, PointcloudEpisodeObject]] = None, geometry: Optional[Geometry] = None, frame_index: Optional[int] = None, key: Optional[UUID] = None, class_id: Optional[int] = None, labeler_login: Optional[str] = None, updated_at: Optional[str] = None, created_at: Optional[str] = None, ) -> PointcloudFigure: """ Makes a copy of PointcloudFigure with new fields, if fields are given, otherwise it will use fields of the original PointcloudFigure. :param parent_object: :class:`PointcloudObject<PointcloudObject>` (or :class:`PointcloudEpisodeObject<PointcloudEpisodeObject>`) object. :type parent_object: PointcloudObject or PointcloudEpisodeObject, optional :param geometry: Label :class:`geometry<supervisely.geometry.geometry.Geometry>`. :type geometry: Geometry, optional :param frame_index: Index of Frame to which PointcloudFigure belongs. :type frame_index: int, optional :param key: KeyIdMap object. :type key: KeyIdMap, optional :param class_id: ID of :class:`ObjClass<supervisely.annotation.obj_class.ObjClass>` to which PointcloudFigure belongs. :type class_id: int, optional :param labeler_login: Login of the user who created PointcloudFigure. :type labeler_login: str, optional :param updated_at: Date and Time when PointcloudFigure was modified last. Date Format: Year:Month:Day:Hour:Minute:Seconds. Example: '2021-01-22T19:37:50.158Z'. :type updated_at: str, optional :param created_at: Date and Time when PointcloudFigure was created. Date Format is the same as in "updated_at" parameter. :type created_at: str, optional :return: PointcloudFigure object :rtype: :class:`PointcloudFigure` :Usage example: .. code-block:: python import supervisely as sly from supervisely.geometry.cuboid_3d import Cuboid3d, Vector3d obj_class_car = sly.ObjClass('car', Cuboid3d) pointcloud_obj_car = sly.PointcloudObject(obj_class_car) position, rotation, dimension = Vector3d(-3.4, 28.9, -0.7), Vector3d(0., 0, -0.03), Vector3d(1.8, 3.9, 1.6) cuboid = Cuboid3d(position, rotation, dimension) frame_index = 10 figure = sly.PointcloudFigure(pointcloud_obj_car, cuboid, frame_index=frame_index) # Remember that PointcloudFigure object is immutable, and we need to assign new instance of PointcloudFigure to a new variable pointcloud_figure_clone = figure.clone(parent_object=pointcloud_obj_car, frame_index=11) print(pointcloud_figure_clone.to_json()) # Output: { # "geometry": { # "dimensions": { "x": 1.8, "y": 3.9, "z": 1.6 }, # "position": { "x": -3.4, "y": 28.9, "z": -0.7 }, # "rotation": { "x": 0.0, "y": 0, "z": -0.03 } # }, # "geometryType": "cuboid_3d", # "key": "4beae1be12624b70ad533c8be7477605", # "objectKey": "c1e1965efc0d4ae9b0b39367b04d637a" # } """ return self.__class__( parent_object=take_with_default(parent_object, self.parent_object), geometry=take_with_default(geometry, self.geometry), frame_index=take_with_default(frame_index, self.frame_index), key=take_with_default(key, self._key), class_id=take_with_default(class_id, self.class_id), labeler_login=take_with_default(labeler_login, self.labeler_login), updated_at=take_with_default(updated_at, self.updated_at), created_at=take_with_default(created_at, self.created_at), )