[vtkusers] problem to convert type signed to unsigned
    Yosbanis Vicente Gonzalez 
    90yobi90 at gmail.com
       
    Thu Dec  4 14:34:29 EST 2014
    
    
  
hi i am new to working with vtk. I'm trying to render a volume of a DICOM
image.
I was able to open a single file with vtkGDCMImageReader (using SetFileName),
but when I render with vtkVolumeRayCastIsosurfaceFunction and
vtkVolumeRayCastMapper gives me the following error:
ERROR: In /../vtk/VTK5.10.1/VolumeRendering/vtkVolumeRayCastMapper.cxx, line
326
vtkVolumeRayCastMapper (0x247bbe0): Can not render volume data of type short
, only unsigned char or unsigned short.
Do some research and use the vtkImageCast filter to convert from short
to unsigned
short type, but not solved the problem. This is the code for what I did to
see if anyone can tell me what I did wrong.
Thank you
------------------------------------------------------
reader = vtkgdcm.vtkGDCMImageReader()
reader.FileLowerLeftOn()
reader.SetFileName('/home/yosbanis/images/d_david/cd1/dicom/14040312/31200000/24479448')
reader.Update()
# orientaciones
#----------------------------------------------------------------
orientations = {
    gdcm.Orientation.SAGITTAL: 0,
    gdcm.Orientation.CORONAL: 1,
    gdcm.Orientation.AXIAL: 2
}
orientacion_gdcm = gdcm.Orientation()
orientation =
orientations[orientacion_gdcm.GetType(reader.GetImageOrientationPatient())]
image = reader.GetOutput()
origin = list(reader.GetOutput().GetOrigin())
extent = list(reader.GetOutput().GetExtent())
spacing = list(reader.GetOutput().GetSpacing())
axial = vtk.vtkMatrix4x4()
axial.DeepCopy((
    1,  0,  0, 0,
    0,  1,  0, 0,
    0,  0,  1, 0,
    0,  0,  0, 1
))
coronal = vtk.vtkMatrix4x4()
coronal.DeepCopy((
    1,  0,  0, 0,
    0,  0,  1, 0,
    0,  1,  0, 0,
    0,  0,  0, 1
))
sagittal = vtk.vtkMatrix4x4()
sagittal.DeepCopy((
    0,  0, -1, 0,
    1,  0,  0, 0,
    0, -1,  0, 0,
    0,  0,  0, 1
))
axes = {
    0: sagittal, 1: coronal, 2: axial
}
dc = reader.GetDirectionCosines()
# obtener las coordenadas del cursor
#-------------------------------------------
def get_coordinate_cursor():
    # Find position
    x, y, z = pick.GetPickPosition()
    bounds = [0, 0, 0, 0, 0, 0]
    volume.GetBounds(bounds)
    if bounds[0] == bounds[1]:
        print 'X'
        x = bounds[0]
    elif bounds[2] == bounds[3]:
        print 'Y'
        y = bounds[2]
    elif bounds[4] == bounds[5]:
        print 'Z'
        z = bounds[4]
    return x, y, z
def center_image():
    image = reader.GetOutput()
    origin = image.GetOrigin()
    extent = image.GetExtent()
    spacing = image.GetSpacing()
    xc = origin[0] + 0.5 * (extent[0] + extent[1]) * spacing[0]
    yc = origin[1] + 0.5 * (extent[2] + extent[3]) * spacing[1]
    zc = origin[2] + 0.5 * (extent[4] + extent[5]) * spacing[2]
    camera = renderer.GetActiveCamera()
    focal_point = camera.GetFocalPoint()
    dist = camera.GetDistance()
    if orientation == 0:
        camera.SetFocalPoint(focal_point[0], yc, zc)
        camera.SetPosition(dist, yc, zc)
    elif orientation == 1:
        camera.SetFocalPoint(xc, focal_point[1], zc)
        camera.SetPosition(xc, -dist, zc)
    else:
        camera.SetFocalPoint(xc, yc, focal_point[2])
        camera.SetPosition(xc, yc, -dist)
    renderer.ResetCamera()
    renderer.ResetCameraClippingRange()
    render_window.Render()
def fit_image():
    image = reader.GetOutput()
    extent = image.GetExtent()
    spacing = image.GetSpacing()
    xd = (extent[1] - extent[0] + 1) * spacing[0]
    yd = (extent[3] - extent[2] + 1) * spacing[1]
    zd = (extent[5] - extent[4] + 1) * spacing[2]
    center_image()
    camera = renderer.GetActiveCamera()
    if orientation == 2:
        camera.SetParallelScale(0.5 * yd)
    elif orientation == 1:
        camera.SetParallelScale(0.5 * zd)
    elif orientation == 0:
        camera.SetParallelScale(0.5 * xd)
    render_window.Render()
def set_view_plane(view_plane):
    if view_plane == 0:
        left_to_right = [0, 1, 0, 0]
        view_up = [0, 0, 1, 0]
    elif view_plane == 1:
        left_to_right = [1, 0, 0, 0]
        view_up = [0, 0, 1, 0]
    else:
        left_to_right = [1, 0, 0, 0]
        view_up = [0, -1, 0, 0]
        m = axial
    center_image()
    style.SetImageOrientation(left_to_right[:3], view_up[:3])
    bounds = [0, 0, 0, 0, 0, 0]
    volume.GetBounds(bounds)
    c.SetModelBounds(bounds)
    render_window.Render()
    global orientation
    orientation = view_plane
def flip_horizontal():
    cam = renderer.GetActiveCamera()
    position = cam.GetPosition()
    factor = [1, 1, 1]
    factor[orientation] = -1;
cam.SetPosition(factor[0]*position[0],factor[1]*position[1],factor[2]*position[2])
    renderer.ResetCameraClippingRange()
    render_window.Render()
def key_press(sender, event):
    global focal_point, orientation
    key = interactor.GetKeySym()
    style.SetCurrentRenderer(renderer)
    if key == 'a':
        set_view_plane(2)
    elif key == 'c':
        set_view_plane(1)
    elif key == 's':
        set_view_plane(0)
    elif key == 'f':
        fit_image()
    elif key == 'h':
        flip_horizontal()
    elif key == 'v':
        cam = renderer.GetActiveCamera()
        # flip horizontal
        position = cam.GetPosition()
        factor = [1, 1, 1]
        factor[orientation] = -1;
cam.SetPosition(factor[0]*position[0],factor[1]*position[1],factor[2]*position[2])
        # now vertical
        viewup = cam.GetViewUp();
        cam.SetViewUp(-viewup[0], -viewup[1], -viewup[2])
        renderer.ResetCameraClippingRange()
        render_window.Render()
    elif key == 'w':
        print volumeProperty.GetColorWindow()
#----------- trabajo del cursor y eventos -----------------------
state = 0
def start_cursor(orientation, e):
    global state
    state = True
    _last_position = orientation.GetInteractor().GetEventPosition()
def move_cursor(orientation, e):
    if not state:
        return
    # pick the point
    interactor = orientation.GetInteractor()
    x, y = interactor.GetEventPosition()
    interactor.GetPicker().Pick(x, y, 0, renderer)
    x, y, z = interactor.GetPicker().GetPickPosition()
    bounds = [0, 0, 0, 0, 0, 0]
    volumeMapper.GetInput().GetBounds(bounds)
    if bounds[0] == bounds[1]:
        x = bounds[0]
    elif bounds[2] == bounds[3]:
        y = bounds[2]
    elif bounds[4] == bounds[5]:
        z = bounds[4]
    cursor_coordinates = (x, y, z)
    c.SetFocalPoint(cursor_coordinates)
    render_window.Render()
def stop_cursor(orientation, e):
    global state
    state = False
interactor = vtk.vtkRenderWindowInteractor()
render_window = vtk.vtkRenderWindow()
render_window.SetNumberOfLayers(2)
render_window.SetSize(800, 600)
interactor.SetRenderWindow(render_window)
style = vtk.vtkInteractorStyleImage()
style.SetInteractionModeToImageSlicing()
interactor.SetInteractorStyle(style)
style.AddObserver('CharEvent', key_press)
style.AddObserver('LeftButtonPressEvent', start_cursor)
style.AddObserver('LeftButtonReleaseEvent', stop_cursor)
style.AddObserver('MouseMoveEvent', move_cursor)
c = vtk.vtkCursor3D()
c.AllOff()
c.AxesOn()
volumeColor = vtk.vtkColorTransferFunction()
volumeColor.AddRGBPoint(0,0.0,0.0,0.0)
volumeColor.AddRGBPoint(180,0.3,0.1,0.2)
volumeColor.AddRGBPoint(1000,1.0,0.7,0.6)
volumeColor.AddRGBPoint(2000,1.0,1.0,0.9)
volumeScalarOpacity = vtk.vtkPiecewiseFunction()
volumeScalarOpacity.AddPoint(0,0.0)
volumeScalarOpacity.AddPoint(180,0.0)
volumeScalarOpacity.AddPoint(1000,0.2)
volumeScalarOpacity.AddPoint(2000,0.8)
volumeProperty = vtk.vtkVolumeProperty()
volumeProperty.SetColor(volumeColor)
volumeProperty.SetScalarOpacity(volumeScalarOpacity)
volumeProperty.SetInterpolationTypeToLinear()
volumeProperty.ShadeOn()
volumeProperty.SetAmbient(0.6)
volumeProperty.SetDiffuse(0.6)
volumeProperty.SetSpecular(0.8)
# use vtkImageCast!!!!!
imageCast = vtk.vtkImageCast()
imageCast.SetInput( reader.GetOutput() )
imageCast.SetOutputScalarTypeToUnsignedShort()
isosurfaceFunction = vtk.vtkVolumeRayCastIsosurfaceFunction()
isosurfaceFunction.SetIsoValue(600)
volumeMapper =  vtk.vtkVolumeRayCastMapper()
volumeMapper.SetInput(imageCast.GetOutput())
volumeMapper.SetVolumeRayCastFunction(isosurfaceFunction)
volumeMapper.SetInputConnection(reader.GetOutputPort())
volume = vtk.vtkVolume()
volume.SetMapper(volumeMapper)
volume.SetProperty(volumeProperty)
volume.SetUserMatrix(axes[orientation])
m = vtk.vtkPolyDataMapper()
m.SetInputConnection(c.GetOutputPort())
a = vtk.vtkActor()
a.SetMapper(m)
a.GetProperty().SetColor(1.0, 0.46, 0)
a.SetVisibility(1)
a.PickableOff()
renderer = vtk.vtkRenderer()
renderer.SetLayer(0)
renderer.AddViewProp(volume)
renderer.GetActiveCamera().ParallelProjectionOn()
renderer.ResetCamera()
renderer1 = vtk.vtkRenderer()
renderer1.SetLayer(1)
renderer1.AddViewProp(a)
renderer1.SetInteractive(0)
renderer1.SetActiveCamera(renderer.GetActiveCamera())
render_window.AddRenderer(renderer1)
render_window.AddRenderer(renderer)
style.SetCurrentRenderer(renderer)
set_view_plane(orientation)
c.SetFocalPoint(renderer.GetActiveCamera().GetFocalPoint())
render_window.Render()
interactor.Initialize()
interactor.Start()
Please I need an answer
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20141204/dd2d19b0/attachment.html>
    
    
More information about the vtkusers
mailing list