Vtk_showを使用してvtkウィンドウを開こうとしていますが、これを行うたびにIpythonコンソールがクラッシュします。これは、Ipythonが外部ウィンドウを表示できないためです。これはvtk_showとまったく同じです。私はグーグルで解決策を検索しましたが、それはpython2用に書かれています(私はpython 3.6.3を使用しています)。これが私が見つけた解決策です:
import vtk
from IPython.display import Image
def vtk_show(renderer, width=400, height=300):
"""
Takes vtkRenderer instance and returns an IPython Image with the
rendering.
"""
renderWindow = vtk.vtkRenderWindow()
renderWindow.SetOffScreenRendering(1)
renderWindow.AddRenderer(renderer)
renderWindow.SetSize(width, height)
renderWindow.Render()
windowToImageFilter = vtk.vtkWindowToImageFilter()
windowToImageFilter.SetInput(renderWindow)
windowToImageFilter.Update()
writer = vtk.vtkPNGWriter()
writer.SetWriteToMemory(1)
writer.SetInputConnection(windowToImageFilter.GetOutputPort())
writer.Write()
data = str(buffer(writer.GetResult()))
return Image(data)
Python2のbuffer
組み込み関数を使用しようとするとエラーが発生しますが、この関数はpython3 +に存在しないため、行き詰まります。誰かがこれを手伝ってくれるとしたら、とても感謝している。前もって感謝します!
Python 3 :)と同じ動作をするように、少なくともこれら2つのポイントをコードで変更する必要があります。
buffer(...)
組み込み関数は、Python 3:-のmemoryview(...)
に置き換えられました。 Pythonバッファタイプは何ですか? 。buffer
呼び出しをmemoryview
に置き換えます。str(...)
組み込み関数は、bytes
オブジェクトを取得するためにbytes(...)
呼び出しに置き換える必要があります: https://docs.python.org/ 2/howto/pyporting.html#text-versus-binary-dataしたがって、data = ...
行は次のようになります:
data = bytes(memoryview(writer.GetResult()))
明確にするために、この例は非常に VTKのマーチングキューブアルゴリズムを使用して医用画像から表面を抽出する方法を示す有益なブログの例 を適応させたものだと思います。 付属のJupyterノートブック はPython 2.7を対象としており、前述のようにPython 3.6 +、data=...
部分を変更する必要があります。
import vtk
from IPython.display import Image
def vtk_show(renderer, width=400, height=300):
"""
Takes vtkRenderer instance and returns an IPython Image with the
rendering.
"""
renderWindow = vtk.vtkRenderWindow()
renderWindow.SetOffScreenRendering(1)
renderWindow.AddRenderer(renderer)
renderWindow.SetSize(width, height)
renderWindow.Render()
windowToImageFilter = vtk.vtkWindowToImageFilter()
windowToImageFilter.SetInput(renderWindow)
windowToImageFilter.Update()
writer = vtk.vtkPNGWriter()
writer.SetWriteToMemory(1)
writer.SetInputConnection(windowToImageFilter.GetOutputPort())
writer.Write()
data = memoryview(writer.GetResults()).tobytes()
return Image(data)
ソリューションのクレジットは間違いなく@MafiaSkafiaと@jcgiretにありますが、完全で最終的なソリューションを投稿したいと思いました。