def _init_cw(self): self._cw = vtk.vtkContourWidget() rep = vtk.vtkOrientedGlyphContourRepresentation() self._cw.SetRepresentation(rep) iapp = vtk.vtkImageActorPointPlacer() iapp.SetImageActor(self._image_viewer.GetImageActor()) rep.SetPointPlacer(iapp) self._cw.SetInteractor(self._view_frame.rwi) self._cw.On()
def main(argv): if os.name == 'nt': VTK_DATA_ROOT = "c:/VTK82/build_Release/ExternalData/Testing/" else: VTK_DATA_ROOT = "/home/jmh/" if 1: v16 = vtk.vtkMetaImageReader() v16.SetFileName("/home/jmh/github/fis/data/Abdomen/CT-Abdomen.mhd") v16.Update() elif 0: fname = os.path.join(VTK_DATA_ROOT, "Data/headsq/quarter") v16 = vtk.vtkVolume16Reader() v16.SetDataDimensions(64, 64) v16.SetDataByteOrderToLittleEndian() v16.SetImageRange(1, 93) v16.SetDataSpacing(3.2, 3.2, 1.5) v16.SetFilePrefix(fname) v16.ReleaseDataFlagOn() v16.SetDataMask(0x7fff) v16.Update() else: v16 = vtk.vtkMetaImageReader() v16.SetFileName("c:/github/fis/data/Abdomen/CT-Abdomen.mhd") v16.Update() rng = v16.GetOutput().GetScalarRange() shifter = vtk.vtkImageShiftScale() shifter.SetShift(-1.0*rng[0]) shifter.SetScale(255.0/(rng[1]-rng[0])) shifter.SetOutputScalarTypeToUnsignedChar() shifter.SetInputConnection(v16.GetOutputPort()) shifter.ReleaseDataFlagOff() shifter.Update() ImageViewer = vtk.vtkImageViewer2() ImageViewer.SetInputData(shifter.GetOutput()) ImageViewer.SetColorLevel(127) ImageViewer.SetColorWindow(255) iren = vtk.vtkRenderWindowInteractor() ImageViewer.SetupInteractor(iren) ImageViewer.Render() ImageViewer.GetRenderer().ResetCamera() ImageViewer.Render() dims = v16.GetOutput().GetDimensions() global minArea spacing = v16.GetOutput().GetSpacing() minArea = ( spacing[0] * spacing[1] ) / 0.1 # Slider screen representation SliderRepres = vtk.vtkSliderRepresentation2D() _min = ImageViewer.GetSliceMin() _max = ImageViewer.GetSliceMax() SliderRepres.SetMinimumValue(_min) SliderRepres.SetMaximumValue(_max) SliderRepres.SetValue(int((_min + _max) / 2)) SliderRepres.SetTitleText("Slice") SliderRepres.GetPoint1Coordinate().SetCoordinateSystemToNormalizedDisplay() SliderRepres.GetPoint1Coordinate().SetValue(0.3, 0.05) SliderRepres.GetPoint2Coordinate().SetCoordinateSystemToNormalizedDisplay() SliderRepres.GetPoint2Coordinate().SetValue(0.7, 0.05) SliderRepres.SetSliderLength(0.02) SliderRepres.SetSliderWidth(0.03) SliderRepres.SetEndCapLength(0.01) SliderRepres.SetEndCapWidth(0.03) SliderRepres.SetTubeWidth(0.005) SliderRepres.SetLabelFormat("%3.0lf") SliderRepres.SetTitleHeight(0.02) SliderRepres.SetLabelHeight(0.02) # Slider widget SliderWidget = vtk.vtkSliderWidget() SliderWidget.SetInteractor(iren) SliderWidget.SetRepresentation(SliderRepres) SliderWidget.KeyPressActivationOff() SliderWidget.SetAnimationModeToAnimate() SliderWidget.SetEnabled(True) SliderCb = vtkSliderCallback() SliderCb.SetImageViewer(ImageViewer) SliderWidget.AddObserver(vtk.vtkCommand.InteractionEvent, SliderCb.Execute) ImageViewer.SetSlice(int(SliderRepres.GetValue())) # Contour representation - responsible for placement of points, calculation of lines and contour manipulation global rep rep = vtk.vtkOrientedGlyphContourRepresentation() # vtkContourRepresentation has GetActiveNodeWorldPostion/Orientation rep.GetProperty().SetOpacity(0) #1 prop = rep.GetLinesProperty() from vtkUtils import renderLinesAsTubes from vtk.util.colors import red, green, pink, yellow renderLinesAsTubes(prop) prop.SetColor(yellow) propActive = rep.GetActiveProperty() #propActive.SetOpacity(0) # 2 renderLinesAsTubes(propActive) propActive.SetColor(green) shapeActive = rep.GetActiveCursorShape() warp = vtk.vtkWarpVector() warp.SetInputData(shapeActive) warp.SetInputArrayToProcess(0, 0, 0, vtk.vtkDataObject.FIELD_ASSOCIATION_POINTS, vtk.vtkDataSetAttributes.NORMALS) scale = 0.4 warp.SetScaleFactor(scale) warp.Update() rep.SetActiveCursorShape(warp.GetOutput()) # Use vtkContourTriangulator to fill contours # Point placer imageActorPointPlacer = vtk.vtkImageActorPointPlacer() imageActorPointPlacer.SetImageActor(ImageViewer.GetImageActor()) rep.SetPointPlacer(imageActorPointPlacer) global ContourWidget # Contour widget - has a vtkWidgetEventTranslator which translate events to vtkContourWidget events ContourWidget = vtk.vtkContourWidget() ContourWidget.SetRepresentation(rep) ContourWidget.SetInteractor(iren) ContourWidget.SetEnabled(True) ContourWidget.ProcessEventsOn() ContourWidget.ContinuousDrawOn() # Can be Initialize() using polydata # Override methods that returns display position to get an overlay # (display postions) instead of computing it from world position and # the method BuildLines to interpolate using display positions # instead of world positions # Thinning of contour control points # AddFinalPointAction ContourWidget.AddObserver(vtk.vtkCommand.EndInteractionEvent, callback) if 0: # TODO: Make interior transparent contour = ContourWidget.GetContourRepresentation().GetContourRepresentationAsPolyData() tc = vtk.vtkContourTriangulator() tc.SetInputData(contour) tc.Update() # Extrusion towards camera extruder = vtk.vtkLinearExtrusionFilter() extruder.CappingOn() extruder.SetScalaFactor(1.0) extruder.SetInputData(tc.GetOutput()) extruder.SetVector(0,0,1.0) extruder.SetExtrusionTypeToNormalExtrusion() polyMapper = vtk.vtkPolyMapper() polyMapper.SetInputConnection(extruder.GetOutputPort()) polyMapper.ScalarVisibilityOn() polyMapper.Update() polyActor = vtk.vtkActor() polyActor.SetMapper(polyMapper) prop = polyActor.GetProperty() prop.SetColor(0,1,0) #prop.SetRepresentationToWireframe() renderer.AddActor(polyActor) renderer.GetRenderWindow().Render() iren.Start()
SliderWidget = vtk.vtkSliderWidget() SliderWidget.SetInteractor(iren) SliderWidget.SetRepresentation(SliderRepres) SliderWidget.KeyPressActivationOff() SliderWidget.SetAnimationModeToAnimate() SliderWidget.SetEnabled(True) SliderWidget.AddObserver("InteractionEvent", vtkSliderCallback2) ImageViewer.SetSlice(SliderRepres.GetValue()) ContourWidget = vtk.vtkContourWidget() rep = vtk.vtkOrientedGlyphContourRepresentation() ContourWidget.SetRepresentation(rep) imageActorPointPlacer = vtk.vtkImageActorPointPlacer() imageActorPointPlacer.SetImageActor(ImageViewer.GetImageActor()) rep.SetPointPlacer(imageActorPointPlacer); rep.GetProperty().SetColor(0,1,0); del imageActorPointPlacer del rep ContourWidget.SetInteractor(iren) ContourWidget.SetEnabled(True) ContourWidget.ProcessEventsOn() ImageViewer.GetRenderWindow().SetSize(500, 500) recorder = vtk.vtkInteractorEventRecorder() recorder.SetInteractor( iren )
def __init__(self, input_file, gaussian, radius, thresh, zoom, zSlice, brightness, window_size, *args, **kwargs): """MainWindow constructor""" super().__init__(*args, **kwargs) # Window setup self.resize(window_size[0],window_size[1]) self.title = "Qt Viewer for Lesion Augmentation" self.statusBar().showMessage("Welcome.",8000) # Capture defaults self.gaussian = gaussian self.radius = radius self.thresh = thresh self.zoom = zoom self.brightness = brightness self.shape_dic = None self.lesion_dic = {} self.thresholdArray = None self.imageArray = None self.zSlice = 100 self.shape = None self.crop = None self.colorWindow = 1000 self.colorLevel = 500 # Initialize the window self.initUI() # Set up some VTK pipeline classes self.reader = None self.gauss = vtk.vtkImageGaussianSmooth() self.lesion = vtk.vtkImageData() self.threshold = vtk.vtkImageThreshold() self.mapToColors = vtk.vtkImageMapToColors() self.imageViewer = vtk.vtkImageViewer2() self.resizeImage = vtk.vtkImageResize() self.resizeSeg = vtk.vtkImageResize() self.contourRep = vtk.vtkOrientedGlyphContourRepresentation() self.contourWidget = vtk.vtkContourWidget() self.placer = vtk.vtkImageActorPointPlacer() self.polyData = None self.origmapper = vtk.vtkImageMapper()#vtkImageSliceMapper()# self.mapper = vtk.vtkImageMapper() self.stencilmapper = vtk.vtkPolyDataMapper() self.origactor = vtk.vtkActor2D() #vtkImageActor() self.actor = vtk.vtkActor2D() self.stencilactor = vtk.vtkActor() # Take inputs from command line. Only use these if there is an input file specified if (input_file != None): if (not os.path.exists(input_file)): qtw.QMessageBox.warning(self, "Error", "Invalid input file.") return self.createPipeline(input_file) self.statusBar().showMessage("Loading file " + input_file,4000) self.changeSigma(gaussian) self.changeRadius(radius) self.changeThreshold(thresh) self.changeBrightness(brightness) self.changeSlice(zSlice)
def sliderCallback(obj, ev): value = sliderRep.GetValue() plane = vtk.vtkPlane() plane.SetOrigin(0, 0, value) plane.SetNormal(0, 0, 1) im.SetSlicePlane(plane) renWin.Render() sliderWidget.AddObserver(vtk.vtkCommand.InteractionEvent, sliderCallback) ia = vtk.vtkImageActor() ia.SetMapper(im) ia.SetProperty(ip) pointPlacer = vtk.vtkImageActorPointPlacer() pointPlacer.SetImageActor(ia) contourRep = vtk.vtkOrientedGlyphContourRepresentation() contourRep.SetPointPlacer(pointPlacer) contourRep.GetProperty().SetColor(0, 1, 0) contourWidget = vtk.vtkContourWidget() contourWidget.SetInteractor(iren) contourWidget.SetFollowCursor(True) contourWidget.SetEnabled(1) contourWidget.ProcessEventsOn() style.SetInteractionModeToImage2D() iren.Start()