<div dir="ltr"><div>Hello all,<br><br></div><div>I am trying to use the Marching Cubes algorithm to show a 3D surface of a 3D image given by a Python (numpy array).<br></div><div>I thought I had it all mapped out, things were going great with arrays of small size (generated and rendered 3D isosurfaces), but now that I'm working with arrays of slightly bigger size, the programm crashes with Python error 11 SIGSEGV which means seg fault. What worries me a bit is that the array I'm using is not that big, 150*150*150, and I have a fairly recent computer who shouldn't have any problem handling it.<br></div><div><br>Code MWE is below (in Python)<br></div><div><br></div><div>=========================================== Code snippet =======================<br></div><div><br>import numpy as np<br>import vtk<br><br># Creating a numpy array representing a 3D image<br>npa=np.zeros((150,150,150)).astype(np.uint8)<br>npa[100:102,100:102,100:102]=255<br><br># Importing it as  object vtk (based on vtk example <a href="http://www.vtk.org/Wiki/VTK/Examples/Python/vtkWithNumpy">http://www.vtk.org/Wiki/VTK/Examples/Python/vtkWithNumpy</a>)<br>dataImporter = vtk.vtkImageImport()<br>dataString = npa.tostring()<br>[hh, ww, dd] = npa.shape<br>dataImporter.CopyImportVoidPointer(dataString, len(dataString))<br>dataImporter.SetDataScalarTypeToUnsignedChar()<br>dataImporter.SetNumberOfScalarComponents(3)<br>dataImporter.SetDataExtent(0, dd - 1, 0, ww - 1, 0, hh - 1)<br>dataImporter.SetWholeExtent(0, dd - 1, 0, ww - 1, 0, hh - 1)<br>dataImporter.Update()<br>vol = dataImporter.GetOutputPort()<br></div># (print(dataImporter.GetOutput().GetClassName()) yields "vtk.ImageData")<br><div><div><br># Use MarchingCubes to generate iso-surface<br>surface = vtk.vtkMarchingCubes();<br>surface.SetInputConnection(vol);<br>surface.ComputeNormalsOn();<br>surface.ComputeScalarsOn();<br>isoValue = 128<br>surface.SetValue(0, isoValue);<br><br></div><div>#This line causes segfault if npa is "too big"<br></div><div>surface.Update();<br><br></div><div># .... rest of pipeline<br># decimator = vtk.vtkDecimatePro(); ....<br># smoother = vtk.vtkSmoothPolyDataFilter(); ....<br># connectivityFilter = vtk.vtkPolyDataConnectivityFilter(); ....<br># mesh = vtk.vtkPolyData(); ....<br># mapper = vtk.vtkPolyDataMapper(); ....<br># actor = vtk.vtkActor(); ....<br><br><div><br></div><div>=========================================== End of code snippet =======================<br></div><br><br><br><div>So I have a couple of questions here :<br></div><div>1/ Is this a problem of input for MarchingCubes being too big ? Or is this segfault indicating something else ?<br></div>- arguments for the former : Reducing the size of npa in this code makes it work<br></div><div>- arguments for the latter : This code I'm showing is a MWE for my code which is more complicated, and in my code, this code portion fails with a large array, but succeeds if I reduce in size *another* array which has nothing to do with MarchingCubes() (again, that other array is not that big, so I don't think I'm reaching the limits of Python memory or anything like that...)<br><br></div><div>2/ Am I doing the whole import numpy thing correctly ? I've based myself on the vtk example, but I am unsure of whether it is the recommended way for my case or if it was case specific<br><br></div><div><br></div><div>Thanks everyone,<br></div><div>Clément<br></div></div></div>