Source code for supervisely.api.video.video_figure_api
# coding: utf-8
# docs
from __future__ import annotations
from typing import List, Optional
from supervisely.api.entity_annotation.figure_api import FigureApi
from supervisely.api.module_api import ApiField
from supervisely.geometry.geometry import Geometry
from supervisely.video_annotation.key_id_map import KeyIdMap
from supervisely.video_annotation.video_figure import VideoFigure
[docs]class VideoFigureApi(FigureApi):
"""
:class:`VideoFigure<supervisely.video_annotation.video_figure.VideoFigure>` for a single video.
"""
[docs] def create(
self,
video_id: int,
object_id: int,
frame_index: int,
geometry_json: dict,
geometry_type: str,
track_id: Optional[int] = None,
meta: Optional[dict] = None,
) -> int:
"""
Create new VideoFigure for given frame in given video ID.
:param video_id: Video ID in Supervisely.
:type video_id: int
:param object_id: ID of the object to which the VideoFigure belongs.
:type object_id: int
:param frame_index: Number of the frame to add VideoFigure.
:type frame_index: int
:param geometry_json: Parameters of geometry for VideoFigure.
:type geometry_json: dict
:param geometry_type: Type of VideoFigure geometry.
:type geometry_type: str
:param track_id: int, optional.
:type track_id: int, optional
:return: New figure ID
:rtype: :class:`int`
:Usage example:
.. code-block:: python
import supervisely as sly
os.environ['SERVER_ADDRESS'] = 'https://app.supervise.ly'
os.environ['API_TOKEN'] = 'Your Supervisely API Token'
api = sly.Api.from_env()
video_id = 198703211
object_id = 152118
frame_idx = 0
geometry_json = {'points': {'exterior': [[500, 500], [1555, 1500]], 'interior': []}}
geometry_type = 'rectangle'
figure_id = api.video.figure.create(video_id, object_id, frame_idx, geometry_json, geometry_type) # 643182610
"""
if meta is None:
meta = {}
return super().create(
video_id,
object_id,
{**meta, ApiField.FRAME: frame_index},
geometry_json,
geometry_type,
track_id,
)
[docs] def append_bulk(self, video_id: int, figures: List[VideoFigure], key_id_map: KeyIdMap) -> None:
"""
Add VideoFigures to given Video by ID.
:param video_id: Video ID in Supervisely.
:type video_id: int
:param figures: List of VideoFigures to append.
:type figures: List[VideoFigure]
:param key_id_map: KeyIdMap object.
:type key_id_map: KeyIdMap
:return: None
:rtype: :class:`NoneType`
:Usage example:
.. code-block:: python
import supervisely as sly
os.environ['SERVER_ADDRESS'] = 'https://app.supervise.ly'
os.environ['API_TOKEN'] = 'Your Supervisely API Token'
api = sly.Api.from_env()
project_id = 124976
meta_json = api.project.get_meta(project_id)
meta = sly.ProjectMeta.from_json(meta_json)
key_id_map = KeyIdMap()
video_id = 198703212
ann_info = api.video.annotation.download(video_id)
ann = sly.VideoAnnotation.from_json(ann_info, meta, key_id_map)
figures = ann.figures[:5]
api.video.figure.append_bulk(video_id, figures, key_id_map)
"""
keys = []
figures_json = []
for figure in figures:
keys.append(figure.key())
figures_json.append(figure.to_json(key_id_map, save_meta=True))
self._append_bulk(video_id, figures_json, keys, key_id_map)
[docs] def update(self, figure_id: int, geometry: Geometry) -> None:
"""Updates figure feometry with given ID in Supervisely with new Geometry object.
:param figure_id: ID of the figure to update
:type figure_id: int
:param geometry: Supervisely Gepmetry object
:type geometry: Geometry
:Usage example:
.. code-block:: python
import os
from dotenv import load_dotenv
import supervisely as sly
# Load secrets and create API object from .env file (recommended)
# Learn more here: https://developer.supervisely.com/getting-started/basics-of-authentication
load_dotenv(os.path.expanduser("~/supervisely.env"))
api = sly.Api.from_env()
new_geometry: sly.Rectangle(10, 10, 100, 100)
figure_id = 121236918
api.video.figure.update(figure_id, new_geometry)
"""
self._api.post(
"figures.editInfo",
{
ApiField.ID: figure_id,
ApiField.GEOMETRY: geometry.to_json(),
},
)