2017-07-30 33 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

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