[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