Source code for sksurgeryeval.widgets.overlay

# coding=utf-8

"""Main loop for surgery evaluation"""
from math import isnan
from sksurgeryutils.common_overlay_apps import OverlayBaseApp
from sksurgeryeval.algorithms.algorithms import (
        configure_tracker, np2vtk, add_map)
from sksurgeryeval.algorithms.background_image import \
        OverlayBackground
from sksurgeryeval.shapes.cone import VTKConeModel
from sksurgeryeval.algorithms.locators import Locators
from sksurgeryeval.logging.surgery_logger import Logger


[docs]class OverlayApp(OverlayBaseApp): """Inherits from OverlayBaseApp, adding code to test the proximity of a tracked object to a set of vtk objects""" def __init__(self, config): """Overides overlay base app's init, to initialise the external tracking system. Together with a video source""" try: super().__init__(None) except RuntimeError: self.update_rate = 30 self.img = None self.timer = None self.save_frame = None self._logger = Logger(config) if "logo" in config: self.bg_image = OverlayBackground(config) else: default_config = {"logo" : True} self.bg_image = OverlayBackground(default_config) self._tracker = None if "tracker config" in config: self._tracker = configure_tracker(config.get("tracker config")) self._tracker_handle = 0 if "tracker handle" in config: self._tracker_handle = config.get("tracker handle") self._locator = Locators(config) maps = add_map(config) self._pointer = VTKConeModel(10.0, 5.0, (1.0, 1.0, 1.0), "pointer") self.vtk_overlay_window.add_vtk_actor(self._pointer.actor) self.vtk_overlay_window.add_vtk_models(self._locator.models) if maps is not None: self.vtk_overlay_window.add_vtk_models(maps) if "camera" in config: camera_config = config.get("camera") if "bounding box" in camera_config: self.vtk_overlay_window.foreground_renderer.ResetCamera( camera_config.get("bounding box")) else: self.vtk_overlay_window.foreground_renderer.ResetCamera( -300, 300, -300, 300, -200, 0) self.vtk_overlay_window.add_vtk_actor(self._locator._text.text_actor) self._logger.log(message="OverlayApp init OK")
[docs] def update(self): """Update the background renderer with a new frame, move the model(s) and render""" image = self.bg_image.next_image() #add a method to move the pointer self._update_tracking() self.vtk_overlay_window.set_video_image(image) self.vtk_overlay_window.Render()
def _update_tracking(self): """Internal method to move the pointer, and check it's distance to the various polydata """ port_handles, _, _, tracking, quality = self._tracker.get_frame() for ph_index, port_handle in enumerate(port_handles): if port_handle != self._tracker_handle: continue if not isnan(quality[ph_index]): self._pointer.actor.SetUserMatrix(np2vtk(tracking[ph_index])) self._locator.is_hit(tracking[ph_index], self._logger) def __del__(self): self._logger.log(message="Closing overlay app") del self._logger