2017-07-30 32 views
1

我试图把一个或三个通道的2D图像,并使用vtkImageActor在VTK中显示它们。据我所知,要显示的当前帧可通过调用SetImageDatavtkImageActor并提供vtkImageData的实例来更新。numpy uint8_t数组到vtkImageData

我已经设置了我的visualiser,如下所示。但是,我不确定如何从numpy数组构建vtkImageData对象(这将在updateFrames方法中进行)。我numpy阵列的类型是np.uint8_t

我使用VTK8.0,Python的3.6和numpy的1.13.1

class VTKStreamVisualiser: 
    def __init__(self, displayRGB): 
     self.__displayRGB = displayRGB 
     self.__started = False 

     #Setup window. 
     self.__renderWindow = vtk.vtkRenderWindow() 
     self.__renderWindowInteractor = vtk.vtkRenderWindowInteractor() 
     self.__renderWindowInteractor.SetRenderWindow(self.__renderWindow) 

     #To store renderers and actors. 
     self.__renderers = [] 
     self.__actors = [] 

     #Initialise to None to check if ready when invoking start() 
     self.__depthImageData = None 
     self.__rgbImageData = None 

     #Determine viewport ranges for depth and setup renderer. 
     xMinDepth = 0.0 
     xMaxDepth = 0.5 if displayRGB else 1.0 
     yMin = 0.0 
     yMax = 1.0 
     self.__setupRenderer(xMinDepth, yMin, xMaxDepth, yMax) 

     #Determine viewport ranges for rgb and setup renderer. 
     if self.__displayRGB: 
      xMinRGB = xMaxDepth 
      xMaxRGB = 2.0 * xMinRGB 
      self.__setupRenderer(xMinRGB, yMin, xMaxRGB, yMax) 

    def __setupRenderer(self, xMin, yMin, xMax, yMax): 
     #Setup renderer. 
     self.__renderers.append(vtk.vtkRenderer()) 
     idx = len(self.__renderers) - 1 
     self.__renderWindow.AddRenderer(self.__renderers[idx]) 
     self.__renderers[idx].SetViewport(xMin, yMin, xMax, yMax) 
     self.__actors.append(vtk.vtkImageActor()) 
     self.__renderers[idx].AddActor(self.__actors[idx]) 
     self.__renderers[idx].ResetCamera() 

    def start(self): 
     self.__depthImageData is None or (self.__rgbImageData is None and self.__displayRGB): 
      return None 

     if self.__started: 
      return 

     self.__renderWindowInteractor.Initialize() 
     self.__renderWindow.Render() 
     self.__renderWindowInteractor.Start() 
     self.__started = True 

    def stop(self): 
     if not self.__started: 
      return 

     self.__renderWindowInteractor.Stop() 
     self.__renderWindow.Finalize() 
     self.__renderWindowInteractor.TerminateApp() 
     self.__started = False 

    def updateFrames(self, depthFrame, rgbFrame=None): 
     #Build vtkImageData here from the given numpy uint8_t arrays. 
     pass 

编辑:我知道我可以手动复制了作为证明here数据,这将不会是坏使用Cython(假设我能够在Cython中使用vtkImageData),但是最好直接使用numpy数组。

回答

0

使用numpy_support库可以numpy的数组转换为VTK数据阵列

from vtk.util import numpy_support 

def updateFrames(self, depthFrame, rgbFrame=None): 
    #Build vtkImageData here from the given numpy uint8_t arrays. 
    self.__depthImageData = vtk.vtkImageData() 
    depthArray = numpy_support.numpy_to_vtk(depthFrame.ravel(), deep=True, array_type=vtk.VTK_UNSIGNED_CHAR) 
    # .transpose(2, 0, 1) may be required depending on numpy array order see - https://github.com/quentan/Test_ImageData/blob/master/TestImageData.py 

    __depthImageData.SetDimensions(depthFrame.shape) 
    #assume 0,0 origin and 1,1 spacing. 
    __depthImageData.SetSpacing([1,1]) 
    __depthImageData.SetOrigin([0,0]) 
    __depthImageData.GetPointData().SetScalars(depthArray) 

应该提供如何产生depthFrame为起点

+0

非常感谢你的工作示例。 –