查找 vtkImageData 来源和大小
Find vtkImageData origin and size
我有一个带有 3 个视口(3 个 vtkRenderer)的应用程序。在他们每个人之上,我都有一个 vtkImageReslice。这些vtkImageReslice可以缩放、移动、旋转等
我接到一个任务,要在每个 vtkImageReslice 上画一条线(vtkLine 或其他东西)...我怎么知道每个 vtkRenderer 上 vtkImageReslice 的来源和大小?
了解 vtkRenderer 的来源和大小非常简单:
int* pOrigin = m_pRenderer->GetOrigin();
int* pSize = m_pRenderer->GetSize();
TRACE("Origin: %d.%d, Size: %d.%d\n", pOrigin[0], pOrigin[1], pSize[0], pSize[1]);
在 m_pRenderer 上我有一个 m_pReslice (vtkImageReslice) ...我怎么知道 m_pReslice 的来源和大小以在其上画一条线?
我感谢每一个提示、建议,任何事情...
[稍后编辑]
我觉得我描述的不是很好,所以我post这里放一张图:
我唯一需要知道的是来自特定渲染器的图像数据的来源和大小……该图片可以移动、旋转、缩放等。
[更晚编辑]
我附上另一张图片来说明我正在尝试做的事情:
当我对vtiImageActor进行缩放时,水平绿线必须变宽:
嗯,在我的学位论文中,我做了一个医学应用程序来切片图像和许多其他东西,其中包括在 vtk 图像演员上切片和画线。
我是在 python 做的,我会在这里放一段代码,也许对你有帮助。这段代码确实切片并在切片上画了一条线,当然还有很多class属性,但我希望通过这段代码你能理解本质。
self.renderXZ = vtk.vtkRenderer()
self.renderXZ.SetBackground(0,0,0)
self.interactorStyleXZ = vtk.vtkInteractorStyleImage()
self.xz.GetRenderWindow().AddRenderer(self.renderXZ)
self.xz.SetInteractorStyle(self.interactorStyleXZ)
#creating image actor
self.imageActorXZ = vtk.vtkImageActor()
self.imageActorXZ.SetDisplayExtent(self.imageXZ.GetWholeExtent())
#getting the dimensions
xMin, xMax, yMin, yMax, zMin, zMax = self.image.GetWholeExtent()
#changing slice
self.changeSliceXZ(yMax/2)
slice = self.imageActorXZ.GetSliceNumber()
max = self.imageActorXZ.GetWholeZMax()
self.renderXZ.AddActor(self.imageActorXZ)
self.xz.GetRenderWindow().SetSize(522,243)
XZ_XSize,XZ_YSize = self.renderXZ.GetSize()
#drawing a Line
rectMapper = self.drawLine(0, XZ_YSize/2, XZ_XSize, XZ_YSize/2)
self.HorizontalLineActorXZ = vtk.vtkActor2D()
self.HorizontalLineActorXZ.SetMapper(rectMapper)
self.renderXZ.AddActor2D(self.HorizontalLineActorXZ)
#and the changeSliceXZ function is this
def changeSliceXZ(self,sliceNumber):
slicer = vtkImageSlicer()
slicer.SetInput(self.image)
#putting the direction of the slice
slicer.SetSliceDirection(1)
slicer.SetSlice(sliceNumber)
slicer.Update()
self.imageXZ = slicer.GetOutput()
self.imageActorXZ.SetInput(self.imageXZ)
self.xz.GetRenderWindow().Render()
self.YSlice = sliceNumber
self.SliceNumber[1] = sliceNumber
您可能会考虑小部件。有很多VTK Widgets
例如ImagePlaneWidget 管道
vtkImagePlaneWidget myWidget = vtkImagePlaneWidget.New();
myWidget.SetInput(myDicomImageReader.GetOutput());
myWidget.SetPlaneOrientationToYAxes();
myWidget.SetSliceIndex(mySliceIndexNumber);
myWidget.SetInteractor(myInteractor);
myWidget.GetPlaneProperty().SetColor(1.0,0.0,0.0);
vtkOutlineFilter outlineFilter = vtkOutlineFilter.New();
outlineFilter.SetInputConnection(myDicomImageReader.GetOutputPort());
vtkPolyDataMapper mapper = vtkPolyDataMapper.New();
mapper.SetInputConnection(outlineFilter.GetOutputPort();
vtkActor actor = vtkActor.New();
actor.SetMapper(mapper);
myImageViewer.GetRenderer().AddActor(actor);
RenderWindow.Render();
myWidget.On();
我有一个带有 3 个视口(3 个 vtkRenderer)的应用程序。在他们每个人之上,我都有一个 vtkImageReslice。这些vtkImageReslice可以缩放、移动、旋转等
我接到一个任务,要在每个 vtkImageReslice 上画一条线(vtkLine 或其他东西)...我怎么知道每个 vtkRenderer 上 vtkImageReslice 的来源和大小?
了解 vtkRenderer 的来源和大小非常简单:
int* pOrigin = m_pRenderer->GetOrigin();
int* pSize = m_pRenderer->GetSize();
TRACE("Origin: %d.%d, Size: %d.%d\n", pOrigin[0], pOrigin[1], pSize[0], pSize[1]);
在 m_pRenderer 上我有一个 m_pReslice (vtkImageReslice) ...我怎么知道 m_pReslice 的来源和大小以在其上画一条线?
我感谢每一个提示、建议,任何事情...
[稍后编辑] 我觉得我描述的不是很好,所以我post这里放一张图:
[更晚编辑] 我附上另一张图片来说明我正在尝试做的事情:
当我对vtiImageActor进行缩放时,水平绿线必须变宽:
嗯,在我的学位论文中,我做了一个医学应用程序来切片图像和许多其他东西,其中包括在 vtk 图像演员上切片和画线。 我是在 python 做的,我会在这里放一段代码,也许对你有帮助。这段代码确实切片并在切片上画了一条线,当然还有很多class属性,但我希望通过这段代码你能理解本质。
self.renderXZ = vtk.vtkRenderer()
self.renderXZ.SetBackground(0,0,0)
self.interactorStyleXZ = vtk.vtkInteractorStyleImage()
self.xz.GetRenderWindow().AddRenderer(self.renderXZ)
self.xz.SetInteractorStyle(self.interactorStyleXZ)
#creating image actor
self.imageActorXZ = vtk.vtkImageActor()
self.imageActorXZ.SetDisplayExtent(self.imageXZ.GetWholeExtent())
#getting the dimensions
xMin, xMax, yMin, yMax, zMin, zMax = self.image.GetWholeExtent()
#changing slice
self.changeSliceXZ(yMax/2)
slice = self.imageActorXZ.GetSliceNumber()
max = self.imageActorXZ.GetWholeZMax()
self.renderXZ.AddActor(self.imageActorXZ)
self.xz.GetRenderWindow().SetSize(522,243)
XZ_XSize,XZ_YSize = self.renderXZ.GetSize()
#drawing a Line
rectMapper = self.drawLine(0, XZ_YSize/2, XZ_XSize, XZ_YSize/2)
self.HorizontalLineActorXZ = vtk.vtkActor2D()
self.HorizontalLineActorXZ.SetMapper(rectMapper)
self.renderXZ.AddActor2D(self.HorizontalLineActorXZ)
#and the changeSliceXZ function is this
def changeSliceXZ(self,sliceNumber):
slicer = vtkImageSlicer()
slicer.SetInput(self.image)
#putting the direction of the slice
slicer.SetSliceDirection(1)
slicer.SetSlice(sliceNumber)
slicer.Update()
self.imageXZ = slicer.GetOutput()
self.imageActorXZ.SetInput(self.imageXZ)
self.xz.GetRenderWindow().Render()
self.YSlice = sliceNumber
self.SliceNumber[1] = sliceNumber
您可能会考虑小部件。有很多VTK Widgets
例如ImagePlaneWidget 管道
vtkImagePlaneWidget myWidget = vtkImagePlaneWidget.New();
myWidget.SetInput(myDicomImageReader.GetOutput());
myWidget.SetPlaneOrientationToYAxes();
myWidget.SetSliceIndex(mySliceIndexNumber);
myWidget.SetInteractor(myInteractor);
myWidget.GetPlaneProperty().SetColor(1.0,0.0,0.0);
vtkOutlineFilter outlineFilter = vtkOutlineFilter.New();
outlineFilter.SetInputConnection(myDicomImageReader.GetOutputPort());
vtkPolyDataMapper mapper = vtkPolyDataMapper.New();
mapper.SetInputConnection(outlineFilter.GetOutputPort();
vtkActor actor = vtkActor.New();
actor.SetMapper(mapper);
myImageViewer.GetRenderer().AddActor(actor);
RenderWindow.Render();
myWidget.On();