I used the code below and I wanted to match a 3D stl on an image:
both files are same size but when you open them in two renderer layers they dont match, I tried using pixel sizing to scale but it didnt work either.
#STL file
reader = vtk.vtkSTLReader()
reader.SetFileName(filename1)
reader.Update()
self.transform = vtk.vtkTransform()
#self.transform.Scale(0.25, 0.25, 0.25)
center = vtk.vtkCenterOfMass()
center.SetInputData(reader.GetOutput())
center.SetUseScalarsAsWeights(False)
center.Update()
center_x, center_y, center_z = center.GetCenter()
self.transform.Translate(-center_x, -center_y, -center_z)
self.transformFilter = vtk.vtkTransformPolyDataFilter()
self.transformFilter.SetTransform(self.transform)
self.transformFilter.SetInputConnection(reader.GetOutputPort())
self.transformFilter.Update()
mapper = vtk.vtkPolyDataMapper()
if vtk.VTK_MAJOR_VERSION <= 5:
mapper.SetInput(self.transformFilter.GetOutput())
else:
mapper.SetInputConnection(self.transformFilter.GetOutputPort())
self.actor = vtk.vtkActor()
self.actor.SetMapper(mapper)
#X ray File
readerX = vtk.vtkDICOMImageReader()
readerX.SetDirectoryName(pathDicomDir)
readerX.Update()
image_data = readerX.GetOutput()
reslice = vtk.vtkImageReslice()
reslice.SetInputConnection(readerX.GetOutputPort())
# Create a greyscale lookup table
table = vtk.vtkLookupTable()
table.SetRange(0, 3000) # image intensity range
table.SetValueRange(0, 1) # from black to white
table.SetSaturationRange(0.0, 0.0) # no color saturation
table.SetRampToLinear()
table.Build()
# Map the image through the lookup table
color = vtk.vtkImageMapToColors()
color.SetLookupTable(table)
color.SetInputConnection(reslice.GetOutputPort())
# Create an image actor to display the image
actorX = vtk.vtkImageActor()
actorX.GetMapper().SetInputConnection(color.GetOutputPort())
self.background_renderer = vtk.vtkRenderer()
self.scene_renderer = vtk.vtkRenderer()
self.background_renderer.SetLayer(0)
self.background_renderer.InteractiveOff()
self.scene_renderer.SetLayer(1)
origin = image_data.GetOrigin()
spacing = image_data.GetSpacing()
extent = image_data.GetExtent()
camera = self.background_renderer.GetActiveCamera()
camera.ParallelProjectionOn()
xc = origin[0] + 0.5*(extent[0] + extent[1]) * spacing[0]
yc = origin[1] + 0.5*(extent[2] + extent[3]) * spacing[1]
xd = (extent[1] - extent[0] + 1) * spacing[0]
yd = (extent[3] - extent[2] + 1) * spacing[1]
d = camera.GetDistance()
camera.SetParallelScale(0.5 * yd)
camera.SetFocalPoint(xc, yc, 0.0)
camera.SetPosition(xc, yc, d)
self.vtkwidget = QVTKRenderWindowInteractor(self.centralwidget)
self.gridLayout.addWidget(self.vtkwidget, 0, 0, 1, 1)
self.vtkwidget.GetRenderWindow().AddRenderer(self.background_renderer)
self.vtkwidget.GetRenderWindow().AddRenderer(self.scene_renderer)
self.vtkwidget.GetRenderWindow().SetNumberOfLayers(2)
self.iren = self.vtkwidget.GetRenderWindow().GetInteractor()
self.iren.SetInteractorStyle(vtk.vtkInteractorStyleTrackballActor())
self.background_renderer.AddActor(actorX)
#self.scene_renderer.AddActor(self.actor)
self.iren.Start()
stl file become too big that didnt let me give you a perfect photo. Is it camera problem or scaling?