[vtkusers] image moved afer an orientation change
David Gobbi
david.gobbi at gmail.com
Wed Dec 12 08:53:15 EST 2012
On Wed, Dec 12, 2012 at 6:51 AM, David Gobbi <david.gobbi at gmail.com> wrote:
> The slicing and the panning are both controlled via the camera's focal
> point. So slicing through the axial images causes the camera's
> FocalPoint to move in and out along the Z axis. Then, when you switch
> to a new orientation, this "Z" position is centered in the window.
>
> If you want to avoid this, you should save the FocalPoint for each
> view orientation. Then, you can restore the focal point before you
> call SetImageOrientation, e.g.
>
> camera.SetFocalPoint(focal_point_for_axial_view)
> camera.SetImageOrientation(orientation_for_axial_view)
Typo, it should be:
camera.SetFocalPoint(focal_point_for_axial_view)
camera.SetImageOrientation(orientation_for_axial_view)
> - David
>
> On Wed, Dec 12, 2012 at 5:24 AM, José M. Rodriguez Bacallao
> <jmrbcu at gmail.com> wrote:
>> no one please, is this normal?
>>
>>
>> On Tue, Dec 11, 2012 at 9:45 AM, José M. Rodriguez Bacallao
>> <jmrbcu at gmail.com> wrote:
>>>
>>> hi folks, I am trying to implement a MPR viewer, so far so good. I am
>>> using the new image classes, this is test code:
>>>
>>> #!/usr/bin/env python
>>>
>>> import os
>>> import gdcm, vtkgdcm, vtk
>>>
>>>
>>> def key_press(sender, event):
>>> key = interactor.GetKeySym()
>>> style.SetCurrentRenderer(renderer)
>>> if key == 'a':
>>> print 'axial'
>>> style.SetImageOrientation(
>>> style.GetZViewRightVector(),
>>> style.GetZViewUpVector()
>>> )
>>> elif key == 'c':
>>> print 'coronal'
>>> style.SetImageOrientation(
>>> style.GetYViewRightVector(),
>>> style.GetYViewUpVector()
>>> )
>>> elif key == 's':
>>> print 'axial'
>>> style.SetImageOrientation(
>>> style.GetXViewRightVector(),
>>> style.GetXViewUpVector()
>>> )
>>> render_window.Render()
>>>
>>>
>>>
>>> interactor = vtk.vtkRenderWindowInteractor()
>>> render_window = vtk.vtkRenderWindow()
>>> render_window.SetSize(400, 400)
>>> interactor.SetRenderWindow(render_window)
>>>
>>> style = vtk.vtkInteractorStyleImage()
>>> style.SetInteractionModeToImageSlicing()
>>> interactor.SetInteractorStyle(style)
>>> style.AddObserver('CharEvent', key_press)
>>>
>>> print 'sorting files...'
>>> path = '/home/jmrbcu/pictures/workpictures/dicom/BRAIN/'
>>> files = [os.path.join(path, x) for x in os.listdir(path)]
>>>
>>> ipp = gdcm.IPPSorter()
>>> ipp.SetComputeZSpacing(True)
>>> ipp.SetZSpacingTolerance(1e-3)
>>> result = ipp.Sort(files)
>>>
>>> sorted_files, zspacing = files, 0
>>> if result:
>>> sorted_files = ipp.GetFilenames()
>>> zspacing = ipp.GetZSpacing()
>>> print 'files sorted, z spacing is: %s' % zspacing
>>> else:
>>> print 'cannot sort files, this is not a valid volume'
>>>
>>> vtk_files = vtk.vtkStringArray()
>>> map(vtk_files.InsertNextValue, sorted_files)
>>>
>>> reader = vtkgdcm.vtkGDCMImageReader()
>>> reader.FileLowerLeftOn()
>>> reader.SetFileNames(vtk_files)
>>> reader.Update()
>>>
>>> spacing = reader.GetOutput().GetSpacing()
>>> change = vtk.vtkImageChangeInformation()
>>> change.SetInputConnection(reader.GetOutputPort())
>>> change.SetOutputSpacing(spacing[0], spacing[1], zspacing)
>>>
>>> im = vtk.vtkImageResliceMapper()
>>> im.SetInputConnection(change.GetOutputPort())
>>> im.SliceFacesCameraOn()
>>> im.SliceAtFocalPointOn()
>>> im.BorderOff()
>>>
>>> ip = vtk.vtkImageProperty()
>>> ip.SetColorWindow(255)
>>> ip.SetColorLevel(128)
>>> ip.SetAmbient(0.0)
>>> ip.SetDiffuse(1.0)
>>> ip.SetOpacity(1.0)
>>> ip.SetInterpolationTypeToLinear()
>>>
>>> ia = vtk.vtkImageSlice()
>>> ia.SetMapper(im)
>>> ia.SetProperty(ip)
>>>
>>> renderer = vtk.vtkRenderer()
>>> renderer.AddViewProp(ia)
>>> renderer.SetBackground(0 , 0, 0)
>>> render_window.AddRenderer(renderer)
>>>
>>> style.SetCurrentRenderer(renderer)
>>> style.SetZViewRightVector((1, 0, 0))
>>> style.SetZViewUpVector((0, -1, 0))
>>>
>>> style.SetXViewRightVector((0, 1, 0))
>>> style.SetXViewUpVector((0, 0, 1))
>>>
>>> style.SetYViewRightVector((1, 0, 0))
>>> style.SetYViewUpVector((0, 0, 1))
>>> style.SetImageOrientation(style.GetZViewRightVector(),
>>> style.GetZViewUpVector())
>>>
>>> # render the image
>>> renderer.ResetCamera()
>>> renderer.GetActiveCamera().ParallelProjectionOn()
>>> renderer.ResetCameraClippingRange()
>>> render_window.Render()
>>>
>>> interactor.Initialize()
>>> interactor.Start()
>>>
>>> the problems arise in this sequence:
>>>
>>> 1- initially display the image: ok
>>> 2- slice the image to a different slice with ctrl + mosue left: ok
>>> 3- change the orientation to a different one (sagital or coronal, doesn't
>>> matter): this is the problem, orientation of the image is changed fine to
>>> the new one but the image is panned to a different position in the render
>>> window/renderer, not the center of it and in a different slice (the middle
>>> slice of the whole image)
>>>
>>> how can I avoid this, I mean, keep the image centered in the render
>>> window/renderer when the image orientation is changed and in the correct
>>> slice location?
More information about the vtkusers
mailing list